老齐教室

用 Python 编辑 PDF 文件

本文将说明如何使用 PyPDF2 以及正则表达式操作 PDF 文件,并从中提取有关信息。

PyPDF2

在 Python 中,用于处理 PDF 文件的库有很多,比如:

以上列举的几个是比较典型的库,此外还有很多,不再一一列举。

本文介绍的库名为 PyPDF2 ,其安装方法(注意,区分大小写)

1
pip install PyPDF2

每个用于读取 PDF 文件的库都有自己的特点,PyPDF2 亦非万能,如果 PDF 文件太模糊、有特殊编码、加密,或者创建的 PDF 文件的特定程序与PyPDF2不兼容,都将无法读取。所以,要多了解一些,艺不压身。

还有可能,这些库都不起作用,这是因为 PDF 有许多不同的参数,而且这些设置非常不标准,比如 PDF 中就是图片,而不是 utf-8 编码的文字。

PyPDF2 只能读取 PDF 文档中的文本,无法从 PDF 中获取图像或其他媒体文件。

读写 PDF 文件

首先,引入 PyPDF2 ,如下所示:

1
2
# 注意大小写
import PyPDF2

读文件

打开一个 PDF 文件。注意,函数 open() 中的模式设置为读取二进制的 'rb' 模式,不能只是 'r'

1
2
# 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

然后读取此文件中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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 文件中。如下操作所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 的所有文本呢?“这个应该有”。显然,一个简单方法就是循环。

1
2
3
4
5
6
7
8
9
10
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 文档中读取文本的多种方法的项目,可以参考

参考资料

  1. 齐伟. Python 大学实用教程. 电子工业出版社
  2. https://towardsdatascience.com/manipulate-pdf-files-extract-information-with-pypdf2-and-regular-expression-39ff697db0ca
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能