2009-08-21 186 views

回答

5

你是什么意思的“差异”? PDF文本或某些布局更改的差异(例如,调整了嵌入式图形的大小)。第一个很容易检测,第二个几乎不可能(PDF是一个非常复杂的文件格式,提供无尽的文件格式功能)。

如果您想获得文本差异,只需在这两个PDF上运行pdf到文本实用程序,然后使用Python的内置差异库来获取转换文本的差异。

这个问题涉及到python中的pdf到文本转换:Python module for converting PDF to text

此方法的可靠性取决于您正在使用的PDF生成器。如果你使用例如Adobe Acrobat和一些基于Ghostscript的PDF-Creator可以从SAME word文档创建两个PDF文件,尽管源文档是相同的,但您仍可能会得到一个diff。

这是因为有很多方法可以将源文档的信息编码为PDF,并且每个转换器使用不同的方法。通常,PDF到文本转换器无法找出正确的文本流,特别是对于复杂的布局或表格。

+0

只是文字会做。 PDF生成器不应该是一个问题。 – Goutham 2009-08-21 09:30:27

+0

如果您确实需要支持图片,您可以从pdf中提取JPG:http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html或将PDF转换为图片并进行比较。 – 2014-10-24 15:24:36

0

检查了这一点,它可能是有用的:http://pybrary.net/pyPdf/

+0

pyPdf在我的测试中不是很健壮。它在由Illustrator/InDesign和其他矢量绘图程序创建的pdf上崩溃。不过,对于来自Office应用程序的简单PDF文件可能没问题。另一个更可靠的选择是来自xpdf工具包的pdftotext。 – fbuchinger 2009-08-21 09:34:49

3

我不知道你的使用情况,但对于脚本生成的PDF使用ReportLab的回归测试,我通过

  1. 转换做差异PDF文件每一页的图像使用ghostsript
  2. 版本比较针对标准的PDF的页面图像的各页,使用PIL

例如

im1 = Image.open(imagePath1) 
im2 = Image.open(imagePath2) 

imDiff = ImageChops.difference(im1, im2) 

这适用于标记由于代码更改而引入的任何更改。

+0

第1步是否有一些参考? – yucer 2016-09-09 07:12:34

2

在我的加密的pdf unittest上遇到了同样的问题,pdfminer和pyPdf都不适合我。

这里有两个命令(pdftocairo,pdftotext)在我的测试中很完美。 (Ubuntu的安装:apt-get的安装poppler的-utils的)

你可以通过PDF内容:

from subprocess import Popen, PIPE 

def get_formatted_content(pdf_content): 
    cmd = 'pdftocairo -pdf - -' # you can replace "pdftocairo -pdf" with "pdftotext" if you want to get diff info 
    ps = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    stdout, stderr = ps.communicate(input=pdf_content) 
    if ps.returncode != 0: 
     raise OSError(ps.returncode, cmd, stderr) 
    return stdout 

好像pdftocairo可以重绘PDF文件,pdftotext可以提取所有文本。

然后你就可以比较两个PDF文件:

c1 = get_formatted_content(open('f1.pdf').read()) 
c2 = get_formatted_content(open('f2.pdf').read()) 
print(cmp(c1, c2)) # for binary compare 
# import difflib 
# print(list(difflib.unified_diff(c1, c2))) # for text compare 
相关问题