0

FileUtils を使用して、2 つの同一の pdf を比較しています。これはコードです:

boolean comparison = FileUtils.contentEquals(pdfFile1, pdfFile2);

両方のpdfファイルが同一であるという事実にもかかわらず、私はfalse. また、実行すると次のことに気付きました。

byte[] byteArray = FileUtils.readFileToByteArray(pdfFile1);
byte[] byteArrayTwo = FileUtils.readFileToByteArray(pdfFile2);
System.out.println(byteArray);
System.out.println(byteArrayTwo);

2 つの pdf ファイルに対して次のバイトコードを取得します。

[B@3a56f631
[B@233d28e3

したがって、両方の pdf ファイルが視覚的に完全に同一であっても、バイトコードが異なるため、ブール値のテストに失敗します。同一のpdfファイルが同一であるかどうかをテストする方法はありますか?

4

3 に答える 3

1

残念ながら、PDF の場合、「同一のファイル」と「視覚的に同一」のファイルには大きな違いがあります。最初の質問は、あなたが探しているものです。

非常に単純な例の 1 つとして、PDF ファイル内の情報を圧縮することも非圧縮にすることも、さまざまな圧縮フィルターで圧縮することもできます。たとえば、一部のコンテンツが圧縮されていないファイルを取得し、そのコンテンツを ZIP 圧縮フィルターで圧縮すると、バイト レベルでは大きく異なりますが、視覚的にはほとんど同じである 2 つのファイルが得られます。

したがって、PDF ファイルを比較するためにさまざまなことができます。

1)「同じファイル」があるかどうかを確認したい場合は、それらを読み込んで、ピーター・ペトロフが以前に回答したように、ある種のチェックサムを計算してください。

2)ファイルが視覚的に同一であるかどうかを知りたい場合、最も一般的な方法は何らかのレンダリングです。すべてのページを画像にレンダリングし、画像を比較します。実際には、これは思ったほど単純ではなく、ある種の「同一性」アルゴリズムを実装する単純なアプリケーション (callas pdfToolbox など) と複雑なアプリケーション (Global Vision DigitalPage など) の両方があります (注意、私は両方に関連しています)。それらのベンダー)。

したがって、最初に必要なものを正確に定義してから、最適なアプローチを慎重に選択してください。

于 2014-04-28T10:10:08.643 に答える
1

はい、両方のファイルから md5 サムを生成します。

これらの合計が同じかどうかを確認します。

もしそうなら、あなたのファイルも
実質的に100%の確実性で同一です.

合計が同一でない場合、
ファイルは確実に異なります。

md5 サムを生成するには、Linux にはmd5sum
コマンドがあり、Windows には という小さなツールがありfcivます。

http://www.microsoft.com/en-us/download/details.aspx?id=11533

于 2014-04-28T09:16:51.403 に答える
1

注意してください、あなたが書いた2つの識別子

[B@3a56f631
[B@233d28e3

これらは 2 つの異なるオブジェクトに属しているため、異なります。これらはオブジェクト識別子であり、バイトコードではありません。2 つのオブジェクトは、厳密に同じオブジェクトでなくても(たとえば、objectID が異なるなど)、論理的に等しい場合があります。

それ以外の場合は、peter.petrov が書いたように MD5 チェックサムを計算することをお勧めします。

于 2014-04-28T09:30:03.683 に答える