導入
PDFは文書を共有・保管する際の定番フォーマットですが、社内資料やレポートを更新する際に「どうやってバージョン管理し、内容を差分だけ反映させるか」という課題に直面することが多いです。
この記事では、PDF更新の基本的な手順から、差分抽出や自動化を可能にするツール・スクリプト例までを網羅的に解説します。初心者から中級のWebライター・コンテンツ制作者まで、誰でも手順を踏んでスムーズに作業できるように構成しています。
1. PDF更新の基本フロー
1️⃣ 元データの確認
- 原稿(Word、Markdown、LaTeXなど)がある場合は、まず原稿の最新版を取得。
- 変更箇所は色分け(Track Changes)やコメントでハイライトしておくと作業後に比較しやすい。
2️⃣ PDF生成
- 原稿をPDFに変換。
- 生成オプション(ページサイズ、フォント埋め込み、圧縮率)を統一しておくと、後の差分抽出がスムーズ。
3️⃣ 差分比較
- 「前バージョン」と「新バージョン」を比較して、変更箇所を可視化。
- 手動で確認する場合はPDFリーダーでページを並べて比較。ただし大規模文書では非効率。
4️⃣ 差分だけを抽出
- 変更箇所を差分PDFに切り抜き。
- 差分PDFを追加情報として添付したり、別ファイルで共有できる。
5️⃣ 更新完了通知
- 関係者へバージョン番号と差分点をまとめた報告書を送信。
2. 差分抽出のコツと頻出ミス
-
文字コードとフォント
- PDF内のテキストはベクトルデータとして保存されるため、フォントが埋め込まれていないと差分抽出が失敗。フォント埋め込み設定を必ず確認。
-
変換ツールのバージョン差
- Word→PDF変換ツールやLaTeX→PDFコンパイラのバージョンが異なると、レイアウトが変わり差分が誤検出される。
- 固定環境(DockerやCI環境)でツールを管理すると安定。
-
画像の圧縮率
- 画像圧縮率や解像度が変わると、同じ見た目でも内部データ差が大きくなる。
- 画像は一元管理し、圧縮ツール(ImageMagick等)で一定設定に統一。
3. 差分比較ツール一覧
3‑1. Adobe Acrobat Pro DC
- 特徴:GUIで「比較」機能を持ち、PDF同士の差分をハイライト。
- 長所:使い慣れたAdobe環境。レイアウト変更も検出。
- 短所:サブスクリプション料金。自動化には向かない。
3‑2. DiffPDF(オープンソース)
- 特徴:コマンドラインで差分を比較。テキストとレイアウトを選択可能。
- 長所:CI/CDでの自動化が容易。
- 短所:比較結果で差分を抽出するには手作業が必要。
3‑3. PDFdiff(Python)
- 特徴:Pythonで書かれたスクリプト。テキストベースで差分点を出力。
- 長所:スクリプト化しやすい。
- 短所:レイアウト変更の検出は弱い。
4. 差分PDF生成ツール
4‑1. PDFtk Server
- 概要:PDFのページ抽出・結合・暗号化をコマンドラインで実装。
- 差分抽出:
pdftk old.pdf cat 2-5 output old_sub.pdf pdftk new.pdf cat 2-5 output new_sub.pdf diff old_sub.pdf new_sub.pdf > diff.txt - 利点:軽量、無料。
4‑2. qpdf
- 概要:PDFの構造を直接操作できる。
- 差分抽出:
qpdf --object-streams=disable old.pdf --qdf --pages . 2-5 -- old_sub.pdf qpdf --object-streams=disable new.pdf --qdf --pages . 2-5 -- new_sub.pdf diff old_sub.pdf new_sub.pdf
4‑3. Ghostscript
- 概要:PDFのレンダリングに特化したツール。
- 差分抽出:
gs -sOutputFile=old_render.ps -dBATCH -dNOPAUSE -sDEVICE=ps2write old.pdf gs -sOutputFile=new_render.ps -dBATCH -dNOPAUSE -sDEVICE=ps2write new.pdf diff old_render.ps new_render.ps > diff.ps
5. 差分抽出の自動化ワークフロー
以下はGitHub Actionsで実装したサンプルワークフローです。
name: PDF Update
on:
push:
branches: [ main ]
paths: [content/**/*.md, templates/**/*.docx]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# 1. 原稿 → PDF
- name: Build PDF
run: |
pandoc -s content/report.md -o dist/report_old.pdf
# 新しいファイルに合わせるケースで旧版を別管理
# 2. 差分比較
- name: Compare PDFs
uses: docker://ghcr.io/timkindahl/pdfdiff-action:latest
with:
old: dist/report_old.pdf
new: dist/report_new.pdf
# 3. 差分PDF作成
- name: Extract Diff
run: |
pdftk dist/report_old.pdf cat 2-5 output dist/tmp_old.pdf
pdftk dist/report_new.pdf cat 2-5 output dist/tmp_new.pdf
diff dist/tmp_old.pdf dist/tmp_new.pdf > dist/diff.txt
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: pdf-diff
path: dist
ポイント
pandoc:Markdown→PDF変換を自動化。pdftk:差分箇所のページ抽出。diff:PDF自体のバイナリ比較。- CI環境で自動比較すると、人為的なミスを防げます。
6. 便利なスクリプト例
6‑1. PDF差分をテキスト化するPythonスクリプト
import PyPDF2
def extract_text(pdf_path):
reader = PyPDF2.PdfReader(pdf_path)
text = ""
for page in reader.pages:
text += page.extract_text() + "\n"
return text
old_text = extract_text("old.pdf")
new_text = extract_text("new.pdf")
diff = [ln for ln in new_text.splitlines() if ln not in old_text.splitlines()]
with open("diff.txt", "w") as f:
f.write("\n".join(diff))
6‑2. バッチで差分PDFを自動生成
# 1. PDFをテキスト化
pdftotext old.pdf old.txt
pdftotext new.pdf new.txt
# 2. 差分抽出
diff old.txt new.txt > diff.txt
# 3. 差分ページ番号抽出
# ここではawkやsedでパターンを探すスクリプト
awk '/^\+/ {print NR; next}' diff.txt > page_nums.txt
# 4. ページ抽出
while read -r page; do
pdftk new.pdf cat $page output diff_page_$page.pdf
done < page_nums.txt
7. よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
| Q1. 画像があるPDFの差分はどうやって検出すればいい? | 画像を単独PDFに切り出し、画像差分ツール(ImageMagickのcompareなど)を使用。 |
| Q2. PDFに埋め込まれたフォームフィールドも更新したい。 | pdftkのfill_form機能を使うか、Adobe AcrobatのPrepare Formで再設定。 |
| Q3. PDFのメタデータ(作成日時など)が変わってみなずに比較したい。 | qpdf --replace-objectでメタデータを統一した上で比較。 |
| Q4. 大規模レポートを頻繁に更新する場合、どのようにCIで管理すればいい? | Git LFSでPDFファイルを追跡し、GitHub Actionsで差分PDF生成と通知を実装。 |
8. まとめ
- PDF更新時の失敗は「差分を正確に把握できていない」ことが主因。
- 原稿・PDFの設定を統一し、差分抽出ツールを組み合わせれば精度を高められる。
- 最終的な自動化はCI/CD環境で実装し、関係者への通知までワンパイプで完結。
このガイドを参考に、PDF更新作業を「迷うことなく効率化」しましょう!


コメント