使用 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+ 阅读量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告