1 ポイント 投稿者 GN⁺ 2024-07-03 | 1件のコメント | WhatsAppで共有
  • 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ファイルを引数として受け取り、視覚的に比較する
  • デフォルトの出力は終了コードのみ
    • 差分がなければ 0
    • 2つのPDFが異なれば 1
  • 差分が強調された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+> で左側の文書と右側の文書をそれぞれ表示できる
    • macOSでは Cmd+<Cmd+> を使用
  • Ctrl+D でdiff表示に戻れる
  • 全オプションの一覧は $ diff-pdf --help で確認する

バイナリのインストール

  • Windows向けの事前ビルド版は latest release のZIPアーカイブとして提供されている
    • 展開した場所ならどこからでも実行できる
  • Windowsで Chocolatey を使う場合は、次のコマンドでインストールする
$ choco install diff-pdf
  • macOSで Homebrew を使う場合は、次のコマンドでインストールする
$ brew install diff-pdf
  • macOSで MacPorts を使う場合は、次のコマンドでインストールする
$ port install diff-pdf
  • FedoraとCentOS 8では、次のコマンドでインストールする
$ sudo dnf install diff-pdf

ソースからのビルド

  • ビルドシステムは Automake を使うため、UnixまたはCygwin/MSYSのようなUnixライク環境が必要
  • 一般的なビルド手順は次のとおり
$ ./bootstrap
$ ./configure
$ make
$ make install
  • ./bootstrap は、バージョン管理システムからチェックアウトしたソースをビルドする場合、つまり configureMakefile.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件のコメント

 
GN⁺ 2024-07-03
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...

    • Claude 3.5 を効果的に使う方法が気になる。数日前に API アクセスを申請したが、console.anthropic.com 以外で、API キーを入れてローカルで Claude をうまく活用できるようなツールがあればおすすめしてほしい
    • あのプロンプトだけでここまで作るには、追加作業がどれくらい必要だったのか気になる。かなり印象的
    • 4日経ったコメントに突っ込むのは難しいが、2つの PDF の違いが何なのか分からない
      実際の差分を見つけられず、もしかすると自分が幻覚を見ているだけかもしれない
  • 以前の職場で、不安定な本番用出版システムの出力を検証する必要があり、当時利用可能だった PDF 比較ツールを何十個もテストした。その中で最も良かったのは Delta Walker で、プロプライエタリな商用の Mac 専用ソフトウェアだったが、価格は妥当で正確、グラフィックの多い長い PDF もうまく扱えた
    この diff-pdf ツールも評価したが、どこかの面で物足りなかった。ただ、かなり昔のことなので具体的な内容は覚えていない。ほとんどのツールは変更を見逃すか偽陽性を出しており、このツールはオープンソースでスクリプト化しやすかっただけに、なおさら惜しかった

    • Delta Walker は今では Windows と Linux もサポートしているようだ: https://www.deltawalker.com/download
    • 「Draftable」は素晴らしかった
    • ページを画像としてエクスポートしてから ピクセル差分 を比較すれば、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 では自動的に使われる

    • git 属性までつなげているのは一段上だ。ImageMagick を10〜20年使っていても、いまだにその強力さに驚かされる。本当に刺激を受けるオープンソースソフトウェアだ
  • 医療分野のビジネスクリティカルな PDF 生成アプリ を保守するために、これを CI パイプラインで使ってきた。だいたい2010年ごろに始めたアプリで、使用している RSpec ヘルパーはここにある: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
    コードには git に保存された基準 PDF があり、テストスイートがそれを再生成して、何も変わっていないことを検証する
    視覚的な変更や PDF ライブラリのアップグレードを監査するのに大いに役立つ

    • 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/

    • Beyond Compareは、雇用主が買ってくれるのを待たずに自腹で払う価値のあるツールの一つ。価格に対して機能が非常に充実しており、クロスプラットフォームで、ライセンスも非常に寛大。BCに匹敵する自由なオープンソースの比較ツールはない
  • このツールのほうが気に入っている: https://www.qtrac.eu/diffpdf.html
    差分を重ねて表示する代わりに、GUIで並べて比較してくれる

    • GitHubの説明によると、--view引数を使うと、シンプルなGUIで2つのファイルを視覚的に比較できる
      $ diff-pdf --view a.pdf b.pdf
      ウィンドウが開き、それぞれのファイルのページを表示でき、細部を拡大できる。Ctrl+矢印、macOSではCmd+矢印で2つのページの相対位置も移動できるため、位置ずれだけの差分を見つけるのに便利
    • これにはオープンソース/無料版もあり、定期的に使っている: https://www.qtrac.eu/diffpdf-foss.html
      Fedoraではdiffpdfパッケージとしてインストールできる。もうメンテナンスはされていないが非常によく動作し、並列表示GUI、ドラッグ&ドロップ、テキストモードと視覚モードの両方に対応している
    • この用途にはBeyondCompare 5を使っている
  • チームでは、こちらのコード変更後に変わった可能性のあるサードパーティサービスのPDFを比較するために、このツールを定期的に使っている

  • 興味深いことに、GitHubはかなり大きなwxwin.m4のため、このプロジェクトを46% shellと判断している

    • 個人の非公開プロジェクトでも似たようなことを見たことがある。GitHubの言語比率分析は壊れているようだ。Pythonプロジェクトで、Jupyterノートブックは数個しかなく、Pythonファイルが非常に多い。コード行数では80%がPythonファイルのはずなのに、GitHubはプロジェクトを50% Jupyterと見なしている