使用 Python 檢查兩個 PDF 文件是否相同
PDF 檔案廣泛用於共享文件,並且經常需要檢查兩個 PDF 檔案是否相同。比較 PDF 檔案有多種方法,Python 提供了幾個庫來完成此任務。在本文中,我們將討論在 Python 中檢查 PDF 是否相同的方法。
方法 1:使用 PyPDF2
PyPDF2 是一個可以操作 PDF 檔案的 Python 庫。它提供了幾種從 PDF 檔案中提取資料的方法,包括文字、影像和元資料。PyPDF2 還支援合併、拆分和加密 PDF 檔案。我們可以使用 PyPDF2 透過迭代其頁面並比較其內容來比較兩個 PDF 檔案。
示例
以下程式碼片段演示瞭如何使用 PyPDF2 比較兩個 PDF 檔案:
import PyPDF2
def compare_pdfs(file1, file2):
pdf1 = PyPDF2.PdfReader(open(file1, "rb"))
pdf2 = PyPDF2.PdfReader(open(file2, "rb"))
if pdf1.getNumPages() != pdf2.getNumPages():
return False
for i in range(pdf1.getNumPages()):
page1 = pdf1.getPage(i)
page2 = pdf2.getPage(i)
if page1.extract_text() != page2.extract_text():
return False
return True
if __name__ == '__main__':
file1 = "pdf1.pdf"
file2 = "pdf2.pdf"
if compare_pdfs(file1, file2):
print("PDFs are identical")
else:
print("PDFs are not identical")
在上面的程式碼中,我們定義了一個 **compare_pdfs** 函式,該函式以兩個 PDF 檔案作為引數。我們使用 PyPDF2 的 **PdfReader** 方法讀取 PDF 檔案,並使用 extract_text 方法比較其頁面內容。
如果 PDF 檔案的頁面數不同,我們將立即返回 False,表示 PDF 不相同。否則,我們將比較兩個 PDF 檔案中每個頁面的內容。如果任意兩個頁面的內容不同,我們將返回 False。否則,我們將返回 True,表示 PDF 相同。
方法 2:使用 pdftotext
**pdftotext** 是一個將 PDF 檔案轉換為純文字的命令列實用程式。我們可以使用 pdftotext 從兩個 PDF 檔案中提取文字,並使用 Python 比較它們。此方法需要在系統上安裝 pdftotext。
示例
以下程式碼片段演示瞭如何使用 **pdftotext** 比較兩個 PDF 檔案:
import os
import subprocess
def compare_pdfs(file1, file2):
temp_file1 = "temp_file1.txt"
temp_file2 = "temp_file2.txt"
subprocess.call(['pdftotext', file1, temp_file1])
subprocess.call(['pdftotext', file2, temp_file2])
with open(temp_file1, "r") as f1, open(temp_file2, "r") as f2:
if f1.read() == f2.read():
return True
else:
return False
os.remove(temp_file1)
os.remove(temp_file2)
if __name__ == '__main__':
file1 = "pdf1.pdf"
file2 = "pdf2.pdf"
if compare_pdfs(file1, file2):
print("PDFs are identical")
else:
print("PDFs are not identical")
在上面的程式碼中,我們定義了一個 compare_pdfs 函式,該函式以兩個 PDF 檔案作為引數。我們使用 subprocess 模組透過 call() 函式呼叫 pdftotext 命令列實用程式,該函式接受兩個引數。第一個引數是要執行的命令列命令,第二個引數是傳遞給命令的引數列表。
pdftotext 命令列實用程式將 PDF 檔案轉換為純文字檔案,並將它們儲存在臨時檔案 temp_file1.txt 和 temp_file2.txt 中。然後,我們使用 Python 的 open() 函式和 read() 方法比較這兩個臨時檔案的內容。如果兩個檔案的內容相同,我們將返回 True,表示 PDF 相同。否則,我們將返回 False。
最後,我們將使用 os.remove() 函式刪除臨時檔案。
方法 3:使用 difflib
**difflib** 是一個提供一系列用於比較序列的工具的 Python 庫。我們可以使用 difflib 比較從兩個 PDF 檔案中提取的文字,並確定它們之間的差異。
示例
以下程式碼片段演示瞭如何使用 difflib 比較兩個 PDF 檔案:
import difflib
import PyPDF2
def compare_pdfs(file1, file2):
pdf1 = PyPDF2.PdfReader(open(file1, "rb"))
pdf2 = PyPDF2.PdfReader(open(file2, "rb"))
if pdf1.getNumPages() != pdf2.getNumPages():
return False
for i in range(pdf1.getNumPages()):
page1 = pdf1.getPage(i)
page2 = pdf2.getPage(i)
text1 = page1.extract_text().splitlines()
text2 = page2.extract_text().splitlines()
diff = difflib.ndiff(text1, text2)
if any(line.startswith("+ ") or line.startswith("- ") for line in diff):
return False
return True
if __name__ == '__main__':
file1 = "pdf1.pdf"
file2 = "pdf2.pdf"
if compare_pdfs(file1, file2):
print("PDFs are identical")
else:
print("PDFs are not identical")
在上面的程式碼中,我們定義了一個 **compare_pdfs** 函式,該函式以兩個 PDF 檔案作為引數。我們使用 PyPDF2 讀取 PDF 檔案,並使用 **extract_text** 方法從每個頁面提取文字。我們使用 **splitlines** 方法將提取的文字拆分為行。
然後,我們使用 **difflib** 比較從兩個 PDF 檔案中提取的行文字。我們使用 **difflib** 的 **ndiff** 函式生成兩個行列表之間的差異。如果差異列表中的任何行以 "+" 或 "-" 開頭,我們就知道 PDF 不相同,並返回 False。
如果差異列表不包含任何以 "+" 或 "-" 開頭的行,我們就知道 PDF 相同,並返回 True。
方法 4:使用 pdftk
pdftk 是一個可以操作 PDF 檔案的命令列實用程式。我們可以使用 pdftk 比較兩個 PDF 檔案並確定它們是否相同。此方法需要在系統上安裝 pdftk。
示例
以下程式碼片段演示瞭如何使用 pdftk 比較兩個 PDF 檔案:
import os
import subprocess
def compare_pdfs(file1, file2):
output = subprocess.check_output(['pdftk', file1, 'diff', file2])
if "input files are identical" in output.decode():
return True
else:
return False
if __name__ == '__main__':
file1 = "pdf1.pdf"
file2 = "pdf2.pdf"
if compare_pdfs(file1, file2):
print("PDFs are identical")
else:
print("PDFs are not identical")
在上面的程式碼中,我們定義了一個 **compare_pdfs** 函式,該函式以兩個 PDF 檔案作為引數。我們使用 **subprocess** 模組透過 **check_output()** 函式呼叫 **pdftk** 命令列實用程式。我們將 `diff` 命令傳遞給 **pdftk**,以及要比較的兩個 PDF 檔案。
如果兩個 PDF 檔案相同,**pdftk** 會在其輸出中返回訊息“輸入檔案相同”。我們使用 Python 的 `in` 關鍵字檢查輸出中是否存在此訊息。如果存在該訊息,我們就知道 PDF 檔案相同,並返回 `True`。否則,我們將返回 False。
結論
在本教程中,我們討論了在 Python 中檢查兩個 PDF 檔案是否相同的方法。我們討論了四種方法:
使用 **PyPDF2** 比較兩個 PDF 檔案的文字
使用 **pdftotext** 比較兩個 PDF 檔案的文字
使用 **difflib** 比較兩個 PDF 檔案的文字
使用 **pdftk** 比較兩個 PDF 檔案
所有這些方法都可靠有效。但是,方法的選擇取決於專案的需要和具體的用例。如果 PDF 檔案很大,並且只需要比較幾個頁面,那麼使用 **PyPDF2** 或 **pdftotext** 可能比使用 pdftk 更有效。另一方面,如果系統上已經安裝了 **pdftk**,那麼它可能是最簡單、最方便使用的方法。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP