PDFをBashで自動化:シェルスクリプトで簡単に変換・結合・分割する方法

Bash だけで PDF を自在に扱いたい開発者や運用エンジニアにとって、最初に出てくる質問は「PDF の変換・結合・分割をどうやって自動化する?」です。
Linux 環境では、こうした処理は一行のコマンドで完結できます。以下では、代表的なツール群を紹介し、実際に使えるシェルスクリプトサンプルを交えて「どうやって」「何を」「どのように」実現するかを解説します。

1. 必要なツールを揃える

PDF の操作にはいくつかのパッケージが必要です。以下は最小限のセットです。

ツール 主な機能 インストールコマンド
pdftk 変換・結合・分割・暗号化 sudo apt-get install pdftk
qpdf 変換・分割・セキュリティ解除 sudo apt-get install qpdf
Ghostscript (gs) 低レベル変換・圧縮 sudo apt-get install ghostscript
Poppler utils(pdfseparate, pdfunite) 分割・結合 sudo apt-get install poppler-utils
ImageMagick(convert) 画像↔PDF sudo apt-get install imagemagick
LibreOffice Office ファイル↔PDF sudo apt-get install libreoffice

※ RHEL / CentOS 系は yum install、Arch 系は pacman -S 等をご使用ください。

2. 画像 → PDF で簡単に PDF を作る

画像ファイル(JPEG, PNG など)を一括で PDF に変換するケースはよくあります。

#!/usr/bin/env bash
# img2pdf.sh
# 画像フォルダ内の全画像を PDF に結合

INPUT_DIR="${1:-images}"
OUTPUT_PDF="${2:-output.pdf}"

