我需要找出两个PDF文件之间的区别。有没有人知道有没有Python相关的工具可以直接给出两个PDF的不同之处?
发布于 2009-08-21 01:23:17
你说的“不同”是什么意思?PDF文本的差异或某些布局更改(例如,调整了嵌入图形的大小)。第一个很容易检测,第二个几乎不可能获得(PDF是一种非常复杂的文件格式,它提供了无限的文件格式化功能)。
如果你想得到文本的不同,只需在两个pdf上运行一个pdf to text实用程序,然后使用Python的内置diff库来获得转换后的文本的差异。
这个问题是关于在python:Python module for converting PDF to text中pdf到文本的转换。
此方法的可靠性取决于您使用的PDF生成器。如果您使用Adobe Acrobat和一些基于Ghostscript的PDF-Creator从同一word文档制作两个PDF,尽管源文档是相同的,您可能仍然会得到不同的结果。
这是因为有几十种方法可以将源文档的信息编码为PDF,并且每个转换器使用不同的方法。通常,pdf到文本的转换器不能计算出正确的文本流,特别是复杂的布局或表格。
发布于 2009-08-21 02:17:24
我不知道您的用例,但是对于使用reportlab生成pdf的脚本的回归测试,我通过
e.g
im1 = Image.open(imagePath1)
im2 = Image.open(imagePath2)
imDiff = ImageChops.difference(im1, im2)
在我的例子中,这适用于标记由于代码更改而引入的任何更改。
发布于 2014-02-11 03:14:27
在我的加密pdf单元测试中遇到了同样的问题,pdfminer和pyPdf都不适合我。
这里有两个命令(pdftocairo和pdftotext)非常适合我的测试。(Ubuntu安装: apt-get install 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
https://stackoverflow.com/questions/1310836
复制