比较两个相同的pdf时,Apache FileUtils会返回false

时间:2014-04-28 09:16:09

标签: java pdf fileutils

我正在使用FileUtils来比较两个相同的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);

我得到两个pdf文件的以下字节码:

[B@3a56f631
[B@233d28e3

因此即使两个pdf文件在视觉上完全相同,它们的字节码也不同,因此布尔测试失败。有没有办法测试相同的pdf文件是否相同?

3 个答案:

答案 0 :(得分:1)

是的,从两个文件生成md5 sum。

看看这些总和是否相同。

如果是,那么你的文件是相同的 实际上也是100%的确定性。

如果总和不相同,则为 你的文件肯定是不同的。

要生成md5总和,在Linux上有一个md5sum
命令,对于Windows,有一个名为fciv的小工具。

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

答案 1 :(得分:1)

请注意,你写的两个标识符

[B@3a56f631
[B@233d28e3

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

否则,计算MD5校验和为peter.petrov写的是一个好主意。

答案 2 :(得分:1)

不幸的是,对于PDF来说,拥有"相同的文件"并且具有视觉上相同的文件"。所以第一个问题是你在寻找什么。

一个非常简单的例子,PDF文件中的信息可以压缩或不压缩,并且可以使用不同的压缩过滤器进行压缩。获取一些文件,其中一些内容未被压缩,并使用ZIP压缩过滤器压缩该内容,这将为您提供两个在字节级别上非常不同但在视觉上非常相同的文件。

因此,您可以做许多不同的事情来比较PDF文件:

1)如果你想检查你是否有#34;同一个文件",请阅读它们并计算某种校验和,如Peter Petrov先前所回答。

2)如果你想知道文件是否在视觉上是相同的,那么最常见的方法是某种渲染。将所有页面渲染为图像并比较图像。在实践中,这并不像听起来那么简单,并且有简单的(例如callas pdfToolbox)和复杂的(例如Global Vision DigitalPage)应用程序,它们实现了某种类型的“同一性”#34;算法(谨慎,我与这两家供应商有关)。

因此,请先详细说明您的确切需求,然后仔细选择最适合的方法。