0

I am using FileUtils to compare two identical pdfs. This is the code:

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

Despite the fact that both pdf files are identical, I keep getting false. I also noticed that when I execute:

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

I get the following bytecode for the two pdf files:

[B@3a56f631
[B@233d28e3

So even though both pdf files are absolutely identical visually, their byte-code is different and hence failing the boolean test. Is there any way to test whether the identical pdf files are identical?

4

3 回答 3

1

不幸的是,对于 PDF,拥有“相同文件”和拥有“视觉上相同”的文件之间存在很大差异。所以第一个问题是你在寻找什么。

一个非常简单的示例,PDF 文件中的信息可以压缩或不压缩,并且可以使用不同的压缩过滤器进行压缩。拿一个部分内容未压缩的文件,并使用 ZIP 压缩过滤器压缩该内容,将得到两个在字节级别上非常不同但在视觉上非常相同的文件。

所以你可以做很多不同的事情来比较 PDF 文件:

1)如果您想检查您是否有“相同的文件”,请将它们读入并计算 Peter Petrov 之前回答的某种校验和。

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

请注意,您编写的两个标识符

[B@3a56f631
[B@233d28e3

是不同的,因为它们属于两个不同的对象。这些是对象标识符,而不是字节码。两个对象可以在逻辑上相等,即使它们不是完全相同的对象(例如,它们具有不同的 objectID)。

否则,像 peter.petrov 所写的那样计算 MD5 校验和是个好主意。

于 2014-04-28T09:30:03.683 回答