携手创作,共同成长!这是我参与「掘金日新计划 · 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()