# ImageMagick の convert で PDF へ変換
convert "$INPUT_DIR"/* -density 300 "$OUTPUT_PDF"

echo "✅ 画像から PDF を作成: $OUTPUT_PDF"
  • -density 300 は印刷品質に近い DPI を指定。
  • convert は画像フォーマットを自動で判別し、ページ単位で PDF に書き出します。

3. PDF → 画像/テキストに変換

PDF から画像やテキストを抽出したい時は pdftoppm, pdftotext がお勧めです。

#!/usr/bin/env bash
# pdf2media.sh
INPUT_PDF="${1}"
OUTPUT_DIR="${2:-out}"

mkdir -p "$OUTPUT_DIR"

# PDF → PNG
pdftoppm -png "$INPUT_PDF" "$OUTPUT_DIR/page"

# PDF → テキスト
pdftotext "$INPUT_PDF" "$OUTPUT_DIR/text.txt"

echo "✅ 変換完了: $OUTPUT_DIR"
  • pdftoppm-png はページ単位の PNG を生成。
  • pdftotext は OCR を行わないので、スキャン文書は tesseract に渡す必要があります。

4. PDF を結合(マージ)する

複数 PDF を一つにまとめるコマンドは pdfunite(poppler-utils)や qpdf です。

#!/usr/bin/env bash
# merge_pdfs.sh
TARGET_PDF="${1}"
OUTPUT_PDF="${2:-merged.pdf}"

# 受け取った PDF ファイルを変数に格納
PDF_FILES=("${@:2}")

pdfunite "${PDF_FILES[@]}" "$OUTPUT_PDF"

echo "✅ すべての PDF を結合: $OUTPUT_PDF"
  • pdfunite は高速かつ安全に結合できます。
  • 長いファイル名やスペースが入っているケースは、xargs -0 で処理するのが安全です。

もうひと手軽に「フォルダ内全 PDF 結合」

#!/usr/bin/env bash
# merge_folder.sh
TARGET_DIR="${1:-pdfs}"
OUTPUT_PDF="${2:-merged.pdf}"

pdfunite $(find "$TARGET_DIR" -maxdepth 1 -type f -name '*.pdf' -print0 | xargs -0) "$OUTPUT_PDF"

echo "✅ フォルダ中の PDF を結合: $OUTPUT_PDF"

5. PDF を分割(スプリット)する

大きな PDF をページごとに分ける処理。

#!/usr/bin/env bash
# split_pdf.sh
INPUT_PDF="${1}"
OUTPUT_DIR="${2:-split_pages}"

mkdir -p "$OUTPUT_DIR"

pdfseparate "$INPUT_PDF" "$OUTPUT_DIR/page_%d.pdf"

echo "✅ 分割完了: $OUTPUT_DIR (ページ数: $(ls "$OUTPUT_DIR" | wc -l))"
  • pdfseparate はページ番号を %d で自動挿入。
  • 分割後に特定範囲だけ抽出したい場合は qpdf--pages オプションを併用できます。

6. PDF の安全な暗号化・解除

PDF にパスフレーズを設定し、必要に応じて解除する。

#!/usr/bin/env bash
# encrypt_pdf.sh
INPUT_PDF="${1}"
OUTPUT_PDF="${2:-encrypted.pdf}"
PASSWORD="${3:-mypassword}"

pdftk "$INPUT_PDF" output "$OUTPUT_PDF" owner_pw "$PASSWORD" user_pw "$PASSWORD" encryption_method AES256

echo "✅ 暗号化完了: $OUTPUT_PDF"

逆に解除する場合は pdftkinput_pw オプションを使用。

pdftk encrypted.pdf input_pw mypassword output decrypted.pdf

7. コマンドラインの活用例(組み込みスクリプト)

日常的に遭遇するワークフローの一例です。

タスク コマンド
Office 文書を PDF に変換 libreoffice --headless --convert-to pdf input.docx
PDF を 1 ページずつ JPEG へ pdftoppm -jpeg -r 300 input.pdf output
画像フォルダを PDF → 再度画像抽出 → PDF img2pdf.sh imgs/ output1.pdf + pdf2media.sh output1.pdf temp/ + jpg2pdf.sh temp/ output2.pdf

8. 失敗しやすいポイントと対策

  1. 大容量 PDF のメモリ制限

    • qpdf はメモリ使用量を抑えて高速に処理できます。
    • 例:qpdf --pages input.pdf 1-200 -- output-small.pdf
  2. ページ順序が乱れる

    • pdfunite は引数順で結合します。
    • sort -V でファイル名をバージョン順に並べ替えてから結合すると安全です。
    pdfunite $(ls -1v *.pdf) merged.pdf
    
  3. バイナリ名に空白が入っている

    • xargs -0 と NUL 区切りで処理します。
    find . -name '*.pdf' -print0 | xargs -0 pdfunite -o merged.pdf
    

9. 高度なケース:OCR 付き PDF 生成

スキャンした画像からテキスト付き PDF を作成したい場合:tesseract + pdfunite の組み合わせ。

#!/usr/bin/env bash
# ocr_pdf.sh
IMG_DIR="${1}"
OUTPUT_PDF="${2:-ocr_output.pdf}"

# 画像単体への OCR
for IMG in "$IMG_DIR"/*; do
    OCR_TEXT="${IMG%.*}.txt"
    tesseract "$IMG" "${IMG%.*}" -l jpn
    # 画像と OCR テキストを PDF 化して結合
    convert "$IMG" "$OCR_TEXT" "$IMG.pdf"
done

# すべてのページを結合
pdfunite $(ls *.pdf | sort -V) "$OUTPUT_PDF"
echo "✅ OCR 付き PDF 完成: $OUTPUT_PDF"

10. 実践環境での活用例

  1. 毎日レポートを PDF 結合

    0 1 * * * /usr/local/bin/merge_folder.sh /var/reports/daily /var/reports/merged_$$(date +\%Y\%m\%d).pdf
    
  2. Web サービスで PDF アップロード時に OCR 付き PDF を生成

    • CGI スクリプトに ocr_pdf.sh を呼び出す。
    • 生成した PDF を S3 にアップロード。

まとめ

Bash だけで PDF の変換、結合、分割、暗号化から OCR まで一連の流れを自動化できます。
ツールの選択は「速度」「安全性」「機能の豊富さ」を基準に行い、スクリプトの汎用性を高めるには引数やエラーハンドリングを充実させることが重要です。
今から簡単なスクリプトを作成し、実際にプロジェクトに組み込むことで、PDF 作業の自動化に大きく近づくでしょう。

コメント