2 つの PDF ファイルを比較するためのシンプルな Java ライブラリ。ファイルはピクセルごとにレンダリングされ、比較されます。テキストの比較はありません。
依存関係として含めるだけです。利用可能な最新バージョンを確認してください。
< dependencies >
< dependency >
< groupId >de.redsix</ groupId >
< artifactId >pdfcompare</ artifactId >
< version >...</ version > <!-- see current version in the maven central tag above -->
</ dependency >
</ dependencies >
追加の引数を指定せずに jar ファイルを開始すると、単純な対話型 UI が表示されます (これにより、クラス de.redsix.pdfcompare.Main が開始されます)。これにより、比較するファイルを選択したり、無視する領域をマークして無視ファイルに書き込むことができます。
UI の隣で、CLI を介して、予期される実際のファイルと追加パラメータを指定できます。 CLI のヘルプを表示するには、-h または --help オプションを使用します。
usage: java -jar pdfcompare-x.x.x-full.jar [EXPECTED] [ACTUAL]
-h,--help Displays this text and exit
...
しかし、PdfCompare の焦点はライブラリとしての埋め込み使用にあります。
new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare (). writeTo ( "diffOutput" );
これにより、見つかった相違点のマークが含まれる出力 PDF が生成されます。 PdfCompare は、expected.pdf のページと、actual.pdf の同じページをビットマップ イメージにレンダリングし、これら 2 つのイメージをピクセルごとに比較します。等しいピクセルは少し薄くなります。異なるピクセルは赤と緑でマークされます。緑色は、expected.pdf には存在するが、actual.pdf には存在しないピクセルを示します。赤色は、actual.pdf には存在するが、expected.pdf には存在しなかったピクセルを示します。また、紙の端には、異なる領域をすぐに見つけられるように、マゼンタ色のマークが付いています。無視された領域は黄色の背景でマークされます。予期されたのに表示されなかったページには、赤い枠線が表示されます。表示されたものの予期していなかったページには、緑色の枠線が表示されます。
Compare メソッドは CompareResult を返します。これはクエリできます。
final CompareResult result = new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare ();
if ( result . isNotEqual ()) {
System . out . println ( "Differences found!" );
}
if ( result . isEqual ()) {
System . out . println ( "No Differences found!" );
}
if ( result . hasDifferenceInExclusion ()) {
System . out . println ( "Differences in excluded areas found!" );
}
result . getDifferences (); // returns page areas, where differences were found
便宜上、writeTo は等しいステータスも返します。
boolean isEquals = new PdfComparator ( "expected.pdf" , "actual.pdf" ). compare (). writeTo ( "diffOutput" );
if (! isEquals ) {
System . out . println ( "Differences found!" );
}
比較メソッドは、文字列、ファイル、パス、または入力ストリームなどのファイル名を使用して呼び出すことができます。
比較中に無視される長方形の領域を定義することもできます。そのためには、無視する領域を定義するファイルを作成する必要があります。ファイル形式は JSON (実際には HOCON と呼ばれるスーパーセット) で、次の形式になります。
exclusions: [
{
page : 2
x1 : 300 // entries without a unit are in pixels. Pdfs are rendered by default at 300DPI
y1 : 1000
x2 : 550
y2 : 1300
} ,
{
// page is optional. When not given, the exclusion applies to all pages.
x1 : 130.5 mm // entries can also be given in units of cm, mm or pt (DTP-Point defined as 1/72 Inches)
y1 : 3.3 cm
x2 : 190 mm
y2 : 3.7 cm
} ,
{
page : 7
// coordinates are optional. When not given, the whole page is excluded.
}
]
指定された除外ファイルが見つからない場合、そのファイルは無視され、除外なしで比較が実行されます。
コードでは次のように除外が提供されます。
new PdfComparator ( "expected.pdf" , "actual.pdf" ). withIgnore ( "ignore.conf" ). compare ();
あるいは、次のように API を介して除外を追加することもできます。
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withIgnore ( new PageArea ( 1 , 230 , 350 , 450 , 420 ))
. withIgnore ( new PageArea ( 2 ))
. compare ();
パスワードで保護された PDF ファイルを比較する場合は、withExpectedPassword(String password) メソッドまたは withActualPassword(String password) メソッドをそれぞれ使用してコンパレータにパスワードを与えることができます。
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withExpectedPassword ( "somePwd" )
. withActualPassword ( "anotherPwd" )
. compare ();
PdfCompare は構成ファイルを使用して構成できます。デフォルトの構成ファイルは「application.conf」と呼ばれ、クラスパスのルートに配置する必要があります。
PdfCompare は、Lightbend Config (以前は TypeSafe Config と呼ばれていました) を使用して構成ファイルを読み取ります。別の構成ファイルを指定する場合は、https://github.com/lightbend/config#standard-behavior で詳細を確認できます。特に、-Dconfig.file=path/to/file コマンド ライン引数を使用して、置換構成ファイルを指定できます。
あるいは、システム環境変数を通じて、または -DvariableName= を使用した Jvm パラメータとしてパラメータを指定することもできます。
別の構成の場所をプログラムで指定するもう 1 つの方法は、新しい ConfigFileEnvironment(...) を作成し、それを PdfCompare.withEnvironment(...) に渡すことです。
application.conf ファイルを通じて変更できるすべての設定は、API を通じてプログラム的に変更することもできます。これを行うには、次のコードを使用できます。
new PdfComparator ( "expected.pdf" , "actual.pdf" )
. withEnvironment ( new SimpleEnvironment ()
. setActualColor ( Color . green )
. setExpectedColor ( Color . blue ))
. compare ();
SimpleEnvironment は、割り当てられていないすべての設定をデフォルトの環境に委任します。
この環境を通じて、メモリ設定 (上記を参照) と次の設定を構成できます。
DPI=300
PDF ページのレンダリングに使用する DPI を設定します。デフォルトは 300 です。
ExpectedColor=00B400 (緑)
期待される色は、期待されたが存在しないピクセルに使用される色です。色は HTML-Stlye 形式 (先頭の「#」なし) で指定されます。最初の 2 文字は、色の赤色部分を 16 進数で定義します。次の 2 文字は、色の緑色の部分を定義します。最後の 2 文字は、使用する色の青色の部分を定義します。
実際の色=D20000 (赤)
実際の色は、存在するが予期されなかったピクセルに使用される色です。色は HTML-Stlye 形式 (先頭の「#」なし) で指定されます。最初の 2 文字は、色の赤色部分を 16 進数で定義します。次の 2 文字は、色の緑色の部分を定義します。最後の 2 文字は、使用する色の青色の部分を定義します。
tempDir=System.property("java.io.tmpdir")
一時ファイルを書き込むディレクトリを設定します。デフォルトは java.io.tmpdir の Java デフォルトです。これは通常、ほとんどの UNIX システムの /tmp など、システム固有のデフォルトを決定します。
allowedDifferenceInPercentPerPage=0.2
ページごとに異なる可能性があるピクセルのパーセント。デフォルトは 0 です。何らかの理由でレンダリングが少しずれている場合、またはある程度の誤差を許容できる場合は、比較中に無視されるピクセルの割合を設定できます。そうすることで、指定された割合を超えるピクセルが異なる場合にのみ、差分が報告されます。パーセンテージはページごとに計算されます。 addEqualPagesToResult を実行するときに、出力ファイル内で相違点がマークされるわけではありません。
並列処理=true
false に設定すると、すべての並列処理が無効になり、すべてが単一スレッドで処理されます。
addEqualPagesToResult=true
false に設定すると、差分のあるページのみが結果に追加され、これが差分 PDF ドキュメントになります。
failedOnMissingIgnoreFile=false
true に設定すると、無視ファイルが存在しないと例外が発生します。それ以外の場合は無視され、情報レベルのログ メッセージのみが書き込まれます。
CompareResults には、異なる特性を持ついくつかの異なる実装があります。これを使用して、システム動作の特定の側面、特にメモリ消費を制御できます。
PdfCompare を使用する場合は、内部構造についていくつか知っておくとよいでしょう。 PdfCompare が 2 つの PDF を比較するときに行うことを簡単に説明します。
PdfCompare は、Apache PdfBox ライブラリを使用して PDF の読み取りと書き込みを行います。
そのため、大きな PDF を比較すると、大量のメモリが消費される可能性があります。 PdfBox を使用して差分の PDF をページごとに段階的に書き込む方法はまだ見つかりませんでしたが、いくつかの回避策があります。
現在、2 つの異なる CompareResults があり、ページをディスクにスワップしてメモリ消費を制限するための異なる戦略を持っています。
別の CompareResult 実装は次のように使用できます。
new PdfComparator ( "expected.pdf" , "actual.pdf" , new CompareResultWithPageOverflow ()). compare ();
また、メモリ制限に関する内部設定がいくつかあり、変更できます。 「application.conf」というファイルをクラスパスのルートに追加するだけです。このファイルには、ここで指定されているデフォルトを上書きするために、次の設定の一部またはすべてを含めることができます。
imageCacheSizeCount=30
PdfBox によってキャッシュされる画像の数
maxImageSizeInCache=100000
非常に大きな画像がキャッシュされるのを防ぐための、キャッシュされる画像のおおよその最大サイズ
mergeCacheSizeMB=100
PDF が部分的に書き込まれ、後でマージされる場合、これはマージを実行する PdfBox インスタンス用に構成されたメモリ キャッシュです。
スワップキャッシュサイズMB=100
PDF が部分的に書き込まれる場合、これは部分的な書き込みを行う PdfBox インスタンス用に構成されたメモリ キャッシュです。
documentCacheSizeMB=200
これは、比較されるドキュメントをロードする PdfBox インスタンスに設定されたキャッシュ サイズです。
並列処理=true
false に設定すると、すべての並列処理が無効になり、すべてが単一スレッドで処理されます。
全体的なタイムアウト時間=15
全体的なタイムアウトを設定します。これは、デッドロックの可能性を検出するための安全対策です。複雑な比較には時間がかかる場合があるため、この値を増やす必要がある場合があります。
executorTimeoutInSeconds=60
totalTimeout に達した後、エグゼキュータが終了するまで待機するタイムアウトを設定します。これを変更する必要はほとんどありません。
したがって、このデフォルト構成では、PdfBox はディスクにスワップする前にキャッシュに最大 400MB の Ram を使用する必要があります。私には、JVM に 2GB のヒープ領域を付与する経験があります。
メモリ不足の問題の診断を支援し、生成された PDF の部分的な書き込みとマージのアイデアを提供してくれた Chethan Rao [email protected] に深く感謝します。