使用 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**,那麼它可能是最簡單、最方便使用的方法。