PDF Bash 結合で簡単にPDFをまとめる方法:コマンドライン手順ガイド

PDFファイルをコマンドラインから簡単に結合する方法

PDFを複数まとめて1ファイルにしたいとき、GUIのツールを使わずにスクリプトやシェルコマンドだけで処理したいことがあります。
本記事では、Linux(Ubuntu / Debian系)や macOS の標準環境で動作する代表的なツールを使い、PDF結合を実現する手順を詳しく解説します。
目的は「コマンドラインで1行だけで済む」ことと「スクリプト化した時に再利用しやすい」ことです。
最後に実際に使えるサンプルスクリプトをまとめます。


1. PDF結合を行う代表ツール

ツール 特徴 公式サイト
pdftk PDFの結合・分割・ページ順変更など多機能 https://www.pdflabs.com/tools/pdftk-server/
qpdf 変換・結合・暗号化解除などに強い https://qpdf.sourceforge.io/
pdfunite poppler パッケージに含まれるシンプルツール https://poppler.freedesktop.org/
gs (Ghostscript) 高度な PDF 変換・結合 https://ghostscript.com/
mutool MuPDF のツールセット https://mupdf.com/

選択はインストール手順と機能で決めると良いでしょう。
ここでは最もインストールが簡単で安定した pdfunite と、機能の拡張性に優れた pdftk を紹介します。


2. pdfunite で PDF を結合

2-1. インストール

# Debian/Ubuntu 系
sudo apt-get update
sudo apt-get install poppler-utils

# macOS (Homebrew)
brew install poppler

2-2. 基本コマンド

pdfunite file1.pdf file2.pdf file3.pdf merged.pdf
  • 引数に結合したいファイルを並べ、最後に結合後のファイル名を指定します。
  • ファイル名に空白や特殊文字がある場合は引用符で囲みます。

2-3. 例: ディレクトリ内の全 PDF を結合

pdfunite *.pdf combined.pdf

ただし、*.pdf で並ぶ順はファイルシステム順で、必ずしも論理的な順序とは限りません。
順序を保証したい場合は次のように sort で整列させます。

ls -1 | grep '\.pdf$' | sort -V | xargs pdfunite - merged.pdf

sort -V はバージョン番号順(1, 2, 10 など)に並べます。

2-4. 注意点

  • ページ数・サイズが異なる PDF を結合すると、ページサイズが「最初のファイルのサイズ」に揃えられます。
  • 暗号化された PDFpdfunite で結合できないので、別途 qpdf で解除してください。

3. pdftk で PDF を結合

3-1. インストール

# Debian/Ubuntu 系
sudo apt-get install pdftk

# macOS (Homebrew)
brew install pdftk-java

※ 旧バージョンの pdftk はライセンスが変更されたため、公式は pdftk-java という Java ベースの実装を提供しています。

3-2. 基本コマンド

pdftk file1.pdf file2.pdf cat output merged.pdf
  • cat は「結合」を意味し、output で出力ファイル名を指定します。
  • ファイルごとに順序を明確に指定したい場合は、A1 A2 などラベルを付けて管理すると便利です。

3-3. 複数ファイルの動的結合

pdftk $(find . -type f -name '*.pdf' | sort -V) cat output merged.pdf

find で検索し、sort -V で整形して pdftk に渡します。
このコマンドは現在のディレクトリ以下から PDF をすべて取得して結合します。

3-4. 画像リストを使って結合

PDF が大量にあるが、指定順に結合したい場合はテキストファイルを用意します。

# list.txt
file1.pdf
file2.pdf
file5.pdf
pdftk $(cat list.txt | tr '\n' ' ') cat output ordered.pdf

3-5. もっと高度な使い方

  • ページ範囲指定
    file1.pdf A1 B1 C1 D1
    file2.pdf A2-c3 など
  • 暗号化解除
    pdftk encrypted.pdf input_pw 1234 output plaintext.pdf

3-6. 注意点

  • 大規模 PDF ではメモリ消費が激しくなる可能性があります。
  • オプション設定(例: 余白調整) は pdftk では少し煩雑なので、必要なら qpdf で補完すると良いです。

4. qpdf で PDF を結合(ページ削除も可能)

4-1. インストール

# Debian/Ubuntu 系
sudo apt-get install qpdf

# macOS (Homebrew)
brew install qpdf

4-2. 基本コマンド

qpdf --empty --pages file1.pdf file2.pdf file3.pdf -- merged.pdf
  • --empty で空のドキュメントを作成し、--pages で指定したファイルのページを順次追加します。
  • ページ範囲を指定したい場合は file1.pdf=1-3 と書けます。

4-3. 例: ファイルの順序を変えて結合

qpdf --empty --pages file3.pdf=1 --pages file1.pdf=1-3 -- pages.pdf -- merged.pdf

