2つのPDFファイルを比較し、diffをPDF outfileに保存するLinuxコマンドラインツールを探しています。ツールは、diff-pdfをバッチプロセスPDFファイルは構築計画なので、純粋なテキスト比較は機能しません。
何かのようなもの:
<tool> file1.pdf file2.pdf -o diff-out.pdf
私が見つけたほとんどのツールは、PDFを画像に変換して比較しますが、GUIを使用する場合のみです。
他のソリューションも歓迎します。
(全能の)imagemagickとpdftkを2行で実行します。
compare -verbose -debug coder $PDF_1 $PDF_2 -compose src $OUT_FILE.tmp
pdftk $OUT_FILE.tmp background $PDF_1 output $OUT_FILE
オプション-verboseおよび-debugはオプションです。
私はあなたが求めているのと同じようなことをする自分のスクリプトを書きました。スクリプトは、4つのツールを使用してその目的を達成します。
compare
コマンドpdftk
ユーティリティ(複数ページのPDFがある場合)md5sum
(オプション)これをDOS/Windowsの.bat
バッチファイルに移植するのは非常に簡単です。
しかし、最初に注意してください:これは、同じページ/メディアサイズのPDFでのみ機能します。比較は、2つの入力PDF間でピクセルごとに行われます。結果のファイルは、次のような「差分」を示す画像です。
異なるOSプラットフォームでのアクセスを容易にするために、その差分イメージは新しいPDFとして保存されます。
たとえば、これを使用して、PDF処理のフォント置換が機能するようになったときに、ページ表示の最小の違いを発見します。
PDFのハッシュやファイルサイズは異なりますが、PDFに目に見える違いはない可能性があります。この場合、「diff」出力PDFページはすべて白になります。この状態を自動的に検出できるため、すべて白を削除して、白以外のPDFを視覚的に調査するだけで済みます。自動的に。
ビルディングブロックは次のとおりです。
このコマンドラインユーティリティを使用して、マルチページPDFファイルを複数のシングルページPDFに分割します。
pdftk file_1.pdf burst output somewhere/file_1---page_%03d.pdf
pdftk file_2.pdf burst output somewhere/file_2---page_%03d.pdf
1ページのPDFのみを比較する場合、この構成要素はオプションです。あなたは「建設計画」について話しているので、これはおそらくそうです。
ImageMagickの次のコマンドラインユーティリティを使用して、各ページの "diff" PDFページを作成します。
compare \
-verbose \
-debug coder \
-log "%u %m:%l %e" \
somewhere/file_1---page_001.pdf \
somewhere/file_2---page_001.pdf \
-compose src \
somewhereelse/file_1--file_2---diff_page_001.pdf
自動的に挿入されるメタデータ(現在の日付と時刻など)のため、PDF出力は、MD5ハッシュベースのファイル比較ではうまく機能しません。
Diff PDFが真っ白なページで構成されているすべてのケースを自動的に検出したい場合は、PDFページをメタデータのないビットマップに変換する必要があります。 bmp256
出力デバイスを使用してフォーマットします。これは次のように実行できます。
まず、お使いのPDF=のページサイズ形式を確認してください。ここでも、この小さなユーティリティidentify
はImageMagickインストールの一部として提供されています。
identify \
-format "%[fx:(w)]x%[fx:(h)]" \
somewhereelse/file_1--file_2---diff_page_001.pdf
この値は、次のような環境変数に格納できます。
export my_size=$(identify \
-format "%[fx:(w)]x%[fx:(h)]" \
somewhereelse/file_1--file_2---diff_page_001.pdf)
これで、Ghostscriptが機能するようになりました。コマンドラインを使用して、変数に格納されている上記のページサイズを含めます。
gs \
-o somewhereelse/file_1--file_2---diff_page_001.ppm \
-sDEVICE=ppmraw \
-r72 \
-g${my_size} \
somewhereelse/file_1--file_2---diff_page_001.pdf
これにより、元のPPMページから72 dpiの解像度でPDF(Portable PixMap)が得られます。通常、72 dpiで十分です。 ..次に、真っ白なPPM同じページサイズのページを作成します。
gs \
-o somewhereelse/file_1--file_2---whitepage_001.ppm \
-sDEVICE=ppmraw \
-r72 \
-g${my_size} \
-c "showpage"
-c "showpage"
部分は、空のページのみを出力するようにGhostscriptに指示するPostScriptコマンドです。
MD5ハッシュを使用して、元のPPM=ホワイトページPPMと自動的に比較します。両者が同じである場合、PDF間に違いがないと簡単に想定できるため、差分の名前を変更または削除します-PDF:
MD5_1=$(md5sum somewhereelse/file_1--file_2---diff_page_001.ppm | awk '{print $1}')
MD5_2=$(md5sum somewhereelse/file_1--file_2---whitepage_001.ppm | awk '{print $1}')
if [ "x${MD5_1}" == "x${MD5_2}" ]; then
mv \
somewhereelse/file_1--file_2---diff_page_001.pdf \
somewhereelse/file_1--file_2---NODIFFERENCE_page_001.pdf # rename all-white PDF
rm \
somewhereelse/file_1--file_2---*_page_001.ppm # delete both PPMs
fi
これにより、違いのない「diff PDF」を視覚的に検査する必要がなくなります。
これを行うためのハックです。
pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt