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"
逆に解除する場合は pdftk の input_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. 失敗しやすいポイントと対策
-
大容量 PDF のメモリ制限
-
qpdfはメモリ使用量を抑えて高速に処理できます。 - 例:
qpdf --pages input.pdf 1-200 -- output-small.pdf
-
-
ページ順序が乱れる
-
pdfuniteは引数順で結合します。 -
sort -Vでファイル名をバージョン順に並べ替えてから結合すると安全です。
pdfunite $(ls -1v *.pdf) merged.pdf -
-
バイナリ名に空白が入っている
-
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. 実践環境での活用例
-
毎日レポートを PDF 結合
0 1 * * * /usr/local/bin/merge_folder.sh /var/reports/daily /var/reports/merged_$$(date +\%Y\%m\%d).pdf -
Web サービスで PDF アップロード時に OCR 付き PDF を生成
- CGI スクリプトに
ocr_pdf.shを呼び出す。 - 生成した PDF を S3 にアップロード。
- CGI スクリプトに
まとめ
Bash だけで PDF の変換、結合、分割、暗号化から OCR まで一連の流れを自動化できます。
ツールの選択は「速度」「安全性」「機能の豊富さ」を基準に行い、スクリプトの汎用性を高めるには引数やエラーハンドリングを充実させることが重要です。
今から簡単なスクリプトを作成し、実際にプロジェクトに組み込むことで、PDF 作業の自動化に大きく近づくでしょう。


コメント