- 技術 💻
PDFを結合する方法|Windows・Mac・スマホ別と無料ツール5種の実測
結論
PDFの結合は、Mac ならプレビューか Finder の「PDFを作成」、Windows なら PDFsam Basic か Python(pypdf)、Linux なら qpdf の1行で、ファイルを外に出さずにできます。機密を含まない書類なら、ブラウザで使える Adobe Acrobat のオンラインツールも選べます。
この記事でわかること
- Windows・Mac・スマホ・Linux 別の、いちばん早い結合の手順
- qpdf・pdfunite・pdftk・Ghostscript・pypdf で、しおり・リンク・フォームが残るかの実測
- パスワード付き・壊れたPDFのエラー原文と、症状→原因→直し方の表
PDFの結合は「どの端末で」「その書類を外に出してよいか」の2つで方法が決まります。迷ったら次の図の順にたどります。
flowchart TD
A[PDFをまとめる] --> B{機密を含む?}
B -->|含まない| O[オンライン可]
B -->|含む| C{端末}
C -->|Mac| M[プレビュー<br>Finder]
C -->|Win等| W[PDFsam<br>qpdf<br>pypdf]
C -->|スマホ| S[PCで結合]
やりたいことごとに、いちばん早い方法を先にまとめます。
| やりたいこと | いちばん早い方法 | 詳しい節 |
|---|---|---|
| Mac でPDFを結合したい | Finder でファイルを選んで、Control キーを押しながらクリック→クイックアクション→PDFを作成 | MacでPDFを結合する |
| Windows でPDFを結合したい(無料) | PDFsam Basic の Merge にファイルを入れる。Python があれば pypdf の数行 | WindowsでPDFを結合する |
| スマホでPDFを結合したい | 機密でなければブラウザで Acrobat のオンラインツール。機密ならPCで行う | スマホでPDFを結合する |
| PDF結合を無料で安全にしたい | 端末の中で完結する方法(プレビュー・PDFsam・qpdf・pypdf)を使う | オンラインのPDF結合は安全か |
| コマンドで結合したい | qpdf --empty --pages a.pdf b.pdf -- out.pdf |
コマンド1行でPDFを結合する |
| しおり・フォームを残したい | pypdf か pdftk。qpdf は先頭のファイルのしおりだけ残る | しおり・リンク・フォームは残るか |
| ページの順番がおかしい | ファイル名を 01・02 と0埋めするか、自然順に並べ替えてから渡す | ページの順番・範囲指定 |
| パスワード付きPDFを結合したい | パスワードを指定して開いてから結合し、必要なら結合後に付け直す | パスワード付きPDFを結合する |
| 結合できない・エラーが出る | エラー文で「パスワード」「壊れている」「PDFではない」を見分ける | うまくいかないとき |
確認環境:Ubuntu 24.04.5 LTS(2 CPU・メモリ 8GB)の上で、reportlab 5.0.1 で見本のPDFを自作しました。見積書(A4・3ページ・しおり3件・3ページ目への内部リンクと外部リンクの注釈)、申込書(A4縦と横の2ページ・入力欄2つ・しおり2件)、写真(画像入り1ページ・約400KB)、10ページのPDF 100本、パスワード付き(AES-256)、途中で切れたPDF、相互参照表の壊れたPDF、PDFではないファイルです。これらを qpdf 11.9.0、pdfunite(poppler 24.02.0)、pdftk-java 3.3.3、Ghostscript 10.02.1(apt-get download した .deb を作業場所に展開して実行)、pypdf 6.17.0(Python 3.13.18)で結合し、ページ数・しおり・リンク先・入力欄・文字の取り出しを pypdf と qpdf で調べ、時間とメモリを3回ずつ測りました。Mac のプレビューと Finder は Apple サポート、Windows の Edge の PDF 機能は Microsoft Learn、Acrobat のオンラインツールは Adobe の公式ページ、PDFsam Basic は公式サイト、各ツールの書式は qpdf と pypdf の公式ドキュメントで確かめました。Windows・Mac・スマホの実機の操作は行っていません。オンラインのサービスにはファイルを上げていません(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PDFを結合する方法|Windows・Mac・スマホ別と無料ツール5種の実測」
PDFを結合する方法の選び方(端末・機密・ページ数)
この節では、自分の状況でどのPDF結合の方法を選べばよいかが分かります。
最初に決めるのは「その書類を自分の端末の外に出してよいか」です。 見積書・契約書・履歴書・健康診断の結果など、社外に出せない書類は、端末の中で結合できる方法を選びます。そのうえで、使っている端末と、ページ数やしおりの要否で絞ります。
Mac
標準のプレビューと Finder の「PDFを作成」で結合できる。追加のアプリは要らない。
端末の中で完結
Windows
Edge のPDF機能に結合は無い。PDFsam Basic(無料・オフライン)か Python の pypdf を使う。
入れるのは1つだけ
Linux・サーバー
qpdf の1行がいちばん速かった(1,000ページで0.17秒)。自動化は pypdf。
大量・定期の結合
スマホ
機密でない書類ならブラウザで Acrobat のオンラインツール。機密ならPCに移して結合する。
上げる前に中身を確認
判断表:どの方法を選ぶか
| 状況 | 選ぶ方法 | 理由 |
|---|---|---|
| Mac で数ファイルをまとめる | Finder の「PDFを作成」 | 選んだ順にページが並び、名前も自動で付く |
| Mac で一部のページだけ差し込む | プレビューのサムネール | ページ単位でドラッグして位置を決められる |
| Windows で機密の書類をまとめる | PDFsam Basic | オフラインで動き、しおり・入力欄の扱いを選べる |
| 毎月の請求書を自動でまとめる | Python(pypdf)か qpdf | スクリプトにでき、ページ数の確認も入れられる |
| しおりと入力欄を全部残したい | pypdf・pdftk・PDFsam Basic | 手元の実測で両方が残ったのは pypdf と pdftk |
| 機密でない資料をすぐまとめたい | Acrobat のオンラインツール | インストール不要。100ファイル・1,500ページまで |
| 容量も小さくしたい | 結合のあとに圧縮を別に行う | 結合だけでは容量はほぼ「合計」のまま |
MacでPDFを結合する(プレビュー・Finderのクイックアクション)
この節では、Mac の標準機能だけでPDFを結合する2つの手順が分かります(Apple サポートで確かめた範囲です)。
方法1:Finder の「PDFを作成」でまとめる(ファイル単位)
Apple サポートの「MacでファイルをPDFに結合する」に載っている方法です。ページは、ファイルを選択した順に並びます。
Finder でファイルを選ぶ
Dock の Finder アイコンからウインドウを開き、結合したいファイルを、並べたい順にクリックして選ぶ(デスクトップ上でも選べる)。
Control キーを押しながらクリック
選んだファイルの上で Control キーを押しながらクリックし、「クイックアクション」→「PDFを作成」を選ぶ。
できたPDFを確かめる
新しいPDFの名前は、最初に選んだファイルの名前をもとに自動で付く。開いてページの順番を確かめる。
Finder のプレビューパネルが表示されていれば、ファイルを選んでパネル下部の「PDFを作成」ボタンでも同じことができます。パネルが無いときは、メニューバーの「表示」→「プレビューを表示」で出します。
方法2:プレビューのサムネールでページ単位に差し込む
Apple サポートの「Macの『プレビュー』でPDFを結合する」の手順です。一部のページだけ別のPDFに入れたいときに向きます。
- 結合したいPDFをプレビューで開きます。
- 開いている各PDFで、メニューバーの「表示」→「サムネール」を選び、サイドバーにページを並べます。
- 追加したいサムネールを、一方のPDFのサイドバーからもう一方のサイドバーへドラッグします。離れたページは Command キーを押しながらクリックして選びます。
- 末尾にも途中にも入れられ、サムネールのドラッグで並べ替えもできます。PDF全体を足すときは、Finder からPDFのアイコンをサイドバーへドラッグします。
注意:プレビューでの変更は自動で保存されます。 元のPDFを残したいときは、先に「ファイル」→「複製」でコピーを作ってから作業します(Apple サポートにも同じ注意があります)。
WindowsでPDFを結合する(標準機能が無いときの3通り)
この節では、Windows でPDFを結合するときに選べる方法と、それぞれの向き不向きが分かります。
Microsoft Learn の「PDF reader in Microsoft Edge」に載っている Edge のPDF機能は、表示・印刷・フォームの入力・手書き・ハイライト・メモ・読み上げなどで、PDF同士を結合する機能は一覧にありません(2026年10月29日時点)。そのため、次の3つから選びます。
1PDFsam Basic(画面で操作)
公式サイトによると、オープンソース(AGPL)で Windows・macOS・Linux に対応し、オフラインで動くためファイルは外に出ない。結合ではページ範囲(1-10, 14, 25- の形)、しおりの扱い(まとめる・捨てる・ファイルごとに1件作る)、入力欄の扱い(捨てる・まとめる・名前がぶつかるものを改名してまとめる)、先頭への目次の追加を選べる。
2Python と pypdf(数行のスクリプト)
pypdf は Python だけで動くライブラリで、Windows でも同じコードで動く。python -m pip install pypdf で入れ、後の節のスクリプトを使う。定期的にまとめる作業に向く。
3Acrobat のオンラインツール(ブラウザ)
インストール不要で、Edge・Chrome などのブラウザから使える。ファイルは Adobe のサーバーで処理される。機密でない書類向け。
Acrobat のオンラインツールの手順(Adobe 公式の範囲)
- Adobe の「PDFを結合」のページで「ファイルを選択」を押すか、PDFをドラッグ&ドロップします。複数のファイルをまとめて選べます。
- 足りなければ「ファイルを挿入」のアイコンで追加し、ファイルをドラッグして順番を入れ替えます。
- 「結合」を押し、できたPDFをダウンロードします。
Adobe のページの「よくある質問」では、上限は最大100ファイル・合計1,500ページ・1ファイル500ページ、ファイルは「ログインして保存しない限り削除されます」と書かれています(2026年10月29日時点)。デスクトップ版の Acrobat にも結合の機能があり、Adobe ヘルプの「ファイルを単一の PDF に結合」で案内されていますが、画面の手順は確認環境で確かめられなかったため、この記事では書きません。
Python の環境を分けて入れる方法は、関連記事「Python venvの使い方|作成・有効化コマンド早見表と有効化できない時の直し方」で扱っています。
スマホ(iPhone・Android)でPDFを結合する
この節では、スマホでPDFを結合するときの選び方と注意が分かります。
Adobe の「PDFを結合」のページは、iPhone などのスマホのブラウザでも使えると案内しています。手順はPCと同じで、ファイルを選ぶ→並べ替える→「結合」→ダウンロード、です。
一方、iPhone の「ファイル」アプリや Android の標準アプリで結合する手順は、Apple・Google の公式ヘルプで確かめられませんでした(2026年10月29日時点)。確かめられない手順は書かないため、この記事では扱いません。
スマホのブラウザで結合してよい書類
公開済みのチラシ・案内・カタログ
自分の名前も番号も入っていない資料
会社の規程でクラウド利用が許されている書類
PCに移して手元で結合する書類
見積書・契約書・請求書(取引先の情報)
履歴書・住民票・保険証の写し(個人情報)
社外秘・取引先から預かった資料
オンラインのPDF結合は安全か(無料サービスと機密の判断)
この節では、無料のオンラインサービスでPDFを結合してよいかを、何で判断するかが分かります。
オンラインの結合サービスは、PDFを一度そのサービスのサーバーへ送ります。 暗号化や自動削除をうたうサービスは多いものの、「社外に出した」ことには変わりません。会社の書類なら、まず社内の決まり(外部サービスに上げてよい情報の範囲)を確かめます。
機密を含むPDFをまとめるとき
見分ける問い:「このPDFを、知らない会社にメールで送ってよいか」
オンラインサービスを使う前に見る5点
| 見る点 | 確かめる場所 | 例(Acrobat のオンラインツール) |
|---|---|---|
| 運営している会社 | ページ下部の会社情報 | Adobe |
| ファイルがいつ消えるか | よくある質問・プライバシーポリシー | ログインして保存しない限り削除 |
| 上限(数・ページ・容量) | よくある質問 | 100ファイル・合計1,500ページ |
| 無料の範囲 | 料金ページ | 一部機能はログインや有料版が必要 |
| 会社の決まりとの関係 | 社内の情報管理の規程 | (各社で異なる) |
ブラウザの拡張機能やアプリで結合するときも、処理がどこで行われるか(端末の中か、サーバーか)を説明で確かめます。分からないときは、機密の書類には使いません。
コマンド1行でPDFを結合する(qpdf・pdfunite・pdftk・Ghostscript)
この節では、Linux や Mac のターミナルでPDFを結合するコマンドと、実際の出力が分かります。
同じ3つのファイル(見積書3ページ+申込書2ページ+写真1ページ)を、4つのコマンドで結合しました。どれも6ページのPDFができ、横向きのページ(842×595pt)も横向きのまま残りました。
# qpdf:--empty は「空のPDFを土台にする」の意味。最後の -- のあとが出力先
qpdf --empty --pages a_mitsumori.pdf b_moushikomi.pdf c_shashin.pdf -- out/qpdf.pdf
# pdfunite(poppler-utils):最後の引数が出力先
pdfunite a_mitsumori.pdf b_moushikomi.pdf c_shashin.pdf out/pdfunite.pdf
# pdftk:cat で連結し、output のあとが出力先
pdftk a_mitsumori.pdf b_moushikomi.pdf c_shashin.pdf cat output out/pdftk.pdf
# Ghostscript:中身を描き直して新しいPDFを作る
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out/gs.pdf a_mitsumori.pdf b_moushikomi.pdf c_shashin.pdf
結果はどれも終了コード 0 で、画面には何も出ませんでした。pdfunite と pdftk は、出力先を最後に書くため、引数の順を間違えると既存のPDFを上書きします。 結合の前に、出力先の名前が入力と重なっていないかを見ます。
4つのコマンドの違い
| コマンド | 入れ方(Ubuntu) | やり方 | 向く用途 |
|---|---|---|---|
| qpdf | apt の qpdf | 中身をそのまま写す | 速さ・範囲指定・両面スキャンの並べ替え |
| pdfunite | apt の poppler-utils | 中身をそのまま写す | 単純に並べるだけ |
| pdftk | apt の pdftk(Java 版) | 中身をそのまま写す | しおり・入力欄も残したい |
| Ghostscript | apt の ghostscript | 全ページを描き直す | 描き直しが目的のとき(文字に注意) |
qpdf・pdfunite・pdftk はページの中身をそのまま写すため、見た目は変わりません。Ghostscript は全ページを解釈して描き直すので、後の節のとおり、フォントの扱いで結果が変わります。
PythonでPDFを結合する(pypdf)
この節では、Python の pypdf でPDFを結合する最小のコードと、順番・ページ数の確認まで入れたスクリプトが分かります。
公式ドキュメント(Merging PDF files)の基本の形は、PdfWriter に append で足していくだけです。
from pypdf import PdfWriter
writer = PdfWriter()
for pdf in ["a_mitsumori.pdf", "b_moushikomi.pdf", "c_shashin.pdf"]:
writer.append(pdf)
writer.write("out/pypdf.pdf")
writer.close()
実行すると6ページのPDFができ、次の警告が1行出ました。
Annotation sizes differ: 1 vs. 0
これは pypdf がリンクの注釈を新しいページへつなぎ直すときの警告(pypdf の _link.py)で、手元の見本では内部リンクは正しく3ページ目を指していました。止まる種類のエラーではありません。
順番・しおり・ページ数の確認まで入れたスクリプト
実務では「1, 2, 10 の順にしたい」「どのファイルがどこから始まるか分かるようにしたい」「結合のあとでページ数を確かめたい」が欲しくなります。次のスクリプトは、ファイル名を自然順(数字を数として比べる順)に並べ、ファイルごとにしおりを1件作り、同じ中身の重複を減らし、最後にページ数を照合します。
import re, sys
from pathlib import Path
from pypdf import PdfReader, PdfWriter
def natural_key(p):
return [int(t) if t.isdigit() else t.lower() for t in re.split(r"(\d+)", p.name)]
def main(out, inputs):
files = sorted((Path(x) for x in inputs), key=natural_key)
w = PdfWriter()
expected = 0
for f in files:
r = PdfReader(f)
if r.is_encrypted:
raise SystemExit(f"パスワード付きのため止めます: {f}")
w.append(r, outline_item=f.stem)
expected += len(r.pages)
print(f"追加 {f.name}: {len(r.pages)}ページ")
w.compress_identical_objects(remove_duplicates=True, remove_unreferenced=True)
with open(out, "wb") as fp:
w.write(fp)
got = len(PdfReader(out).pages)
print(f"出力 {out}: {got}ページ(期待 {expected})")
if got != expected:
raise SystemExit("ページ数が合いません")
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2:])
わざと 10.pdf・2.pdf・1.pdf の順で渡して実行した結果です。
$ python3 merge_pdfs.py out/script.pdf many/10.pdf many/2.pdf many/1.pdf
追加 1.pdf: 10ページ
追加 2.pdf: 10ページ
追加 10.pdf: 10ページ
出力 out/script.pdf: 30ページ(期待 30)
できたPDFには、しおりが「1」「2」「10」の3件付きました。パスワード付きのPDFを混ぜると、パスワード付きのため止めます: enc_user.pdf と出て終了コード 1 で止まります。ファイルの一覧の取り方は関連記事「Pythonファイル一覧の取得|globとos.listdir・再帰・拡張子」で、key を使った並べ替えは関連記事「Python sorted・sortのkey指定|複数キー・降順混在のコピペ例」で扱っています。
ページを選んで結合する(pypdf)
w = PdfWriter()
w.append("a_mitsumori.pdf", pages=[2, 0]) # 3ページ目→1ページ目(0から数える)
w.append("b_moushikomi.pdf", pages=[1]) # 2ページ目だけ
w.write("out/r_pypdf.pdf")
結果は「見積書 A-3」「見積書 A-1」「申込書 B-2(横向き)」の順の3ページでした。pypdf のページ番号は0から数える点が、1から数える qpdf・pdftk と違います。
ページの順番・範囲指定・両面スキャンをそろえる
この節では、PDF結合で順番が狂う原因と、ページ範囲・逆順・両面スキャンのまとめ方が分かります。
「1, 10, 100, 11」になる罠
シェルの *.pdf は、ファイル名を文字として並べます。1.pdf〜100.pdf をそのまま渡して結合すると、2番目に入ったファイルは 10.pdf でした。
$ echo *.pdf | cut -c1-60
1.pdf 10.pdf 100.pdf 11.pdf 12.pdf 13.pdf 14.pdf 15.pdf 16.p
$ qpdf --empty --pages many/*.pdf -- out/glob.pdf
(1・11・21・31ページ目の1行目)
['ファイル 1 ページ 1', 'ファイル 10 ページ 1', 'ファイル 100 ページ 1', 'ファイル 11 ページ 1']
直し方は2つです。ファイル名を 001.pdf・002.pdf と0埋めするか、自然順に並べてから渡します。GNU の ls -v や sort -V は数字を数として並べます。
cd many
qpdf --empty --pages $(ls -v *.pdf) -- ../out/sorted.pdf
Mac の Finder の「PDFを作成」は選んだ順、Acrobat のオンラインツールは一覧の順に並びます。どの方法でも、結合のあとに最初と最後のページを開いて確かめるのが確実です。
qpdf のページ範囲の書き方
qpdf の公式ドキュメント(Running qpdf の Page Ranges)で確かめた書き方と、手元の結果です。
| 書き方 | 意味 | 手元の結果(3ページのPDF) |
|---|---|---|
3,1 |
3ページ目→1ページ目 | A-3、A-1 |
z-1 |
最後から先頭へ(逆順)。z は最終ページ | A-3、A-2、A-1 |
1-z,x2 |
全ページから2ページ目を除く(11.7.1 から) | A-1、A-3 |
r1 |
後ろから1ページ目(z と同じ) | A-3 |
1-z:odd |
選んだ並びの奇数番目 | 10ページのPDFで5ページ |
# 見積書の3ページ目と1ページ目、申込書の2ページ目だけで1つにする
qpdf --empty --pages a_mitsumori.pdf 3,1 b_moushikomi.pdf 2 -- out/r_qpdf.pdf
# pdftk では、ファイルに A・B と名前を付けてページを指定する
pdftk A=a_mitsumori.pdf B=b_moushikomi.pdf cat A3 A1 B2 output out/r_pdftk.pdf
どちらも「A-3、A-1、B-2(横向き)」の3ページになりました。Ghostscript にも -sPageList がありますが、-sPageList=3,1 と書くと次のエラーで止まりました。並べ替えには使えません。
GPL Ghostscript 10.02.1: *** Bad PageList: Must be increasing order. ***
**** Unable to open the initial device, quitting.
両面スキャンの表面と裏面を1つにまとめる
片面ずつ読み取るスキャナーで両面の書類を読むと、表面(1・3・5ページ)と裏面(6・4・2ページの逆順)の2つのPDFになります。qpdf の --collate は、2つのファイルから1ページずつ交互に取り出します。
qpdf --collate --empty --pages omote.pdf ura.pdf z-1 -- out/ryomen.pdf
['ファイル 1 ページ 1', 'ファイル 1 ページ 2', 'ファイル 1 ページ 3',
'ファイル 1 ページ 4', 'ファイル 1 ページ 5', 'ファイル 1 ページ 6']
裏面のファイルに z-1(逆順)を付けたことで、1〜6ページが正しい順に並びました。
しおり・リンク・フォームはPDF結合のあとに残るか(5ツールの実測)
この節では、結合したときに、しおり(目次)・ページ内リンク・入力欄・文字がどのツールで残り、どれで消えるかが分かります。
見積書(しおり3件・内部リンク)+申込書(しおり2件・入力欄2つ)+写真を結合し、pypdf と qpdf で中身を調べた結果です。
| ツール | しおり(全5件) | 内部リンク | 入力欄(2つ) | 文字・その他 |
|---|---|---|---|---|
qpdf --empty |
0件 | 3ページ目へ正しく飛ぶ | 残った | そのまま。文書のタイトルは消えた |
| qpdf(先頭を土台) | 見積書の3件だけ | 正しく飛ぶ | 残った | タイトル「見積書」が残った |
| pdfunite | 0件 | 出力に無いページを指していた | 消えた | そのまま |
| pdftk | 5件 | 正しく飛ぶ | 残った | そのまま |
| Ghostscript | 5件 | 正しく飛ぶ | 消えた | 埋め込みの無い日本語の文字が消えた |
| pypdf | 5件 | 正しく飛ぶ | 残った | そのまま(警告1行) |
1qpdf のしおりは「土台」から
qpdf は、しおりなど文書全体の情報を「主の入力」(先頭のファイル)から取る。--empty を土台にすると0件、qpdf a.pdf --pages . b.pdf c.pdf -- out.pdf と見積書を土台にすると見積書の3件が残った。
2pdfunite のリンクは切れていた
見積書の内部リンクの行き先は、出力のページ一覧に含まれない「元のページの写し」を指していた。qpdf --check でも「reported number of objects (41) is not one plus the highest object number (64)」の警告が出た。
3Ghostscript は描き直す
埋め込まれていない日本語フォントの文字は、このマシンに対応するフォントが無く、ページから消えた。フォントを埋め込んだPDFは見た目どおりに残ったが、コピーした文字は「\x01\x02\x03 D-1…」と化けた。
Ghostscript で見積書だけを変換したときの表示です。止まらずに最後まで進み、終了コードは 0 でした。
Warning: the map file cidfmap was not found.
Processing pages 1 through 3.
Page 1
Page 2
Page 3
The following errors were encountered at least once while processing this file:
error executing PDF token
**** This file had errors that were repaired or ignored.
出力の1ページ目の中身は q 0.1 0 0 0.1 0 0 cm Q だけで、文字を描く命令がありませんでした。Ghostscript で結合したら、文字が残っているか、文字をコピーして検索できるかを必ず確かめます。 日本語の書類の結合だけが目的なら、中身をそのまま写す qpdf・pdftk・pypdf のほうが安全です。
同じ書類を2回結合したときの入力欄の名前
同じ申込書を2つ結合すると、入力欄の名前「shimei」「doui」がぶつかります。ツールごとに扱いが分かれました。
| ツール | 結合後の入力欄の名前 | 起きること |
|---|---|---|
| qpdf | shimei、doui、shimei+1、doui+1 | 2つ目を自動で改名 |
| pdftk | 1.shimei、1.doui などの階層 | 名前の頭に番号が付く |
| pypdf(そのまま) | 同じ名前の欄が2つずつ | 名前で値を読むと2件にしか見えない |
pypdf+add_form_topname |
mousikomi1.shimei、mousikomi2.shimei など | ファイルごとに区別できる |
pypdf の公式ドキュメントも、同じ名前の欄はデータの読み出しを妨げることがあり、追加の前に reader.add_form_topname("form1") を呼ぶとよい、と書いています。
w = PdfWriter()
for name in ["mousikomi1", "mousikomi2"]:
r = PdfReader("b_moushikomi.pdf")
r.add_form_topname(name)
w.append(r)
w.write("out/bb_topname.pdf")
PDF結合の容量と時間の実測(100ファイル・1,000ページ)
この節では、結合でファイルの容量がどう変わるか、何ページまでなら何秒で終わるかが分かります。
10ページのPDFを100本(合計1,000ページ・670,266バイト)結合し、時間と最大メモリを3回ずつ測りました。表は3回の中央値です。
| ツール | 時間 | 最大メモリ | 出力の容量 | ページ数 |
|---|---|---|---|---|
| qpdf | 0.17秒 | 30MB | 550,474バイト | 1,000 |
| pdfunite | 0.17秒 | 19MB | 676,980バイト | 1,000 |
| pdftk | 1.71秒 | 80MB | 612,592バイト | 1,000 |
| pypdf | 0.78秒 | 52MB | 600,706バイト | 1,000 |
| Ghostscript | 2.13秒 | 36MB | 315,052バイト(文字が消えた) | 1,000 |
Ghostscript の出力が小さいのは、前の節のとおり埋め込みの無い日本語の文字が消えたためで、圧縮がよく効いたわけではありません。pdftk は Java の起動に時間がかかり、3ファイルの結合でも0.45秒かかりました。
容量は「足し算」のまま。同じ画像は重複する
3ファイル(合計414,812バイト)の結合では、qpdf 411,446、pdfunite 413,261、pdftk 412,910、pypdf 412,869バイトで、ほぼ合計のままでした。結合は圧縮ではありません。 同じ写真のPDF(401,573バイト)を2回つないだときの差は大きく出ました。
| 結合の仕方 | 出力の容量 | メモ |
|---|---|---|
| qpdf(同じファイル名を2回) | 401,339バイト | 同じファイルは1回だけ読み込まれた |
| qpdf(中身が同じ別名のコピー) | 801,792バイト | 別のファイルとして2倍に |
| pdfunite・pdftk・pypdf | 801,973〜802,218バイト | 画像が2つ入る |
pypdf+compress_identical_objects |
401,601バイト | 同じ中身を1つにまとめた |
容量を本格的に小さくしたいときは、結合とは別に画像の解像度を下げる圧縮を行います。なお、Ghostscript の -dPDFSETTINGS=/screen で写真入りの見本を変換すると、437,517バイトと元より大きくなりました。雑音のような画像では縮まないことがあるため、圧縮も結果の容量を見て判断します。
パスワード付きPDFを結合する(エラー原文と手順)
この節では、パスワード付きのPDFを結合しようとしたときのエラーと、正しい手順が分かります。
開くときにパスワードが要るPDF(AES-256)を、パスワードを指定せずに結合した結果です。
| ツール | 表示されたエラー(原文) | 終了コード |
|---|---|---|
| qpdf | qpdf: enc_user.pdf: invalid password |
2 |
| pdfunite | Command Line Error: Incorrect password のあと Could not merge damaged documents |
255 |
| pdftk | Error: Invalid PDF: unknown.encryption.type.r |
出力なし |
| Ghostscript | **** This file requires a password for access. |
0(出力は空のページ1枚) |
| pypdf | FileNotDecryptedError: File has not been decrypted |
1 |
Ghostscript だけは、エラーを出しても終了コード 0 で終わり、パスワード付きのファイルを飛ばしたPDFを作りました。 スクリプトで使うときは、終了コードだけでなくページ数も確かめます。pdftk-java 3.3.3 の unknown.encryption.type.r は、AES-256(暗号化の版 R=6)のPDFを読めなかったときの表示で、input_pw himitsu でパスワードを渡しても同じエラーでした(その前に「Using a password on the command line interface can be insecure.」の警告も出ます)。
パスワードを指定して結合する
# qpdf:ファイル名のすぐ後に --password を書く
qpdf --empty --pages enc_user.pdf --password=himitsu b_moushikomi.pdf -- out/p1.pdf
# Ghostscript
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sPDFPassword=himitsu -sOutputFile=out/p4.pdf enc_user.pdf b_moushikomi.pdf
from pypdf import PdfReader, PdfWriter
r = PdfReader("enc_user.pdf")
print(r.is_encrypted, r.decrypt("himitsu")) # True 1(1は利用者のパスワードで開けた意味)
w = PdfWriter()
w.append(r)
w.append("b_moushikomi.pdf")
w.write("out/p5.pdf")
3つとも5ページのPDFができましたが、どれも結合後のPDFにはパスワードが付いていませんでした(pdfinfo の表示は Encrypted: no)。元がパスワードで守られていた書類なら、結合後に付け直します。
qpdf --empty --pages enc_user.pdf --password=himitsu b_moushikomi.pdf -- \
--encrypt 新しい開くパスワード 新しい権限パスワード 256 -- out/p1enc.pdf
付け直したPDFは Encrypted: yes (print:yes copy:yes change:yes addNotes:yes algorithm:AES-256) と表示されました。パスワードは、PDFと同じメールに書かずに別の経路で伝えます。ファイルをまとめてパスワード付きで送る方法の1つとして、zip の扱いは関連記事「zip・unzipコマンドの使い方|圧縮・解凍・パスワード・文字化け」で扱っています。
編集を制限されたPDF(開くパスワードは無い)
開くパスワードは無く、変更を禁止する設定だけが付いたPDFでは、結果が分かれました。pdfunite は Unimplemented Feature: Could not merge encrypted files ('enc_owner.pdf') で止まり、pdftk は上と同じエラー、qpdf・Ghostscript・pypdf は結合でき、出力には制限が付いていませんでした。制限は作成者の意思表示です。 結合できても、制限の無い版を作って配ることになるため、作成者の了承を得てから行います。
壊れたPDF・結合できないPDFのエラー原文と直し方
この節では、「壊れている」「PDFではない」と言われて結合できないときに、エラー文から原因を見分ける方法が分かります。
よくあるエラー(原文)と原因
| 表示(原文) | 出たツール | 原因 | 直し方 |
|---|---|---|---|
unable to find trailer dictionary while recovering damaged file |
qpdf | ダウンロードが途中で切れたなど、ファイルの後半が無い | 元の場所から取り直す |
Could not merge damaged documents |
pdfunite | 壊れている、またはパスワードが違う | qpdf で読めるか試す |
Rebuild failed: trailer not found.; Original message: PDF startxref not found. |
pdftk | ファイルの後半が無い | 取り直す |
Stream has ended unexpectedly |
pypdf | 途中で切れている、またはPDFではない | 取り直す・中身を確かめる |
can't find PDF header/PDF header signature not found. |
qpdf/pdftk | 拡張子だけ .pdf の別のファイル(HTML のエラーページなど) | file コマンドで中身を確かめる |
Catalog dictionary not located in file, unable to proceed |
Ghostscript | ファイルの後半が無い(終了コード 0 のまま飛ばす) | ページ数を確かめ、取り直す |
operation succeeded with warnings; resulting file may have some problems |
qpdf | 相互参照表だけが壊れていて、作り直して読めた | 出力を開いて中身を確かめる |
途中で切れたPDF(3,000バイトで切ったもの)を qpdf で結合しようとしたときの表示です。終了コードは 2 で、出力はできませんでした。
WARNING: broken_trunc.pdf: file is damaged
WARNING: broken_trunc.pdf: can't find startxref
WARNING: broken_trunc.pdf: Attempting to reconstruct cross-reference table
WARNING: broken_trunc.pdf (object 4 0, offset 3000): expected endstream
...
qpdf: broken_trunc.pdf: unable to find trailer dictionary while recovering damaged file
相互参照表だけが壊れたPDFは読み直せることがある
末尾の「どこに何があるか」の表(相互参照表)だけを壊したPDFは、qpdf が作り直して読めました。結合しても6ページそろい、終了コードは警告ありの 3 です。pdfunite・pdftk・pypdf は何も言わずに結合しました。先に qpdf で書き出し直すと、以降は警告が出なくなりました。
$ qpdf broken_xref.pdf out/fixed.pdf
WARNING: broken_xref.pdf: file is damaged
WARNING: broken_xref.pdf (offset 99999): xref not found
WARNING: broken_xref.pdf: Attempting to reconstruct cross-reference table
qpdf: operation succeeded with warnings; resulting file may have some problems
$ qpdf --check out/fixed.pdf
...
No syntax or stream encoding errors found; the file may still contain
errors that qpdf cannot detect
qpdf の終了コードは、0 がエラーも警告も無し、2 がエラーで処理されなかった、3 が警告だけ、です(公式ドキュメントの Exit Status)。警告を許して 0 にしたいときは --warning-exit-0 を付けます。
PDFが結合できない・うまくいかないとき(症状→原因→直し方)
この節では、PDF結合でよく起きる症状から、原因と直し方を引けます。
| 症状 | 原因 | 直し方 |
|---|---|---|
| ページの順番がおかしい(1, 10, 100, 11…) | ファイル名を文字の順で並べている | 0埋めの名前にする・ls -v・自然順のスクリプト |
| Mac で順番が思ったとおりにならない | Finder の「PDFを作成」は選んだ順 | 並べたい順にクリックして選び直す |
| 結合後に目次(しおり)が消えた | qpdf --empty・pdfunite はしおりを引き継がなかった |
pypdf・pdftk・PDFsam Basic で結合する |
| 入力欄が消えた・普通の文字になった | pdfunite・Ghostscript は入力欄を残さなかった | qpdf・pdftk・pypdf を使う |
| 2つ目の書類の入力欄に入れると1つ目も変わる | 入力欄の名前が同じ | pypdf の add_form_topname・PDFsam の改名 |
| 日本語の文字が消えた・コピーすると化ける | Ghostscript が描き直し、フォントが無い・対応表が失われた | 中身を写す方式(qpdf・pypdf など)で結合し直す |
| 「パスワード」と言われる | 開くパスワード付きのPDF | パスワードを指定して結合し、必要なら付け直す |
| 結合後にパスワードが外れた | 結合ツールは新しいPDFを暗号化せずに書き出した | qpdf の --encrypt などで付け直す |
| 容量が大きすぎてメールで送れない | 結合は容量を足し算するだけ | 圧縮を別に行う・共有のリンクで渡す |
| オンラインツールで「上限」と出る | ファイル数・ページ数の上限(Acrobat は100ファイル・1,500ページ) | 分けて結合する・手元の方法に切り替える |
結合のあとに確かめる4点
- 1ページ数が「元の合計」と同じか
qpdf --show-npages out.pdfで数だけ出る。1,000ページの結合では 1000 と出た - 2終了コードが 0 か(ただし過信しない)Ghostscript はファイルを飛ばしても 0 だった。1と合わせて確かめる
- 3最初・つなぎ目・最後のページを開く順番の狂いと、横向きのページの向きを目で見る
- 4文字を検索できるか・入力欄が動くか描き直すツールを使ったときは特に。パスワードの要否も見る
シェルスクリプトで終了コードを見る書き方は、関連記事「シェルスクリプトの終了ステータス $?とexitコード一覧・判定方法」で扱っています。
毎回の結合を自動にする(Linux)
ここでは、決まったフォルダーのPDFを毎回同じ順で結合し、失敗に気づける形にする方法が分かります。
請求書や日報など、毎月同じ形でまとめる作業は、手順を固定すると間違いが減ります。手元で使った形は次の4段です。
- 1入力を決めるフォルダーと名前の付け方(2026-10_01.pdf のように0埋め)をそろえる
- 2並べてから渡す
ls -vか自然順のスクリプトで順番を固定する - 3結合する速さ優先なら qpdf、しおり・入力欄を残すなら pypdf
- 4数を照合して止めるページ数が合わなければ終了コード 1 で止め、元のファイルは消さない
#!/usr/bin/env bash
set -euo pipefail
in_dir=./invoices
out=./merged.pdf
mapfile -t files < <(ls -v "$in_dir"/*.pdf)
expected=0
for f in "${files[@]}"; do
n=$(qpdf --show-npages "$f")
expected=$((expected + n))
done
qpdf --empty --pages "${files[@]}" -- "$out"
got=$(qpdf --show-npages "$out")
echo "files=${#files[@]} expected=$expected got=$got"
[ "$got" -eq "$expected" ] || { echo "ページ数が合いません" >&2; exit 1; }
パスワード付きや壊れたファイルが混ざると、qpdf --show-npages の段階で qpdf が終了コード 2 を返し、set -e によってスクリプトがそこで止まります。結合後のファイルを人に渡す前に止められるのが、この形の利点です。
よくある質問
Q. PDFを無料で結合する方法はありますか? A. あります。Mac は標準のプレビューと Finder の「PDFを作成」、Windows・Mac・Linux はオープンソースの PDFsam Basic、コマンドなら qpdf・pdfunite・pdftk、Python なら pypdf が無料です。機密でない書類なら Acrobat のオンラインツールも無料で使えます。
Q. Windows 11 の標準機能だけでPDFを結合できますか? A. Microsoft Learn に載っている Edge のPDF機能(表示・印刷・入力・手書き・ハイライトなど)に、結合は含まれていません(2026年10月29日時点)。PDFsam Basic、Python の pypdf、ブラウザで使うオンラインツールのどれかを使います。
Q. オンラインのPDF結合サイトは安全ですか? A. 運営会社・ファイルの削除の時期・上限を確かめたうえで、機密でない書類に使うのが目安です。契約書や個人情報を含むPDFは、端末の中で結合できる方法を選びます。会社の書類は社内の決まりに従います。
Q. 結合したらしおり(目次)が消えました。
A. 手元の実測では、qpdf を --empty で使ったときと pdfunite で、しおりが0件になりました。pypdf と pdftk は5件とも残りました。qpdf でも先頭のファイルを土台にすると、そのファイルのしおりは残ります。
Q. ページの順番を入れ替えたり、一部のページだけ結合できますか?
A. できます。qpdf は --pages a.pdf 3,1 b.pdf 2 --、pdftk は A=a.pdf B=b.pdf cat A3 A1 B2、pypdf は append(..., pages=[2, 0])(0から数える)です。Mac はプレビューのサムネールをドラッグします。
Q. 結合するとファイルの容量は小さくなりますか?
A. なりません。手元の3ファイルの結合では、出力は元の合計とほぼ同じでした。同じ画像を含むPDFを重ねると画像が2つ入るため、pypdf の compress_identical_objects で重複をまとめると、約802KBが約402KBになりました。
Q. パスワード付きのPDFを結合すると、パスワードはどうなりますか?
A. パスワードを指定して開けば結合できますが、qpdf・Ghostscript・pypdf のどれも、結合後のPDFにはパスワードが付いていませんでした。必要なら qpdf の --encrypt などで付け直します。
Q. Excel や Word のファイルとPDFを1つにまとめられますか? A. 先にそれぞれをPDFにしてから結合するのが確実です。Adobe ヘルプでは、デスクトップ版の Acrobat が PDF・Word・Excel・PowerPoint などのファイルを1つのPDFに結合できると案内されています。
Q. 何ページまで結合できますか? A. 手元の qpdf では、1,000ページ(100ファイル)の結合が0.17秒・最大メモリ30MBで終わりました。Acrobat のオンラインツールは、最大100ファイル・合計1,500ページ・1ファイル500ページまでです(2026年10月29日時点)。
Q. 結合したPDFを、また分けることはできますか?
A. できます。qpdf の --pages で範囲を指定して取り出すか、--split-pages で決まったページ数ごとに別のファイルに書き出します。PDFsam Basic にも分割の機能があります。
まとめ
- PDFの結合は、まず「外に出してよい書類か」で決める。機密なら端末の中で結合できる方法(Mac のプレビュー・Finder、PDFsam Basic、qpdf、pypdf)を選ぶ。
- Mac は Finder で選んで「クイックアクション」→「PDFを作成」。ページは選んだ順に並ぶ。Windows の Edge には結合の機能が無い。
- 手元の実測では、しおり・入力欄の両方が残ったのは pypdf と pdftk。qpdf
--emptyと pdfunite はしおりが0件、Ghostscript は埋め込みの無い日本語の文字が消えた。 - 順番の狂いは「1, 10, 100, 11」の並びが原因になりやすい。0埋めの名前か自然順で並べ、結合後にページ数を照合する。
- パスワード付きのPDFは、指定して開けば結合できるが、結合後にはパスワードが付いていない。Ghostscript は失敗しても終了コード 0 のことがあるため、ページ数も確かめる。
参考・出典
確認日はいずれも 2026年10月29日です。
- Apple サポート「MacでファイルをPDFに結合する」:https://support.apple.com/ja-jp/guide/mac-help/mchl21ac2368/mac
- Apple サポート「Macの『プレビュー』でPDFを結合する」:https://support.apple.com/ja-jp/guide/preview/prvw43696/mac
- Apple サポート「MacのFinderでクイックアクションを実行する」:https://support.apple.com/ja-jp/guide/mac-help/mchl97ff9142/mac
- Microsoft Learn「PDF reader in Microsoft Edge」:https://learn.microsoft.com/deployedge/microsoft-edge-pdf
- Adobe「PDFを結合(複数のPDFをまとめる)」:https://www.adobe.com/jp/acrobat/online/merge-pdf.html
- Adobe ヘルプ「ファイルを単一の PDF に結合」:https://helpx.adobe.com/jp/acrobat/desktop/edit-documents/combine-files/combine-files.html
- PDFsam「PDFsam Basic」:https://pdfsam.org/pdfsam-basic/
- qpdf「Running qpdf」(Page Ranges・Exit Status):https://qpdf.readthedocs.io/en/stable/cli.html
- qpdf「Downloading qpdf」:https://qpdf.readthedocs.io/en/stable/download.html
- pypdf「Merging PDF files」:https://pypdf.readthedocs.io/en/stable/user/merging-pdfs.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PDFを結合する方法|Windows・Mac・スマホ別と無料ツール5種の実測」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。