题
我需要比较大量 PDF 文件的光学内容。由于 PDF 文件是在不同平台和不同版本的软件上创建的,因此存在结构差异。例如:
- 文本的分块可能不同
- 写入顺序可以不同
- 位置可能会有所不同一些像素
它应该像人类一样比较内容而不是内部结构。我想测试我们使用的不同版本的 PDF 生成器之间的回归。
解决方案
因为没有这样的工具可用,所以我们编写了一个。您可以下载 i-net PDF 内容比较器 并使用它。我希望能帮助其他遇到同样问题的人。如果您有问题或有反馈给我们,您可以联系我们的支持人员。
其他提示
实际上有一个 diffpdf 工具。
http://www.qtrac.eu/diffpdf.html
它的弱点是,当添加内容导致新文本部分转移到新页面时,它的反应不佳。例如,如果应将旧第 4 页与第 5 页的末尾和第 6 页的开头进行比较,则需要移动参数以分别比较两个切片。
我使用了一个自制的脚本
- 将两个 PDF 上的所有页面转换为位图
- PDF 1 的彩色页面变为白底红字
- 在 PDF 2 页面上将白色更改为透明
- 将 PDF 2 中的每个页面覆盖在 PDF 1 中相应页面的顶部
- 在多个核心上并行运行转换/着色和叠加
使用的软件:
- 用于 PDF 到位图转换的 GhostScript
- ImageMagick 用于着色、透明度和叠加
- inotify 用于同步并行进程
- 任何支持 PNG 的图像查看器用于查看结果
优点:
- 简单的实现
- 使用的所有工具都是开源的
- 非常适合发现布局中的微小差异
缺点:
- 转换很慢
- PDF 之间的主要差异(例如分页)导致混乱
- 位图不可缩放
- 仅适用于黑白文本和图表
- 没有易于使用的 GUI
我一直在寻找一种可以在 PDF/PostScript 级别执行相同操作的工具。
以下是我们的脚本调用实用程序的方式(请注意,ImageMagick 在幕后使用 GhostScript 进行 PDF->PNG 转换):
$ convert -density 150x150 -fill red -opaque black +antialias 1.pdf back%02d.png
$ convert -density 150x150 -transparent white +antialias 2.pdf front%02d.png
$ composite front01.png back01.png result01.png # do this for all pairs of images
我似乎在这里看不到这个,所以这里是:通过 超级用户:如何比较两个PDF文件之间的差异?(答案#229891,作者:@slestak), , 有
https://github.com/vslavik/diff-pdf
(Ubuntu Natty 的构建步骤可以在 获取 diff-pdf.sh)
据我所知,它基本上覆盖了pdf中每个页面的文本/图形,让您可以轻松查看是否有任何更改...
干杯!
我认为最好的方法是将 PDF 转换为具有合适分辨率的图像,然后进行图像比较。
要从 PDF 生成图像,您可以使用 Adobe PDF Library 或建议的解决方案 将 pdf 文件转换为 tiff 文件的最佳方法.
为了比较生成的 TIFF 文件,我找到了 GNU tiffcmp (对于 Windows 部分 GnuWin32 TIFF) 和 tiff信息 做得很好。使用 tiffcmp -l 并计算输出的行数以查找任何差异。如果您愿意进行少量内容更改(例如抗锯齿差异)然后使用 tiffinfo 计算像素总数,然后可以生成百分比差异值。
顺便说一句,对于任何进行结构未更改的简单 PDF 比较的人来说,可以使用命令行 diff 并忽略某些模式,例如使用 GNU diff 2.7:
diff --brief -I xap: -I xapMM: -I /CreationDate -I /BaseFont -I /ID --binary --text
这仍然存在一个问题,即它并不总是捕获生成的字体名称的更改。
我们的产品,PDF 比较器 - http://www.premediasystems.com/pdfc.html“ - 将非常优雅且高效地完成此操作。它也不是免费的,并且是 Mac OS X 专用的应用程序。
根据您的需求,转换为文本解决方案将是最简单、最直接的。我确实认为位图的想法很酷。
blubeam pdf 软件将为您完成此操作
你可以批量 比较 PDF 使用 Tarkware Pdf Comparer 生成文件。但它不是免费的并且需要 Adobe Acrobat。