Python操作PDF教程

9769d432d1f13d71e23813fbd7ec9c46.jpg

要说为什么要学习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函数会返回文件的基本信息,有以下信息:

  1. Title:标题。
  2. Author:作者。
  3. Creator:创作者。
  4. CreationDate:创建时间。
  5. ModDate:修改时间。
  6. 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:

虽然通过PdfFileReaderPdfFileWriter也可以曲线实现文件的合并功能,但是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,有几点需要注意:

  1. 默认页面大小为 A4,这与标准 US letter 页面大小不同。
  2. 字体默认为 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的方式方法,也希望能起到一些抛砖引玉的作用。如有更多需求,可以阅读PyPDF2ReportLab两个库的官方文档:

  1. PyPDF2:https://pythonhosted.org/PyPDF2/
  2. ReportLab:https://www.reportlab.com/