web-dev-qa-db-ja.com

PDF Linuxコマンドラインで比較

2つのPDFファイルを比較し、diffをPDF outfileに保存するLinuxコマンドラインツールを探しています。ツールは、diff-pdfをバッチプロセスPDFファイルは構築計画なので、純粋なテキスト比較は機能しません。

何かのようなもの:

<tool> file1.pdf file2.pdf -o diff-out.pdf

私が見つけたほとんどのツールは、PDFを画像に変換して比較しますが、GUIを使用する場合のみです。

他のソリューションも歓迎します。

28

(全能の)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はオプションです。

  • 比較は、PDF差分を赤いピクセルとして作成します。
  • pdftkはdiff-pdfと背景PDF_1をマージします
5

私はあなたが求めているのと同じようなことをする自分のスクリプトを書きました。スクリプトは、4つのツールを使用してその目的を達成します。

  1. ImageMagickのcompareコマンド
  2. pdftkユーティリティ(複数ページのPDFがある場合)
  3. ゴーストスクリプト(オプション)
  4. md5sum(オプション)

これをDOS/Windowsの.batバッチファイルに移植するのは非常に簡単です。

しかし、最初に注意してください:これは、同じページ/メディアサイズのPDFでのみ機能します。比較は、2つの入力PDF間でピクセルごとに行われます。結果のファイルは、次のような「差分」を示す画像です。

  • 変更されないままの各ピクセルは白になります。
  • 変更された各ピクセルは赤で塗られます。

異なるOSプラットフォームでのアクセスを容易にするために、その差分イメージは新しいPDFとして保存されます。

たとえば、これを使用して、PDF処理のフォント置換が機能するようになったときに、ページ表示の最小の違いを発見します。

PDFのハッシュやファイルサイズは異なりますが、PDFに目に見える違いはない可能性があります。この場合、「diff」出力PDFページはすべて白になります。この状態を自動的に検出できるため、すべて白を削除して、白以外のPDFを視覚的に調査するだけで済みます。自動的に。

ビルディングブロックは次のとおりです。

pdftk

このコマンドラインユーティリティを使用して、マルチページ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合計

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」を視覚的に検査する必要がなくなります。

39
Kurt Pfeifle

これを行うためのハックです。

pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt
24
xevincent