- diff-pdf は2つのPDFファイルを視覚的に比較するツールで、デフォルト実行時は差分がなければ終了コード 0、差分があれば 1 を返す
--output-diff オプションを使うと、差分が視覚的に強調されたPDFを生成できる
--view オプションはシンプルな GUI比較画面を開き、ページを確認して拡大できる。Ctrl/Cmd 矢印キーで2ページの相対位置を移動できる
- Windows、macOS、Fedora、CentOS 8、openSUSEで、事前ビルド済みパッケージやパッケージマネージャーによるインストール手段が提供されている
- リポジトリは as-is で提供され、活発に開発されていないため、機能リクエストや修正サポートは期待しにくく、改善はpull requestの形で受け付けている
diff-pdfが行うこと
- diff-pdf は2つのPDFファイルを引数として受け取り、視覚的に比較する
- デフォルトの出力は終了コードのみ
- 差分が強調されたPDFを作るには
--output-diff オプションを使う
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf
GUI比較モード
--view オプションを使うと、2つのファイルをシンプルな GUI で比較できる
$ diff-pdf --view a.pdf b.pdf
- GUIウィンドウではPDFページを表示し、詳細を拡大できる
- Ctrl 矢印キー、macOSでは Cmd 矢印キーで、2ページの相対位置を移動できる
Ctrl+<、Ctrl+> で左側の文書と右側の文書をそれぞれ表示できる
Ctrl+D でdiff表示に戻れる
- 全オプションの一覧は
$ diff-pdf --help で確認する
バイナリのインストール
$ choco install diff-pdf
$ brew install diff-pdf
$ port install diff-pdf
- FedoraとCentOS 8では、次のコマンドでインストールする
$ sudo dnf install diff-pdf
ソースからのビルド
- ビルドシステムは Automake を使うため、UnixまたはCygwin/MSYSのようなUnixライク環境が必要
- 一般的なビルド手順は次のとおり
$ ./bootstrap
$ ./configure
$ make
$ make install
./bootstrap は、バージョン管理システムからチェックアウトしたソースをビルドする場合、つまり configure と Makefile.in がない場合にのみ必要
- 必要なライブラリは次のとおり
wxWidgets >= 3.0
Cairo >= 1.4
Poppler >= 0.10
プラットフォーム別の依存関係
- CentOSでは、開発ツールとwxGTK、Poppler GLib関連パッケージをインストールする
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
- Ubuntu 24.04 / Debian 12以降では
libwxgtk3.2-dev を使う
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
- 以前のUbuntu / Debianでは
libwxgtk3.0-gtk3-dev を使う
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
- macOSではXcode Command Line Toolsをインストールした後、HomebrewまたはMacPortsで依存関係を管理する
$ xcode-select --install
$ brew install automake autoconf wxmac poppler cairo pkg-config
$ sudo port install automake autoconf wxWidgets-3.0 poppler cairo pkgconfig
- WindowsではCairoとPopplerが使用するライブラリが標準提供されていないため、より多くの依存関係が必要
- fontconfig、freetype、glib、libpng、pixman、gettext、libiconv、libjpeg、zlibなどが含まれる
WindowsでMSYS + MinGWを使ってビルド
- Windowsビルドには MSYS2環境 とC++コンパイラを備えたMinGWのインストールが必要
- MSYS2 MinGWシェルでdiff-pdfのソースディレクトリへ移動する
- 追加のMSYSコンポーネントをインストールする
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
- その後はUnixのビルド手順と同じようにビルドする
$ ./bootstrap # git 저장소에서 빌드할 때만 필요
$ ./configure
$ make
- 必要なDLLを含むZIPアーカイブを作るには、次のコマンドを実行する
$ make windows-dist
インストールとメンテナンス状況
- Unixでは通常の
make install でインストールする
- Windowsでは別途インストールは不要で、ファイルを任意の場所へコピーすればよい
- 上記手順でビルドした場合、必要なファイルは生成されたZIPアーカイブに含まれている
- リポジトリは as-is で提供され、コードは活発に開発されていない
- 改善するには自分で変更し、pull requestを提出する方法が推奨される
- 機能リクエストの実装や修正などのサポートは期待しにくい
1件のコメント
Hacker News の意見
Claude 3.5 Sonnet に PDF.js を使って PDF をキャンバスにレンダリングし、ページごとの視覚的な差分を表示する高速な Web プロトタイプを作らせた
プロンプトは、2つの PDF をドラッグ&ドロップで受け取り、ページを横並びで表示し、差分があれば3枚目の画像として強調表示すること、そして React を一切使わないように書き直すこと、という2つだった
成果物: https://tools.simonwillison.net/compare-pdfs
実際かなりうまく動く。スクリーンショット: https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...
実際の差分を見つけられず、もしかすると自分が幻覚を見ているだけかもしれない
以前の職場で、不安定な本番用出版システムの出力を検証する必要があり、当時利用可能だった PDF 比較ツールを何十個もテストした。その中で最も良かったのは Delta Walker で、プロプライエタリな商用の Mac 専用ソフトウェアだったが、価格は妥当で正確、グラフィックの多い長い PDF もうまく扱えた
この diff-pdf ツールも評価したが、どこかの面で物足りなかった。ただ、かなり昔のことなので具体的な内容は覚えていない。ほとんどのツールは変更を見逃すか偽陽性を出しており、このツールはオープンソースでスクリプト化しやすかっただけに、なおさら惜しかった
関連して、誰かの役に立つかもしれない。ImageMagick で視覚的な PDF 比較ができる
magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"ここで density は 100、
$1と$2は比較するファイル名、$TMPは出力ファイル。このままだと複数ページ対応には追加作業が必要なので、このスクリプトを使っている: https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...このスクリプトは
imgcatでターミナル上に差分を直接表示することもできる。また、convert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:のような方法で、ImageMagick から 知覚ハッシュの差分 も取得できるgit にカスタム diff ツールを設定できる点を利用して、
.gitconfigに[diff "pdf"] command = ~/bin/git-diff-pdfを入れ、.gitattributesには*.pdf binary diff=pdfを設定している。~/bin/git-diff-pdfは poppler のpdftotext -layout出力の差分とpdf-compare-phashを一緒に実行するgit showでこのカスタム diff を使うにはgit show --ext-diffのように引数を追加する必要があるが、git diffでは自動的に使われる医療分野のビジネスクリティカルな PDF 生成アプリ を保守するために、これを CI パイプラインで使ってきた。だいたい2010年ごろに始めたアプリで、使用している RSpec ヘルパーはここにある: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
コードには git に保存された基準 PDF があり、テストスイートがそれを再生成して、何も変わっていないことを検証する
視覚的な変更や PDF ライブラリのアップグレードを監査するのに大いに役立つ
Bob Nystrom が Crafting Interpreters の実際の書籍版に取り組んでいたとき、自分を助けるために作ったツールを思い出した: https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
全文を読む価値はあるが、関連部分だけ見たいなら “I wrote a Dart script that would take a PDF of the book” を検索すればよい
Micro:bit Educational Foundation(microbit.org) で、ハードウェア設計ツールの隙間を埋めるためにこのツールを使ってきており、PCB 設計の反復過程で 回路図とガーバーファイルの視覚的な差分 を確認するのに使っている
結局こういう使い方になったのは少し独特ではあるが、基板の別の部分を些細に修正するときに無線回路の配置がまったく変わっていないことを確実に知りたいなら、視覚的 diff はまさに適している
ただし次のプロジェクトでは、EDA ツールとより統合された方法を試してみたい。同じような道を進んだ人がいれば知りたい
Beyond Compareでも可能。無料ではないが、それほど高価でもない: https://www.scootersoftware.com/
このツールのほうが気に入っている: https://www.qtrac.eu/diffpdf.html
差分を重ねて表示する代わりに、GUIで並べて比較してくれる
--view引数を使うと、シンプルなGUIで2つのファイルを視覚的に比較できる$ diff-pdf --view a.pdf b.pdfウィンドウが開き、それぞれのファイルのページを表示でき、細部を拡大できる。Ctrl+矢印、macOSではCmd+矢印で2つのページの相対位置も移動できるため、位置ずれだけの差分を見つけるのに便利
Fedoraでは
diffpdfパッケージとしてインストールできる。もうメンテナンスはされていないが非常によく動作し、並列表示GUI、ドラッグ&ドロップ、テキストモードと視覚モードの両方に対応しているチームでは、こちらのコード変更後に変わった可能性のあるサードパーティサービスのPDFを比較するために、このツールを定期的に使っている
興味深いことに、GitHubはかなり大きな
wxwin.m4のため、このプロジェクトを46% shellと判断している