首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux命令行上的PDF比较

linux命令行上的PDF比较
EN

Stack Overflow用户
提问于 2011-06-24 22:22:03
回答 4查看 28.3K关注 0票数 35

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

类似于:

代码语言:javascript
复制
<tool> file1.pdf file2.pdf -o diff-out.pdf

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

任何其他的解决方案也是受欢迎的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-29 16:55:24

使用(万能的) imagemagick和pdftk用两行代码完成:

代码语言:javascript
复制
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是可选的。

  • compare创建一个diff为红色像素的PDF。
  • pdftk将diff-pdf与background PDF_1

合并

票数 4
EN

Stack Overflow用户

发布于 2011-06-27 22:24:30

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

  • ImageMagick的compare命令

  • pdftk实用程序(如果您有多页ImageMagick(可选)

将其移植到.bat批处理文件中应该非常容易。

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

  • 保持不变的每个像素都会变成白色。
  • 更改后的每个像素都被绘制为红色。

该比较图像将另存为新的PDF,以便更好地在不同操作系统平台上进行访问。

例如,当PDF处理中的字体替换开始发挥作用时,我正在使用它来发现最小的页面显示差异。

这可能会发生,你的PDF之间没有明显的区别,尽管它们在MD5哈希值和/或文件大小上是不同的。在这种情况下,"diff“输出PDF页面将变成全白。您可以自动发现这种情况,因此您只需通过自动删除全白色PDF来直观地调查非白色PDF。

以下是构建块:

pdftk

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

代码语言:javascript
复制
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页面:

代码语言:javascript
复制
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

Ghostscript

由于自动插入的元数据(例如当前的date+time),PDF输出不能很好地用于基于MD5hash的文件比较。

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

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

代码语言:javascript
复制
 identify \
   -format "%[fx:(w)]x%[fx:(h)]" \
    somewhereelse/file_1--file_2---diff_page_001.pdf

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

代码语言:javascript
复制
 export my_size=$(identify \
   -format "%[fx:(w)]x%[fx:(h)]" \
    somewhereelse/file_1--file_2---diff_page_001.pdf)

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

代码语言:javascript
复制
 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页面:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 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“。

票数 51
EN

Stack Overflow用户

发布于 2011-06-24 23:34:30

下面是一个实现这一点的技巧。

代码语言:javascript
复制
pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6469157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档