複数のPDFを1つにまとめたい、逆に1つのPDFをページごとにバラしたい——書類の提出やスキャンの整理で地味によくある作業です。この記事では、
- コードで処理する方法(JavaScript / Python)
- コードを書かずにブラウザだけで結合・分割する方法
の両方を、そのまま使える形でまとめます。
この記事のゴール:PDFを結合、または分割(1ページずつ/ページ範囲で)できるようになること。
方法1:JavaScriptで処理する(pdf-lib)
pdf-lib は、ブラウザでもNode.jsでも動く定番ライブラリです。
npm install pdf-lib
結合する
import { PDFDocument } from "pdf-lib";
import fs from "node:fs/promises";
const merged = await PDFDocument.create();
for (const path of ["a.pdf", "b.pdf"]) {
const bytes = await fs.readFile(path);
const doc = await PDFDocument.load(bytes);
const pages = await merged.copyPages(doc, doc.getPageIndices());
pages.forEach((p) => merged.addPage(p));
}
await fs.writeFile("merged.pdf", await merged.save());
ポイントは copyPages → addPage。読み込んだPDFのページをコピーして、新しいドキュメントに順番に足していきます。
分割する(1ページずつ)
const src = await PDFDocument.load(await fs.readFile("input.pdf"));
for (let i = 0; i < src.getPageCount(); i++) {
const out = await PDFDocument.create();
const [page] = await out.copyPages(src, [i]);
out.addPage(page);
await fs.writeFile(`page_${i + 1}.pdf`, await out.save());
}
分割する(ページ範囲で)
copyPages に渡すインデックス配列を変えるだけです(0始まりに注意)。
// 例:1〜3ページ目だけを取り出す
const out = await PDFDocument.create();
const pages = await out.copyPages(src, [0, 1, 2]);
pages.forEach((p) => out.addPage(p));
await fs.writeFile("1-3.pdf", await out.save());
ブラウザで動かす場合は、
fs.readFileの代わりに<input type="file">のfile.arrayBuffer()を使い、保存はBlob+ ダウンロードリンクにします。アップロード不要でクライアント側だけで完結します。
方法2:Pythonで処理する(pypdf)
pip install pypdf
結合する
from pypdf import PdfWriter
writer = PdfWriter()
for path in ["a.pdf", "b.pdf"]:
writer.append(path) # ファイル内の全ページを追加
with open("merged.pdf", "wb") as f:
writer.write(f)
writer.close()
分割する(1ページずつ)
from pypdf import PdfReader, PdfWriter
reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
with open(f"page_{i + 1}.pdf", "wb") as f:
writer.write(f)
分割する(ページ範囲で)
reader = PdfReader("input.pdf")
writer = PdfWriter()
for i in range(0, 3): # 1〜3ページ目(0始まり)
writer.add_page(reader.pages[i])
with open("1-3.pdf", "wb") as f:
writer.write(f)
方法3:コードを書かずに、ブラウザだけで(結合・分割)
「1回だけやりたい」「PDFをどこかにアップロードしたくない」なら、ブラウザで完結するツールが速くて安全です。
私が作っている Morphy のPDF結合・分割なら、
- 結合:複数PDFを選んで並び替え → 1つにまとめてダウンロード
- 分割:1つのPDFを「1ページずつ」または「ページ範囲(例: 1-3, 5, 8-10)」で分割
- 分割した複数PDFはまとめてZIP保存もできる
- 処理はすべてブラウザ内で完結し、ファイルは外部に送信されません(社内資料でも安心)
登録不要・無料です。オンラインのPDFツールは多くが「サーバーにアップロード」する方式ですが、こちらはアップロード自体が発生しません。
👉 PDF結合・分割ツール:https://morphytools.com/pdf-merge.html
補足:つまずきやすいポイント
-
ページ番号は0始まり:
copyPages(src, [0])やreader.pages[0]が「1ページ目」です。 -
パスワード付きPDF:多くのライブラリはそのままだと読めません。先に解除してから処理してください(pdf-libは
PDFDocument.load(bytes, { ignoreEncryption: true })で読める場合があります)。 - 大きいPDF:ページ数・画像が多いと、メモリと時間を使います。ブラウザ処理なら端末スペックにも依存します。
まとめ
| 状況 | おすすめ |
|---|---|
| バッチ処理・自動化に組み込む | JavaScript(pdf-lib)/ Python(pypdf) |
| サーバーサイドの帳票結合など | Python(pypdf) |
| 1回だけ・手元でサッと・アップロードしたくない | ブラウザ完結の無料ツール |
用途に合わせて使い分けてください。特に「今すぐ1回だけ」「社内PDFを外に出したくない」なら、ブラウザ内で完結するツールが手軽で安心です。
この記事が、PDFの結合・分割の手間を少しでも減らせたら嬉しいです。