0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PDFを結合・分割する方法まとめ(JavaScript / Python / コード不要の無料ツール)

0
Last updated at Posted at 2026-08-31

複数の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の結合・分割の手間を少しでも減らせたら嬉しいです。


0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?