はじめに
ちょっと脇道に逸れるが、PDF比較ツールを作るようになったきっかけとなる業務システムのマイグレーションの話に触れます。
背景
業務システムのマイグレーションプロジェクトにおいて、品質評価(担保)するために現行システムでの処理結果と新システムでの処理結果を比較することがあります。
業務システムにおいて、大別すると2点となります。
- オンライン処理
- バッチ処理
これらの処理で比較する対象としては、主に以下になるかと思います。
オンライン処理
- クライアント‐サーバ間でやり取りされるHTTP通信パケット
- データベース更新結果
- ログ出力結果
バッチ処理
- ファイルIOで出力されるファイル
- データベース更新結果
- ログ出力結果
これらは、処理結果をテキストファイルに出力することで、Diffツールで現新の処理結果を容易に比較することが可能です。
PDF比較ツールの話じゃないのと思った方、ここからが本題です!
多くの業務システムにおいて、オンライン処理やバッチ処理で出力される成果物として 「帳票
」 があります。
特に顧客宛の通知物(DMハガキ、シーリング帳票や書面)については、誤りがあってはいけない代表格になります。
帳票デザインや印字位置について非常に気を使っています。
そのため、現新比較結果のチェックが厳しくなります。
帳票は、以下に示すような帳票生成過程を含んでいるため、単純にテキストファイルに出力することができません。
- フォント装飾
- 固定レイアウトと可変印字領域の合成
- 画像等のimageデータの埋め込み
- 図表やグラフの挿入
テキストファイルに出力できないため、単純なDiffツールでの現新比較が実施できません。
そこで、帳票の現新比較は以下2点がよく使わます。
帳票比較の常套手段
- 帳票をPDFファイル出力して比較
- プリンタから紙出力して重ねて比較
PDF比較の利点
プリンタから紙出力して比較する場合は、当然ですが物理的に紙に印字する必要があります。
紙やインク等のコストが少なからず発生します。序盤からこの方法を採るとコストが嵩むため、電子的に比較可能なPDFファイルに出力して比較を行います。
既存PDFツールの難点
巷には、既にPDF比較ツールは多く存在しています。
試行したツールで存在した比較モードには難点があるということに気づきました。
注意
あくまで筆者が試したいくつかのツールの比較結果からの所感になります。
より高度に比較して満足のいく結果を出力するツールはあるかと思います。
文字比較
2つのPDFを入力に印字されている文字列を比較するモードです。
左右に並べて印字差異を検出するのには便利です。
ただ・・・・
固定レイアウト(枠線)の差異は検出できません。
そのため、現新比較が不十分となります。
印字位置比較
2つのPDFを入力に印字されている文字や固定枠の位置を比較するモードです。
左右に並べて印字内容の差異を検出するのには便利です。
ただ・・・・
差異が出ている箇所がどのくらいの差なのか直感で分かりにくいです。
そのため、現新比較において差異を許容できるレベルなのか判定しずらいです。
PDF比較ツールを自作する
コンセプト
帳票の現新比較の目的を単純化すると、現行システムから出力された帳票と新システムから帳票の差異がどの程度なのか、許容可能かを直感的に把握することになります。
基本的に許容可能かは、実際にプリンタから紙出力して目検で判定する(重ねて見比べる)ことになります。
紙出力前に簡易的に 「重ねて比較」 できれば目的は達成されます。
また、先に述べた文字列比較モードや印字位置比較モードの課題も解消できます。
設計
以下のステップで重ねて比較する設計としました。
- それぞれのPDFファイルの印字内容(ページ)を画像ファイルとして出力する
- 一方の帳票の印字内容を青字とし、もう一方の帳票の印字内容を赤字にする
- 上に重ねる帳票の背景色(印字内容以外)を透明にする
- 2つの帳票を重ね合わせてPDFファイルに出力
重ね合わたPDFを確認することで、以下3点を直感的に判定可能となりました。
3点目の差異の程度を一目で分かるようになるのが、当ツールの利点と思っています。
- 印字文字列の差異
- 印字位置の差異
- 差異の程度
実装
ソースコードはGithub上に公開しています。
以下より、2025年11月10日時点のソースコードに基づいて実装内容を記載します。
使用ライブラリ
当ツールは、以下2点を扱えるライブラリが利用しやすかったためPythonで実装しています。
モジュール構成
3つのモジュールに分かれています。
| No. | モジュール名 | 内容 |
|---|---|---|
| 1 | getPDFImage.py | PDFページを画像データ(PNG)として保存する |
| 2 | ChangeImageColor.py | 画像データから印字されている領域(ピクセル)を赤色に変換 |
| 3 | changeImageColorForStacking.py | 画像データから印字されている領域(ピクセル)を青色に変換し、背景(印字されていない領域(ピクセル))を透明に変換 |
| 4 | createDiffPDF.py | 比較対象の画像データを重ねてPDF出力する |
モジュールを順番に実行することで、PDF比較結果を取得することができます。
2025年9月6日により使いやすくなるContributeをいただきました!
Dev Kumar Pal(Github Account: @devkumar2313)氏より、3つのモジュールを統合的に実行可能とするmain.pyを追加するPull requestsをいただきました。
# 基本的な使い方
python main.py document1.pdf document2.pdf
# 出力ファイルを指定する方法
python main.py document1.pdf document2.pdf comparison_result.pdf
# 比較するPDFファイルページを指定する方法
python main.py document1.pdf document2.pdf comparison_result.pdf 1
終わりに
いくつか既存のPDFツールを試用しましたが、文字列比較や印字位置比較で差異の箇所と内容は分かるが、物足りなさがありました。
シンプルに帳票の印字内容を比較して差異の程度を一目で分かるツールを作成しようと思い、実装しました。
また、Dev Kumar Pal氏からより使いやすくするContributeもいただけて、非常に嬉しく思っています。
Special Thanks
-
Dev Kumar Pal(Github Account: @devkumar2313)氏
比較PDF生成するために実行が必要な3つのモジュールを統合して実行できるようにmain.pyを追加するPull requestsをいただきました。



