【Python军火库】PyPDF2:操纵PDF的利器


一、PyPDF2简介

利用Python+PyPDF2,我们能够实现对PDF的一些操作。

当然,PyPDF2对PDF的操作并非万能的,在使用过程中我们需要注意以下问题:

  1. PyPDF2无法从PDF文档中提取图像、图表或其他媒体,它可以提取文本并返回字符串
  2. 有时候PDF提取文本会出错,甚至无法打开某些PDF
  3. PyPDF2不能任意将文本写入PDF,仅限于从其他PDF拷贝页面、旋转页面、重叠页面和加密文件
  4. 模块不能直接编辑PDF,必须创建一个新的PDF,然后从已有的文档拷贝内容

PyPDF2的安装也非常简单

如果你是Windows系统,直接进入DOS命令行

输入:pip install PyPDF2

然后回车即可等待自动完成安装

PyPDF2的主要功能有以下六项,我们也将分别从这六大功能来介绍PyPDF2的使用:

  1. 从PDF提取文本
  2. 创建PDF
  3. 拷贝PDF
  4. 旋转PDF
  5. 叠加PDF
  6. 解密与加密PDF

——

二、PyPDF2六大基操

1、从PDF提取文本

import PyPDF2     # 注意y一定是小写
pdfFileobj = open('meetingminutes.pdf','rb')        # 用二进制只读形式打开文件
pdfReader = PyPDF2.PdfFileReader(pdfFileobj)        # 获取内容对象
print(pdfReader.numPages)         # 打印PDF页数

pageobj = pdfReader.getPage(0)       # 获取页面是从0开始的,也就是0表示PDF中的第一页
print(pageobj.extractText())         # 返回该页文本的字符串

从上面代码我们能学到什么?

  1. 我们需要以二进制形式打开PDF文件
  2. 我们需要为PDF创建对象
  3. 获取当前PDF的页数:numPages
  4. 获取某一页PDF:getPage() …第1页是从0开始
  5. 返回页面字符串内容:extractText()

我们看看返回的内容与实际页面的对比,还是有一定的差距误差(红色框框标注的)
在这里插入图片描述

2、创建PDF

import PyPDF2     # 注意y一定是小写
pdfWriter = PyPDF2.PdfFileWriter()   # 创建PDF写入对象

如果只是要读入PDF,我们要创建PdfFileReader对象;如果创建一个需要写入的PDF,我们则要创建PdfFileWriter对象。

具体怎么使用,我们接着后面的案例来说道。

3、拷贝PDF

通过拷贝PDF,我们可以实现两个PDF的合并操作。

因为我们在最开始说过,PyPDF2并不能实现将任意内容写入原本的PDF中,所以我们只能创建一个新的PDF,并将内容写入其中。

以下我们通过具体代码展示,如何把两个PDF(meetingminutes.pdf和meetingminutes.pdf)合并到一个PDF(combainedminutes.pdf)

import PyPDF2     # 注意y一定是小写
pdf1File = open('meetingminutes.pdf','rb')     # 用二进制只读形式打开文件
pdf2File = open('meetingminutes2.pdf','rb')    # 用二进制只读形式打开文件
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)    # 获取内容对象
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)    # 获取内容对象
pdfWriter = PyPDF2.PdfFileWriter()             # 创建PDF写入对象

for pageNum in range(pdf1Reader.numPages):     # 利用for循环把pdf1File中的内容添加到pdfWriter
	pageobj = pdf1Reader.getPage(pageNum)
	pdfWriter.addPage(pageobj)                 # addPage写入内容

for pageNum in range(pdf2Reader.numPages):     # 利用for循环把pdf2File中的内容添加到pdfWriter
	pageobj = pdf2Reader.getPage(pageNum)
	pdfWriter.addPage(pageobj)

pdfOutputFile = open('combainedminutes.pdf','wb')   # 用二进制写入形式创建新的PDF文件
pdfWriter.write(pdfOutputFile)              # 将pdfWriter中的内容写入新的PDF文件
pdfOutputFile.close()
pdf1File.close()
pdf2File.close()

从以上代码我们可以学到什么?

  1. 写入PDF的方法:addPage()
  2. 利用for循环、range方法、numPages属性实现对整个PDF的遍历
  3. 再配合getPage()和addPage()从而实现整个PDF的拷贝
  4. 最后创建新的PDF文件(用二进制写入的方法打开),并用write方法将内容传入新的PDF中

4、旋转PDF

利用PyPDF2,我们还能实现旋转某个PDF页面

