**已关闭。**此问题正在寻求有关书籍、工具、软件库等的建议。它不符合Stack Overflow guidelines。当前不接受答案。
我们不允许问题寻求有关书籍、工具、软件库等的推荐。你可以编辑问题,以便可以使用事实和引用来回答问题。
3天前关闭。
社区在3天前审查了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我正在寻找一个Linux命令行工具来比较两个PDF文件,并将差异保存到PDF输出文件。该工具应创建差异PDF的批处理过程。PDF文件是施工图,所以纯文本比较不工作。
比如:
<tool> file1.pdf file2.pdf -o diff-out.pdf
我找到的大多数工具都会将PDF转换为图像并进行比较,但只使用GUI。
任何其他解决办法也是受欢迎的。
5条答案
按热度按时间mrwjdhj31#
我自己写了一个脚本,它做的事情和你要求的差不多。这个脚本使用了4个工具来实现它的目标:
compare
命令pdftk
实用程序(如果您有多页PDF)md5sum
(可选)将其移植到DOS/Windows的
.bat
批处理文件中应该非常容易。**但首先,请注意:**这只适用于页面/介质大小相同的PDF。比较是在两个输入PDF之间逐像素进行的。结果文件是一个显示“差异”的图像,如下所示:
该差异图像被保存为新的PDF,以便在不同的操作系统平台上更好地访问。
例如,当PDF处理中的字体替换开始起作用时,我使用这个方法来发现最小的页面显示差异。
可能会发生这样的情况,即您的PDF之间没有可见的差异,尽管它们在MD5哈希和/或文件大小方面不同。在这种情况下,“diff”输出PDF页面将变为全白。您可以自动发现这种情况,因此您只需通过自动删除全白的PDF来直观地检查非白色PDF。
以下是构建模块:
pdf文件
使用此命令行实用程序将多页PDF文件拆分为多个单页PDF:
如果你只比较1页的PDF,这个构建块是可选的。既然你说的是“施工图”,很可能就是这样。
比较
使用ImageMagick中的此命令行实用程序为每个页面创建“diff”PDF页面:
代笔
由于自动插入的 meta数据(如当前日期+时间),PDF输出不能很好地用于基于MD5散列的文件比较。
如果你想自动发现所有的差异PDF包含纯白色页面的情况,你应该使用
bmp256
输出设备将PDF页面转换为无元数据位图格式。首先,找出PDF的页面大小格式。同样,这个小实用程序
identify
是ImageMagick安装的一部分:可以将此值存储在环境变量中,如下所示:
现在,Ghostscript开始发挥作用,它使用一个命令行,其中包括上面发现的存储在变量中的页面大小:
这会从原始PDF页面生成一个分辨率为72 dpi的PPM(便携式像素Map)。72 dpi通常足以满足我们的需要...接下来,创建一个具有相同页面大小的纯白色PPM页面:
-c "showpage"
部分是一个PostScript命令,它告诉Ghostscript只发出一个空页。MD5总和
使用MD5散列自动比较原始PPM和白页PPM。如果它们相同,您可以假定PDF之间没有差异,因此重命名或删除差异PDF:
这使您不必直观地检查没有任何差异的“diff PDF”。
kupeojn62#
这里有一个黑客做这件事。
zzwlnbp83#
用imagemagick和pdftk(全能版)完成了两行:
选项-verbose和-debug是可选的。
axr492tv4#
2022年,基于将
compare
直接应用到PDF文件的答案对我来说不起作用,似乎这个命令不再能正确处理PDF。但是,
compare
在应用于PNG文件时确实有效。我从前面的答案中提取了一些片段来编写一个不同的脚本。事实上,这是两个不同的脚本,做的事情略有不同:
ComparePdfs.sh
和ComparePdfs2.sh
,将在命令行上执行。这两个脚本都列在此答案的末尾。一些警告
这两个脚本 * 逐页 * 比较两个PDF文件,每对页面都是纯视觉比较(因为页面被转换为PNG)。所以脚本只对平面文本和平面图形敏感。如果两个PDF文件之间的唯一区别涉及一些其他类型的PDF内容-例如逻辑结构元素、注解、表单域、层、视频,3D对象(U3D或PRC)等-两个脚本仍将报告两个PDF相同。
我还没有试图比较PDF文件具体至于一些这种'额外'的内容。
如何判断两个文件(PDF或非PDF)是否具有 * 完全 * 相同的内容
我知道的唯一一种比较是让我们知道两个PDF文件的内容是否在各个方面都完全相同,包括various embedded metadata,如创建日期、文档标题(与第一页显示的任何标题无关)、用于创建PDF的程序等等。
这是相同的方法,可以用来检查 * 任何 * 两个文件(PDF或不)是逐位相同。
要做到这一点,你所要做的就是计算和比较两个文件的校验和。我还包括一个脚本,称为
AreIdentical.sh
。它列在这个问题的最后。下面是如何使用它。假设这两个文件分别命名为“my_first_PDF_file.pdf”和“another_PDF_file.pdf”。那么,在命令行上执行以下命令后,输出文本将显示“same”或“different”,具体取决于这两个文件是相同还是不同。
请注意,在计算校验和时,不会考虑文件的 name 等信息。原因是文件名不是存储在文件本身中,而是存储在文件的目录项中。因此,即使两个文件的文件名不同,也可能会发现它们是相同的;类似地,由于同样的原因,在计算校验和时也不考虑
ls -l
返回的创建日期(与PDF嵌入元数据中的日期相反)。如何使用脚本
ComparePdfs.sh
和ComparePdfs2.sh
我们假设要比较的两个pdf文件file1.pdf和file2.pdf位于工作目录中。
作为示例,假设它们都具有4页,并且除了页3之外所有页都相同。
完全按照行动计划行事
在命令行中,我们执行
在这里,我为输出文件选择了一个特定的名称
dif_in_files.pdf
。执行过程需要一些时间,因为对于两个输入PDF文件,每个单独的页面都必须转换为PNG。正在处理的当前页面在终端中打印。最后,在工作目录中,脚本将生成文件dif_in_files.pdf
,它包含所有页面的差异页面。任何差异都以红色突出显示。如果我们只对不同的页面感兴趣,或者只对它们 * 是否 * 不同感兴趣,那么我们使用
ComparePdfs.sh
。在命令行中,我们执行
在终端中,脚本将输出以下内容:
对于结果不同的页面,并且仅对于这些页面,脚本将创建突出显示差异的文件。在上面的示例中,脚本将仅生成一个名为
difference_page_003.png
的文件。ComparePdfs.sh
的工作原理对于这两个pdf文件中的每一个,我们使用pdftk将其拆分为单独的页面,然后将每个页面转换为PNG。现在我们考虑这两个文件的第一页的PNG。我们为每个文件创建一个校验和(我选择使用
b2sum
来完成此操作)。如果校验和相同,则认为两个文件的第一页相同。
如果校验和不同,我们认为两个文件的第一页不同,并使用
compare
为它们生成一个不同的PNG文件。我们对每一页都重复这个过程,最后,我们删除每一页的所有.pdf和.png文件,除了差异文件。
剧本
这里是
ComparePdfs2.sh
。这里是
ComparePdfs.sh
最后,下面是
AreIdentical.sh
:v7pvogib5#
下面是一个完成的脚本“cmppdf”,它基于linguisticturn的代码,支持比较PDF中的 * 文本 *,并做了一些润色:
https://abhweb.org/jima/cmppdf
文件:
@语言学转:请联系我在脚本中给出的电子邮件,这样我就可以给你适当的信贷!