Python操作PDF教程

要说为什么要学习Python,他不仅可以让程序员写出专业的程序,还能让普通的办公人员提高工作效率,也就是俗称的自动化办公,比如自动化Excel操作、PDF操作等。个人觉得,只要是长期与电脑打交道的工作,都建议花点时间学下Python,很多工作说不定就有自动化的解决方案,可以节省大量的时间!今天我们来说下Python操作PDF的一些技巧。
一、安装包:
Python就是包多,轮子多,你能想到的需求,几乎都有第三方的包可以帮你实现。在Python中操作PDF,可以使用PyPDF2,老套路,还是通过pip安装:
$ pip install pypdf2
二、打开PDF与获取信息:
打开PDF非常简单,通过pypdf2.PdfFileReader即可打开:
pdf = PdfFileReader(pdf_path)
然后可以通过pdf变量获取文件的一些信息,比如总共有多少页,标题,作者等:
# 获取总共的页数
pages = pdf.getNumPages()
# 获取文件的信息
info = pdf.documentInfo
其中pdf.documentInfo函数会返回文件的基本信息,有以下信息:
Title:标题。Author:作者。Creator:创作者。CreationDate:创建时间。ModDate:修改时间。Producer:生产者。 可以通过documentInfo.属性的方式访问,比如pdf.documentInfo.title即可访问到该文件的标题。
三、从页面中提取文本:
PDF文件由一页一页组成的,每页的数据用PageObject表示,通过pdf.getPage(index)即可获取到对应页码的PageObject对象,然后再通过该PageObject对象的相关方法获取文本数据。示例代码如下:
# 获取下标为0的页对象
first_page = pdf.getPage(0)
# 提取文本
text = first_page.extractText()
如果想获取所有页面的文本,那么可以通过循环pdf.pages获取:
for page in pdf.pages:
print(page.extractText())
四、提取页面:
有时候我们只需要获取某个PDF中的其中几页,然后形成一个新的PDF,那么就可以通过类似以下方式实现:
from PyPDF2 import PdfFileReader, PdfFileWriter
# 读取pdf
reader_pdf = PdfFileReader(pdf_path)
# 创建写入pdf对象
writer_pdf = PdfFileWriter()
# 循环第1-4页
for x in range(1,4):
# 获取对应页
page = reader_pdf.getPage(x)
# 将页面添加到新的pdf文件中
writer_pdf.addPage(page)
# 写入新的文件
with open("new.pdf", "wb") as fp:
writer_pdf.write(fp)
五、连接和合并PDF:
虽然通过PdfFileReader和PdfFileWriter也可以曲线实现文件的合并功能,但是PyPDF2有更加直接的方法来拼接PDF文件,那就是使用PdfFileMerger类。这个类可以在不打开PDF文件的基础之上实现合并,并且他有两个方法,一个是merger.append,一个是merger.merge,前者只能往后追加新的PDF,后者则可以在指定位置插入PDF,来看下使用方法:
from PyPDF2 import PdfFileMerger
# 创建merger对象
pdf_merger = PdfFileMerger()
# 使用append连接pdf文件
pdf_merger.append("a.pdf")
pdf_merger.append("b.pdf")
# 使用merge连接pdf文件,在下标为1的地方插入c.pdf文件
pdf_merger.merge(1, "c.pdf")
# 写入新的pdf文件
with open("new.pdf", "wb") as fp:
pdf_merger.wirte(fp)
六、加密和解密PDF:
有时候有些PDF文件是需要加密和解密,这时候可以使用PyPDF2批量实现这些操作。
1. 加密:
先来看一段PDF加密的代码。如下:
# 读取pdf文件
pdf_reader = PdfFileReader(pdf_path)
# 创建写入pdf文件的对象
pdf_writer = PdfFileWriter()
# 从pdf_reader中读取页面
pdf_writer.appendPagesFromReader(pdf_reader)
# PDF加密
pdf_writer.encrypt(user_pwd="SuperSecret")
# 写入文件
with open("new.pdf", "wb") as fp:
pdf_writer.write(fp)
上述代码中我们先读取原PDF文件,然后使用encrypt方法对所有页面加密后,再存储到新的PDF文件中,即可完成加密。
2. 解密:
解密使用的是decrypt方法,但是前提是你知道这个PDF文件的密码。示例代码如下:
from PyPDF2 import PdfFileReader
pdf_reader = PdfFileReader(pdf_path)
# 解密
pdf_reader.decrypt(password="SuperSecret")
# 获取页面
first_page = pdf_reader.getPage(0)
七、从零创建新的PDF文件:
PyPDF2非常适合用来阅读和修改现有的PDF文件,但它有一个主要限制:您不能使用它来创建新的 PDF 文件。创建新的PDF文件,需要借助ReportLab库,先来安装一下:
$ pip install reportlab
1. 使用Canvas类:
用于创建新的PDF文件的类是Canvas,使用方式如下:
from reportlab.pdfgen.canvas import Canvas
# 创建一个名为hello.pdf的pdf文件
canvas = Canvas("hello.pdf")
# 添加文字
canvas.drawString(72, 72, "Hello, World!")
# 保存
canvas.save()
传递的前两个参数用于.drawString()确定在画布上写入文本的位置。第一个指定与画布左边缘的距离,第二个指定与底部边缘的距离。
传递给的值以.drawString()点为单位进行测量。由于点等于1/72英寸,因此.drawString(72, 72, "Hello, World")在"Hello, World"距页面左侧一英寸和距页面底部一英寸处绘制字符串。关于刚刚创建的 PDF,有几点需要注意:
默认页面大小为 A4,这与标准 US letter 页面大小不同。 字体默认为 Helvetica,字体大小为 12 磅。
2. 设置页面大小:
实例化Canvas对象时,可以使用可选pagesize参数更改页面大小。此参数接受浮点值元组,以磅为单位表示页面的宽度和高度。
例如,要将页面大小设置为8.5英寸宽 x11英寸高,您将创建以下内容Canvas:
canvas = Canvas("hello.pdf", pagesize=(612.0, 792.0))
reportlab.lib.pagesize模块包含许多标准页面大小。以下是一些尺寸:
| 页面大小 | 方面 |
|---|---|
| A4 | 210 毫米 x 297 毫米 |
| LETTER | 8.5 英寸 x 11 英寸 |
| LEGAL | 8.5 英寸 x 14 英寸 |
| TABLOID | 11 英寸 x 17 英寸 |
3. 设置字体属性:
要更改字体和字体大小,可以使用`.setFont()``。 首先,·Canvas·使用文件名·font-example.pdf·和字母页面大小创建一个新实例:
canvas = Canvas("font-example.pdf", pagesize=LETTER)
然后设置字体为Times New Roman,大小为18磅:
canvas.setFont("Times-Roman", 18)
canvas.drawString(1 * inch, 10 * inch, "Times New Roman (18 pt)")
canvas.save()
也可以使用setFillColor设置字体颜色。比如:
canvas.setFillColor(blue)
canvas.drawString(1 * inch, 10 * inch, "Blue text")
八、更多:
以上教程,其目的是科普一下Python操作PDF的方式方法,也希望能起到一些抛砖引玉的作用。如有更多需求,可以阅读PyPDF2和ReportLab两个库的官方文档:
PyPDF2:https://pythonhosted.org/PyPDF2/ReportLab:https://www.reportlab.com/