当然依然由于PyPDF2无法实现对原PDF的操作,所以我们需要创建新的PDF并将旋转后的页面写入新的PDF中。

import PyPDF2     # 注意y一定是小写
minutesFile = open('meetingminutes.pdf','rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
pageobj = pdfReader.getPage(0)
pageobj.rotateClockwise(90)      # 将页面顺时针旋转90度,可以传入90、180、270
pageobj.rotateCounterClockwise(180)   # 将页面逆时针旋转180度,可以传入90、180、270
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(pageobj)
resultPDF = open('rotatedPage.pdf','wb')
pdfWriter.write(resultPDF)
resultPDF.close()
minutesFile.close()

从以上代码我们可知:

  1. 页面顺时针旋转:rotateClockwise(),括号内可填90、180、270度
  2. 页面逆时针旋转:rotateCounterClockwise(),括号内可填90、180、270度

我们看看最终呈现的结果
在这里插入图片描述

5、叠加PDF

顾名思义,就是将两个PDF页面进行重叠在一起。

这有什么用?

我们可以利用叠加PDF功能从而实现添加水印的效果。

import PyPDF2     # 注意y一定是小写
minutesFile = open('meetingminutes.pdf','rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
pdfWatermarkReader = PyPDF2.PdfFileReader(open('watermark.pdf','rb'))
pdfWriter = PyPDF2.PdfFileWriter()

for pageNum in range(pdfReader.numPages):
	pageobj = pdfReader.getPage(pageNum)
	pageobj.mergePage(pdfWatermarkReader.getPage(0))  # 页面合并
	pdfWriter.addPage(pageobj)

resultPDF = open('resultPDF.pdf','wb')
pdfWriter.write(resultPDF)
resultPDF.close()
minutesFile.close()

从以上代码我们可知:

  1. PDF叠加操作:mergePage()
  2. 先确定水印页PDF,利用for循环我们可以实现对每一页PDF正文内容叠加水印

我们再看看最终效果
在这里插入图片描述

6、解密与加密PDF

最后我们介绍一下利用PyPDF2来给PDF解密和加密的操作。

如果PDF是经过加密的,我们利用PyPDF2直接打开是会发生报错的:

import PyPDF2     # 注意y一定是小写
pdfReader = PyPDF2.PdfFileReader(open('encrypted.pdf','rb'))
print(pdfReader.isEncrypted)         # 查看PDF是否加密,如果是则返回True
print(pdfReader.getPage(0))                                          # 获取第一页

在这里插入图片描述
PyPDF2.utils.PdfReadError: file has not been decrypted

所以我们需要添加对PDF文档解密的代码,即可成功读取PDF

pdfReader.decrypt('rosebud')       # 对PDF进行解密处理,密码rosebud

如果想对PDF进行加密,我们只需进行操作

pdfWriter.encrypt('123465')        # 对PDF文件进行加密,密码为123456

我们再来总结一下:

  1. PDF解密:decrypt()
  2. PDF加密:encrypt()
  3. 判断文档是否加密:isEncrypted

——

三、复盘总结

PyPDF2是操作PDF的利器,但是它并非万能的,我们在使用时候有且需要关注以下几个点:

  1. PyPDF2只能提取文本并返回字符串,图片、表格等通通都提取不了
  2. PyPDF2的文本识别并非完全准确,比如我们在【从PDF提取文本】的案例中就能看出来字符串返回出了差错,但是绝大多数情况下PyPDF2基本都能够应付的
  3. PyPDF2不能对原本PDF文件进行操作,所有的拷贝、旋转、叠加乃至加密等操作,同需要创建新的PDF并写入其中。
  4. 打开PDF文档时,需采用二进制方式,‘rb’、‘wb’。

最终再汇总所学过的主要属性和方法:

  1. 获取PDF页数:numPages
  2. 获取页面:getPage()
  3. 返回内容字符串:extractText()
  4. 写入页面:addPage()
  5. 合并页面:mergePage()
  6. 页面顺时针旋转:rotateClockwise()
  7. 页面逆时针旋转:rotateCounterClockwise()
  8. PDF解密:decrypt()
  9. PDF加密:encrypt()
  10. 判断文档是否加密:isEncrypted

注:本中的案例均来自《Python编程快速上手 让繁琐工作自动化》——[美] Al Sweigart 斯维加特
在这里插入图片描述

发布了35 篇原创文章 · 获赞 35 · 访问量 2760

猜你喜欢

转载自blog.csdn.net/nilvya/article/details/103752817