java - Apache FileUtils 比较两个相同的 pdf 时不断返回 false

标签 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 文件在视觉上完全相同,但它们的字节码不同,因此无法通过 boolean 测试。有没有办法测试相同的pdf文件是否相同?

最佳答案

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

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

因此您可以执行多种不同的操作来比较 PDF 文件:

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

2)如果您想知道或知道文件在视觉上是否相同,最常见的方法是某种渲染。将所有页面渲染为图像并比较图像。实际上,这并不像听起来那么简单,有简单的(例如 callas pdfToolbox)和复杂的(例如 Global Vision DigitalPage)应用程序实现某种“相同”算法(注意,我与这两种算法都相关)这些供应商)。

因此,首先要明确您到底需要什么,然后仔细选择哪种方法最有效。

关于java - Apache FileUtils 比较两个相同的 pdf 时不断返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23337096/

相关文章:

python - pyPdf IndirectObject in/Rotate

javascript - 如何使用 JavaScript 从 HTML 生成 PDF?

java - 我在这里收到 "incompatible types"错误,但我不明白为什么

java - 带符号的 16 位 PCM 转换不工作。为什么?

javascript - 如何使用 JavaScript 防止 Adob​​e Livecycle 中出现重复的验证消息

通过 FileUtils 复制现有文件时出现 java.io.FileNotFoundException

Spring 表达式读取文件内容

java - 在 jMeter 2.12 版的工作台 > 添加 > 非测试元素中找不到 HTTP 代理服务器选项

java - 为什么当流量较高时 vmop(Java GC Options) 会增加