本文将说明如何使用 PyPDF2 以及正则表达式操作 PDF 文件,并从中提取有关信息。
在 Python 中,用于处理 PDF 文件的库有很多,比如:
以上列举的几个是比较典型的库,此外还有很多,不再一一列举。
本文介绍的库名为 PyPDF2 ,其安装方法(注意,区分大小写)
pip install PyPDF2
每个用于读取 PDF 文件的库都有自己的特点,PyPDF2 亦非万能,如果 PDF 文件太模糊、有特殊编码、加密,或者创建的 PDF 文件的特定程序与PyPDF2不兼容,都将无法读取。所以,要多了解一些,艺不压身。
还有可能,这些库都不起作用,这是因为 PDF 有许多不同的参数,而且这些设置非常不标准,比如 PDF 中就是图片,而不是 utf-8 编码的文字。
PyPDF2 只能读取 PDF 文档中的文本,无法从 PDF 中获取图像或其他媒体文件。
首先,引入 PyPDF2
,如下所示:
# 注意大小写
import PyPDF2
打开一个 PDF 文件。注意,函数 open()
中的模式设置为读取二进制的 'rb'
模式,不能只是 'r'
。
# Notice we read it as a binary with 'rb'
f = open('US_Declaration.pdf','rb')
这里打开的文件名为 US_Declaration.pdf
(《独立宣言》文稿),此文件下载地址:https://drive.google.com/file/d/115DPlPclA69A2VvIAfrRPoSRWA26SDvd/view?usp=sharing 。
然后读取此文件中的内容:
# pdfFileReader() 从文件对象中读取 PDF 文本内容
pdf_reader = PyPDF2.PdfFileReader(f)
# 返回 PDF 文件的页数
pdf_reader.numPages
# getPage() 读取指定页面的文本,下面是读取第一页
page_one = pdf_reader.getPage(0)
page_one_text = page_one.extractText()
# 最后的 extractText() 将第一页的内容解析为文本
不能使用 Python 编写 PDF 文件,因为 Python 的字符串与 PDF 文件中的各种字体、位置和其他参数之间存在差异。
对 PDF 文件,能称之为“写”的操作,只能是将某个指定的 PDF 页面追加到已有 PDF 文件中。如下操作所示:
f = open('US_Declaration.pdf','rb')
pdf_reader = PyPDF2.PdfFileReader(f)
first_page = pdf_reader.getPage(0)
# 用 pdfFileWriter() 创建一个页面
pdf_writer = PyPDF2.PdfFileWriter()
# 用 addPage() 将 first_page 的内容加入到刚刚创建的页面
pdf_writer.addPage(first_page)
# 以 'wb' 模式在目录中创建名为 "Some_New_Doc.pdf" 的文件
pdf_output = open("Some_New_Doc.pdf","wb")
# 最后利用 pdf_wirter 的 write() 方法,将刚刚含有 first_page 的文件保存到 'Some_New_Doc.pdf' 中
pdf_writer.write(pdf_output)
搞定!复制了一个页面,并将其添加到另一个新文档中!
前面使用 PyPDF2
,读取了特定页面的文本。是否可以一次性就获取 PDF 的所有文本呢?“这个应该有”。显然,一个简单方法就是循环。
f = open('US_Declaration.pdf','rb')
# 列出每页的文本
# 索引对应页码.
pdf_text = [0] # 0 是占位符,能让索引 1 对应于第 1 页
pdf_reader = PyPDF2.PdfFileReader(f)
for p in range(pdf_reader.numPages):
page = pdf_reader.getPage(p)
pdf_text.append(page.extractText())
现在,可以通过 pdf_text
的切片打印相应页面的内容,例如 print(pdf_text[1])
,会将 PDF 文件的第 1 页打印出来。
注意,最后要执行 f.close()
关闭文件,这是一个好习惯。
在 aistudio.baidu.com 中有专门探讨从 word 文档、PDF 文档中读取文本的多种方法的项目,可以参考