PDF を結合・分割する方法 (1 つにまとめる / 切り出す)
複数の PDF を 1 つに結合する手順と、1 つの PDF を任意のページ範囲で分割する手順をまとめて解説。pdf-lib による無劣化結合の仕組みも紹介します。
紙の書類を 1 冊にまとめたい、逆に切り出したい
PDF を扱うときに最も多い 2 つの操作が、複数のファイルを 1 冊にまとめる結合と、1 冊から特定のページだけ取り出す分割です。経費精算では領収書のスキャン PDF をまとめて 1 枚提出することが求められ、契約書には本文 PDF + 別紙 + 約款 + 委任状を 1 ファイルにまとめて送るフォーマットが要求されます。逆に分割側は、数百ページの請求書 PDF から特定の取引先分だけ抜き出す、機密ページを取り除いた配布用バージョンを作る、章ごとに分けてメンバーに割り振る、といった使い方になります。
問題はこの操作を「とりあえず Acrobat か Web サービス」で済ませると、契約書 / 請求書 / 給与明細など機密度の高いファイルがそのまま外部サーバーにコピーされる点です。本文サイズが大きくないので「ちょっとサーバーに上げて結合するだけ」と思いがちですが、扱っているデータの機微性は圧縮よりむしろ高い (中身を全部読んでまとめている) ことが多く、ブラウザ内で完結させる動機はかなり強くなります。
ブラウザだけで結合・分割する手順
結合は pdf-merge を開いて PDF をまとめてドラッグ & ドロップします。読み込み後にサムネイル付きのカードが並ぶので、ドラッグで順番を入れ替えて「結合」を押すだけです。出力 PDF の名前は自動で付きますが、後からダウンロード時に変更できます。複数 PDF の同時投入と並び替えがこのツールの中核機能で、「契約書本文 → 別紙 1 → 別紙 2 → 約款」のような順序を画面上で組み立てられます。
分割は pdf-split を開いて 1 つの PDF を読み込み、3 つのモードのどれかを選びます: ページ範囲指定 (1-5, 8, 12-15 のようなカンマ区切り表記)、N ページごとの均等分割、全ページを 1 枚ずつ別ファイル化する完全展開。ページ範囲表記は人間が読みやすく書ける形式で、1-5 (1〜5 ページ目)、8 (8 ページ目だけ)、12-15 (12〜15 ページ目) を 1 つの式で混在させられます。生成された各パートは個別ダウンロードも一括 ZIP もどちらも可能です。
どちらのツールも、DevTools の Network タブを開いたまま結合・分割しても、初回スクリプト取得以外の HTTP リクエストは流れません。終わった後にダウンロードしたサイズが気になるなら pdf-compress に通せます。
pdf-lib による無劣化コピーの仕組み
両ツールの中核は pdf-lib の PDFDocument.load() と copyPages() です。PDFDocument.create() で新しい空の PDF を作り、元 PDF からページオブジェクトの参照をそのままコピーします。ここで重要なのは「ラスタライズも再エンコードもしていない」ことで、元 PDF が抱えていたフォントの埋め込み、ベクター図形、画像ストリーム、ハイパーリンク、しおりは元の形式のまま新 PDF にぶら下がります。圧縮ツールと違ってサイズはほぼ加算 (結合) / ほぼ均等分割 (分割) になりますが、その代わり文字エッジのにじみや図形の粗さは一切発生しません。
PDF の暗号化フラグが立っているファイルは、PDFDocument.load(bytes, { ignoreEncryption: true }) でメタデータだけ読み込めますが、復号鍵を持っていないので本文ストリームを書き出すと真っ白なページになります。そのため pdf-merge / pdf-split は読み込み時点で暗号化を検知し、pdf-unlock への動線をエラーボックスに出すように作っています。パスワードを解いてから結合・分割に戻す、というのが正しい順序です。メタデータ (作成者・タイトル・作成日時) は新 PDF にもそのまま残るので、機密の作成者情報を消したい場合は pdf-meta-strip を後段に挟みます。
アップロード型結合サービスとの構造差
「PDF merge」「PDF split」で検索すると、ブラウザでファイルを選んでサーバーへ送るタイプのサービスが大量に並びます。インターフェースは pdf-merge / pdf-split とほとんど見分けがつかない一方、結合対象が契約書・請求書・健康診断結果・社内資料となれば、それを一度外部サーバーに送信するという事実そのものが情報漏洩経路になります。多くのサービスの利用規約には「アップロードしたファイルに対して非独占的なライセンスを許諾する」「処理目的に限り無償で利用できる」旨の条項が含まれており、削除要求を出しても CDN キャッシュやログに残った断片までは追跡できません。
ブラウザ内処理にはそもそもファイルを送信するコードパスが存在しません。pdf-merge / pdf-split は pdf-lib と File API、Blob URL だけで構成されていて、ソースは GitHub で監査できます。DevTools の Network タブで通信が出ていないことを自分の目で確認できる状態は、プライバシーポリシーに署名するタイプの「信用してください」とは性質の違う保証です。日常的に契約書や請求書を扱うフローでは、こちらの保証を毎回支払うコストは低く、習慣にする価値があります。