我正在寻找一个Linux命令行工具来比较两个PDF文件,并保存到PDF输出文件的差异。该工具应该在批处理过程中创建diff-pdf。PDF文件是施工平面图,所以纯文本比较不起作用。
类似于:
<tool> file1.pdf file2.pdf -o diff-out.pdf我发现的大多数工具都将PDF转换为图像并进行比较,但只使用GUI。
任何其他的解决方案也是受欢迎的。
发布于 2011-08-29 16:55:24
使用(万能的) imagemagick和pdftk用两行代码完成:
compare -verbose -debug coder $PDF_1 $PDF_2 -compose src $OUT_FILE.tmp
pdftk $OUT_FILE.tmp background $PDF_1 output $OUT_FILE选项-verbose和-debug是可选的。
合并
发布于 2011-06-27 22:24:30
我已经写了我自己的脚本,它可以做一些类似于你所要求的事情。该脚本使用4个工具来实现其目标:
compare命令
pdftk实用程序(如果您有多页ImageMagick(可选)将其移植到.bat批处理文件中应该非常容易。
但首先,请注意:这只适用于具有相同页面/媒体大小的PDF。比较是在两个输入PDF之间逐个像素进行的。生成的文件是一个显示"diff“的图像,如下所示:
该比较图像将另存为新的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中的此命令行实用程序为每个页面创建一个"diff“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.pdfGhostscript
由于自动插入的元数据(例如当前的date+time),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这将为您提供一个分辨率为72dpi的原始PixMap页面的PPM (便携PDF )。通常72 dpi就足够满足我们的需求了。接下来,创建一个页面大小相同的纯白色PPM页面:
gs \
-o somewhereelse/file_1--file_2---whitepage_001.ppm \
-sDEVICE=ppmraw \
-r72 \
-g${my_size} \
-c "showpage"Ghostscript是一个PostScript命令,它告诉-c "showpage"只发出一个空页面。
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这使您不必在视觉上检查没有任何差异的"diff PDF“。
发布于 2011-06-24 23:34:30
下面是一个实现这一点的技巧。
pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txthttps://stackoverflow.com/questions/6469157
复制相似问题