要说为什么要学习Python
,他不仅可以让程序员写出专业的程序,还能让普通的办公人员提高工作效率,也就是俗称的自动化办公,比如自动化Excel
操作、PDF
操作等。个人觉得,只要是长期与电脑打交道的工作,都建议花点时间学下Python
,很多工作说不定就有自动化的解决方案,可以节省大量的时间!今天我们来说下Python
操作PDF
的一些技巧。
Python
就是包多,轮子多,你能想到的需求,几乎都有第三方的包可以帮你实现。在Python
中操作PDF
,可以使用PyPDF2
,老套路,还是通过pip
安装:
$ pip install pypdf2
打开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)
虽然通过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
文件是需要加密和解密,这时候可以使用PyPDF2
批量实现这些操作。
先来看一段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文件中,即可完成加密。
解密使用的是decrypt
方法,但是前提是你知道这个PDF
文件的密码。示例代码如下:
from PyPDF2 import PdfFileReader
pdf_reader = PdfFileReader(pdf_path)
# 解密
pdf_reader.decrypt(password="SuperSecret")
# 获取页面
first_page = pdf_reader.getPage(0)
PyPDF2
非常适合用来阅读和修改现有的PDF
文件,但它有一个主要限制:您不能使用它来创建新的 PDF 文件。创建新的PDF文件,需要借助ReportLab
库,先来安装一下:
$ pip install reportlab
用于创建新的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,有几点需要注意:
实例化Canvas
对象时,可以使用可选pagesiz
e参数更改页面大小。此参数接受浮点值元组,以磅为单位表示页面的宽度和高度。
例如,要将页面大小设置为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 英寸 |
要更改字体和字体大小,可以使用`.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/