2009-08-21 184 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 
相關問題