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