linux命令行上的PDF比较

我正在寻找一个Linux命令行工具来比较两个PDF文件并将差异保存到PDF输出文件。该工具应在批处理过程中创建差异pdf。PDF文件是施工图,因此纯文本比较不起作用

比如:

<工具>file1.pdf file2.pdf-o diff-out.pdf

我发现的大多数工具都会将PDF转换为图像并进行比较,但只能使用GUI

我们也欢迎任何其他解决方案

我已经写了我自己的脚本,做了一些类似于你要求的事情。该脚本使用4种工具来实现其目标:

  1. ImageMagick的compare命令
  2. pdftk实用程序(如果您有多页PDF)
  3. 重影脚本(可选)
  4. md5sum(可选)

将其移植到DOS/Windows的.bat批处理文件应该很容易

但首先,请注意:这只适用于具有相同页面/媒体大小的PDF。在两个输入PDF之间逐像素进行比较。结果文件是显示“差异”的图像,如下所示:

  • 保持不变的每个像素将变为白色
  • 每个被改变的像素都被涂成红色

该差异图像保存为新的PDF格式,以便在不同的操作系统平台上更好地访问

我用这个例子来发现当PDF处理中的字体替换开始发挥作用时页面显示的最小差异

可能会出现这样的情况,即PDF之间没有明显的差异,尽管它们在MD5哈希和/或文件大小方面有所不同。在这种情况下,“diff”输出PDF页面将变为全白色。您可以自动发现这种情况,因此您只需通过自动删除所有白色PDF来目视检查非白色PDF

以下是构建模块:

pdftk

使用此命令行实用程序将多页PDF文件拆分为多个单页PDF:

pdftk file\u 1.pdf突发输出某处/file\u 1---page\u03d.pdf
pdftk file_2.pdf突发输出某处/file_2---page_%03d.pdf

如果仅比较1页PDF,则此构建块是可选的。既然你说的是“建设计划”,很可能就是这样

比较

使用ImageMagick中的此命令行实用程序为每个页面创建“diff”PDF页面:

比较\
-冗长的\
-调试编码器\
-日志“%u%m:%l%e”\
某处/文件\u 1–page\u 001.pdf\
某处/文件\u 2–page\u 001.pdf\
-组成src\
其他地方/file_1–file_2–diff_page_001.pdf

鬼书

由于自动插入的元数据(如当前日期+时间),PDF输出对于基于MD5hash的文件比较不起作用

如果要自动发现diff PDF包含纯白色页面的所有情况,应使用bmp256输出设备将PDF页面转换为无元数据位图格式。您可以这样做:

首先,找出PDF的页面大小格式。同样,这个小实用程序identify是任何ImageMagick安装的一部分:

识别\
-格式“%[fx:(w)]x%[fx:(h)]”\
其他地方/file_1--file_2--diff_page_001.pdf

可以将此值存储在环境变量中,如下所示:

导出我的大小=$(识别\
-格式“%[fx:(w)]x%[fx:(h)]”\
其他地方/file_1--file_2--diff_page_001.pdf)

现在,Ghostscript开始发挥作用,它使用一条命令行,其中包括存储在变量中的上述发现的页面大小:

gs\
-o其他地方/文件\u 1--文件\u 2--差异\u页面\u 001.ppm\
-sDEVICE=ppmraw\
-r72\
-g${my_size}\
其他地方/file_1--file_2--diff_page_001.pdf

这将为您提供一个PPM(便携式PixMap),其分辨率为原始PDF页面的72 dpi。72 dpi通常足以满足我们的需要。。。接下来,创建一个具有相同页面大小的纯白色PPM页面:

gs\
-o其他地方/file_1--file_2--whitepage_001.ppm\
-sDEVICE=ppmraw\
-r72\
-g${my_size}\
-c“展示页”

-c“showpage”部分是一个PostScript命令,它告诉Ghostscript只发出一个空页面

MD5总和

使用MD5哈希自动将原始PPM与白页PPM进行比较。如果它们是相同的,您可以简单地假设PDF之间没有差异,因此重命名或删除差异PDF:

MD5_1=$(md5sum somewhere/file_1--file_2--diff_page_001.ppm | awk'{print$1})
MD5_2=$(md5sum somewhere/file_1--file_2--whitepage_001.ppm | awk'{print$1}')
如果[“x${MD5_1}”==“x${MD5_2}”];然后
mv\
其他地方/file_1--file_2--diff_page_001.pdf\
其他地方/file_1--file_2--NODIFFERENCE_page_001.pdf#重命名所有白色pdf
rm\
Somewhere/file_1--file_2--*_page_001.ppm#删除两个ppm
fi

这样您就不必目视检查没有任何差异的“diff PDF”

发表评论