Python 读取 PDF 文件

610 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

前言

PDF (Portable Document Format) 是一种十分常见的文档格式,它最初是一种为打印机描述文档的格式,因此使用 PDF 格式可以确保文档完全按照文档显示进行打印,它已经成为共享文档(尤其是只读文档)的事实标准。

Python 读取 PDF 文件

安装 PyPDF2 库

在本节中,我们将使用 PyPDF2 模块读取 PDF 文件,PyPDF2 库的安装和其它第三方库一样:

$ pip install PyPDF2

读取 PDF 文件

首先,导入 PyPDF2 模块:

>>> from PyPDF2 import PdfFileReader

打开 document_1.pdf 文件并创建一个 PDF 文档对象:

>>> file = open('document_1.pdf', 'rb')
>>> document = PdfFileReader(file)

PDF 文档对象提供对文档的访问,文档对象包括一些有用的属性:numPages 存储可用的页面数,pages 中存储了所有可用的页面,可以像列表一样访问这些页面内容。其他一些可访问的数据存储在 documentInfo 中,存储了一些有关创建者及其创建时间的元数据,需要注意的是,documentInfo 中的信息是可选的,甚至是过期信息,这很大程度上取决于用于生成 PDF 的工具。

获取文档的页数并检查其是否未加密:

>>> document.numPages
22
>>> document.isEncrypted
False

从文档信息中获取创建日期,并检查文档创建者:

>>> document.documentInfo['/CreationDate']
'D:20191205010703Z'
>>> document.documentInfo['/Producer']
'pdfTeX-1.40.17'

获取第一页并阅读上面的文字:

>>> document.pages[0].extractText()
'JOURNAL OF L ATEX CLASS FILES, VOL. XX, NO. XX, AUGUST 2019 1\nA Comprehensive Survey on Graph Neural\nNetworks\nZonghan Wu, Shirui Pan, Member, ...'

每个页面对象都可以通过调用 extractText() 来获取其文本,这可以返回页面中包含的所有文本。此方法会尝试提取所有文本,但它有一些限制,对于结构良好的文本,它可以很好的运行,并且可以便捷地处理生成的文本。在处理多列中的文本或位于奇怪位置的文本时,可能会使处理变得复杂。

对第二页执行相同的操作:

>>> document.pages[1].extractText()
'JOURNAL OF L ATEX CLASS FILES, VOL. XX, NO. XX, AUGUST 2019 2\n(a) 2D Convolution. Analogous\nto a graph, each pixel in an image\nis taken ...'

关闭 document_1.pdf 文件并打开 document_2.pdf

>>> file.close()
>>> file = open('document_2.pdf', 'rb')
>>> document = PdfFileReader(file)

检查文档是否已加密,如果是加密文档,我们尝试访问其内容时,会引发错误:

>>> document.isEncrypted
True
>>> document.numPages
Traceback (most recent call last):
...
    raise FileNotDecryptedError("File has not been decrypted")
PyPDF2.errors.FileNotDecryptedError: File has not been decrypted

解密文件并访问其内容:

>>> document.decrypt('example')
1
>>> document.numPages
22
>>> document.pages[0].extractText()
'JOURNAL OF L ATEX CLASS FILES, VOL. XX, NO. XX, AUGUST 2019 1\nA Comprehensive Survey on Graph Neural\nNetworks\nZonghan Wu, Shirui Pan, Member, ...'

关闭文件进行清理:

>>> file.close()