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

更新於:2024年2月22日

2K+ 閱讀量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告