4-4. 使い方補足

  • qpdf は暗号化解除、再暗号化、圧縮制御などもできるので、結合後にファイルサイズを小さくしたいときに便利です。
  • 具体例:
    qpdf --compress-streams=y input.pdf --recompress=all output.pdf
    

5. Ghostscript (gs) で PDF を結合

5-1. インストール

# Debian/Ubuntu 系
sudo apt-get install ghostscript

# macOS (Homebrew)
brew install ghostscript

5-2. 基本コマンド

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf file1.pdf file2.pdf file3.pdf
  • -dBATCH -dNOPAUSE は処理完了後に終了します。
  • -q は冗長出力を抑えるオプション。
  • -sDEVICE=pdfwrite は PDF を出力する設定です。

5-3. 例: PDF と画像を混ぜて結合

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=combined.pdf \
    image1.png image2.png \
    document.pdf

5-4. 注意点

  • Ghostscript は高機能なので、シェルスクリプトに組み込む際はエラーハンドリングを忘れないでください。
  • フォント埋め込みやページサイズ統一に細かく制御したい場合は、コマンドに多くのオプションが必要になります。

6. 自動化スクリプト:PDF を自動結合する Bash スクリプト

以下は、指定ディレクトリ内のPDFをすべて結合し、出力ファイルを分かりやすく命名するサンプルです。
環境に応じて pdfuniteqpdf を選択しています。

#!/usr/bin/env bash

# ----------------------------------
# PDF を一括で結合する Bash スクリプト
# ----------------------------------
# 1. 対象ディレクトリ(指定なしならカレント)
# 2. PDF の並べ替え方法(カスタマイズ可)
# 3. 出力ファイル名(日付付き)
# ----------------------------------

set -euo pipefail

# ----------- パラメータ ----------
TARGET_DIR=${1:-.}
TOOL=${2:-pdfunite}   # pdfunite / qpdf / pdftk / gs
OUTDIR=${3:-.}
OUTNAME="${OUTDIR}/merged_$(date +%Y%m%d_%H%M%S).pdf"

# ----------- PDF の取得 ----------
# 1. ファイル名を取得してソート
PDF_LIST=$(find "$TARGET_DIR" -type f -iname '*.pdf' -print0 | \
           xargs -0 -n1 basename | \
           sort -V | tr '\n' ' ')

# 2. ソートした一覧を完全パスに変換
PDF_FILES=$(printf "%s\n" $PDF_LIST | \
           sed "s|^|${TARGET_DIR}/|")

echo "検出 PDF 数: $(echo "$PDF_FILES" | wc -w)"
echo "結合対象: $PDF_FILES"

# ----------- 結合 ----------
case "$TOOL" in
    pdfunite)
        pdfunite $PDF_FILES "$OUTNAME"
        ;;
    qpdf)
        qpdf --empty --pages $PDF_FILES -- "$OUTNAME"
        ;;
    pdftk)
        pdftk $PDF_FILES cat output "$OUTNAME"
        ;;
    gs)
        gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="$OUTNAME" $PDF_FILES
        ;;
    *)
        echo "不正なツール: $TOOL" >&2
        exit 1
        ;;
esac

echo "結果: $OUTNAME"

使い方

chmod +x merge_pdf.sh
./merge_pdf.sh /path/to/pdfs pdftk /path/to/output
  • /path/to/pdfs → PDF の入っているディレクトリ
  • pdftk (または pdfuniteqpdfgs) → 使いたいツール
  • /path/to/output → 出力先ディレクトリ(省略するとカレント)

7. よくある質問(FAQ)

質問 回答
PDF が多すぎて処理が遅い qpdf--recompress を使うか、スクリプトでページを一度に数枚ずつ分割して結合するとメモリを抑えられます。
結合後のファイルで文字検索ができない 元の PDF が暗号化されている、またはフォントが埋め込まれていない可能性があります。pdftkinput_pw オプションで復号し、qpdf--stream オプションで再圧縮してください。
PDF のページサイズが揃わない gs-dPDFFitPage オプションや qpdf--pages の際に =1- を指定すると、ページごとにサイズを統一できます。
ファイル名に日本語が入っている ほとんどのツールは UTF-8 をサポートしますが、環境によっては iconv で変換が必要です。
結合した PDF の順序を自動で保証したい sort -V は「1-10, 2-2」などを正しく順序付けします。必要に応じて LC_ALL=C を付けて ASCII 単位でソートしてください。

8. まとめ

  • pdfunite は「最も手軽に結合したい」時に最適。
  • pdftk は「複雑なページ操作や暗号化解除を伴う結合」時に便利。
  • qpdf は「ページ範囲指定や圧縮制御」などを織り交ぜたい場合におすすめ。
  • Ghostscript は「高機能な変換を必要とするケース」で重宝します。

いずれのツールもシェルスクリプトに組み込めば、定期レポートの作成や大量の添付ファイルのまとめ作業を自動化できます。
ぜひ自分のワークフローに合うコマンドを選び、日常的に活用してみてください。

コメント