我已经编写了自己的脚本,该脚本的功能与您的要求相似。该脚本使用 4 个工具来实现其目标:
- ImageMagick 的
compare 命令
-
pdftk 实用程序(如果您有多页 PDF)
- Ghostscript(可选)
-
md5sum(可选)
将它移植到 DOS/Windows 的 .bat 批处理文件应该很容易。
但首先,请注意:这仅适用于具有相同页面/媒体大小的 PDF。在两个输入 PDF 之间逐个像素地进行比较。生成的文件是显示“差异”的图像,如下所示:
- 保持不变的每个像素都变成白色。
- 每个被更改的像素都被涂成红色。
该差异图像被保存为新的 PDF,以便在不同的操作系统平台上更好地访问。
例如,当 PDF 处理中的字体替换发挥作用时,我使用它来发现最小的页面显示差异。
您的 PDF 之间可能没有明显的差异,尽管它们的 MD5 哈希值和/或文件大小不同。在这种情况下,“diff”输出 PDF 页面将变为全白。您可以自动发现这种情况,因此您只需通过自动删除全白 PDF 来直观地调查非白色 PDF。
这里是构建块:
pdftk
使用此命令行实用程序将多页 PDF 文件拆分为多个单页 PDF:
pdftk file_1.pdf burst output somewhere/file_1---page_%03d.pdf
pdftk file_2.pdf burst output somewhere/file_2---page_%03d.pdf
如果您只比较单页 PDF,则此构建块是可选的。既然你说的是“建设计划”,那很可能就是这样。
比较
使用 ImageMagick 中的这个命令行实用程序为每个页面创建一个“差异”PDF 页面:
compare \
-verbose \
-debug coder \
-log "%u %m:%l %e" \
somewhere/file_1---page_001.pdf \
somewhere/file_2---page_001.pdf \
-compose src \
somewhereelse/file_1--file_2---diff_page_001.pdf
鬼脚本
由于自动插入元数据(例如当前日期+时间),PDF 输出不适用于基于 MD5hash 的文件比较。
如果您想自动发现差异 PDF 包含纯白页的所有情况,您应该使用 bmp256 输出设备将 PDF 页面转换为无元数据位图格式。你可以这样做:
首先,找出您的 PDF 的页面大小格式是什么。同样,这个小实用程序identify 是任何 ImageMagick 安装的一部分:
identify \
-format "%[fx:(w)]x%[fx:(h)]" \
somewhereelse/file_1--file_2---diff_page_001.pdf
您可以像这样将该值存储在环境变量中:
export my_size=$(identify \
-format "%[fx:(w)]x%[fx:(h)]" \
somewhereelse/file_1--file_2---diff_page_001.pdf)
现在 Ghostscript 开始发挥作用,使用包含上述发现的页面大小的命令行,因为它存储在变量中:
gs \
-o somewhereelse/file_1--file_2---diff_page_001.ppm \
-sDEVICE=ppmraw \
-r72 \
-g${my_size} \
somewhereelse/file_1--file_2---diff_page_001.pdf
这为您提供了一个分辨率为 72 dpi 的 PPM(便携式 PixMap),来自原始 PDF 页面。 72 dpi 通常足以满足我们的需求...接下来,创建一个具有相同页面大小的纯白色 PPM 页面:
gs \
-o somewhereelse/file_1--file_2---whitepage_001.ppm \
-sDEVICE=ppmraw \
-r72 \
-g${my_size} \
-c "showpage"
-c "showpage" 部分是一个 PostScript 命令,它告诉 Ghostscript 只发出一个空页面。
MD5 和
使用 MD5 哈希自动比较原始 PPM 和白页 PPM。如果它们相同,您可以假设 PDF 之间没有差异,因此重命名或删除 diff-PDF:
MD5_1=$(md5sum somewhereelse/file_1--file_2---diff_page_001.ppm | awk '{print $1}')
MD5_2=$(md5sum somewhereelse/file_1--file_2---whitepage_001.ppm | awk '{print $1}')
if [ "x${MD5_1}" == "x${MD5_2}" ]; then
mv \
somewhereelse/file_1--file_2---diff_page_001.pdf \
somewhereelse/file_1--file_2---NODIFFERENCE_page_001.pdf # rename all-white PDF
rm \
somewhereelse/file_1--file_2---*_page_001.ppm # delete both PPMs
fi
这使您不必目视检查没有任何差异的“差异 PDF”。