一、PyPDF2简介
利用Python+PyPDF2,我们能够实现对PDF的一些操作。
当然,PyPDF2对PDF的操作并非万能的,在使用过程中我们需要注意以下问题:
- PyPDF2无法从PDF文档中提取图像、图表或其他媒体,它可以提取文本并返回字符串
- 有时候PDF提取文本会出错,甚至无法打开某些PDF
- PyPDF2不能任意将文本写入PDF,仅限于从其他PDF拷贝页面、旋转页面、重叠页面和加密文件
- 模块不能直接编辑PDF,必须创建一个新的PDF,然后从已有的文档拷贝内容
PyPDF2的安装也非常简单
如果你是Windows系统,直接进入DOS命令行
输入:pip install PyPDF2
然后回车即可等待自动完成安装
PyPDF2的主要功能有以下六项,我们也将分别从这六大功能来介绍PyPDF2的使用:
- 从PDF提取文本
- 创建PDF
- 拷贝PDF
- 旋转PDF
- 叠加PDF
- 解密与加密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()) # 返回该页文本的字符串
从上面代码我们能学到什么?
- 我们需要以二进制形式打开PDF文件
- 我们需要为PDF创建对象
- 获取当前PDF的页数:numPages
- 获取某一页PDF:getPage() …第1页是从0开始
- 返回页面字符串内容: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()
从以上代码我们可以学到什么?
- 写入PDF的方法:addPage()
- 利用for循环、range方法、numPages属性实现对整个PDF的遍历
- 再配合getPage()和addPage()从而实现整个PDF的拷贝
- 最后创建新的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()
从以上代码我们可知:
- 页面顺时针旋转:rotateClockwise(),括号内可填90、180、270度
- 页面逆时针旋转: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()
从以上代码我们可知:
- PDF叠加操作:mergePage()
- 先确定水印页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
我们再来总结一下:
- PDF解密:decrypt()
- PDF加密:encrypt()
- 判断文档是否加密:isEncrypted
——
三、复盘总结
PyPDF2是操作PDF的利器,但是它并非万能的,我们在使用时候有且需要关注以下几个点:
- PyPDF2只能提取文本并返回字符串,图片、表格等通通都提取不了
- PyPDF2的文本识别并非完全准确,比如我们在【从PDF提取文本】的案例中就能看出来字符串返回出了差错,但是绝大多数情况下PyPDF2基本都能够应付的
- PyPDF2不能对原本PDF文件进行操作,所有的拷贝、旋转、叠加乃至加密等操作,同需要创建新的PDF并写入其中。
- 打开PDF文档时,需采用二进制方式,‘rb’、‘wb’。
最终再汇总所学过的主要属性和方法:
- 获取PDF页数:numPages
- 获取页面:getPage()
- 返回内容字符串:extractText()
- 写入页面:addPage()
- 合并页面:mergePage()
- 页面顺时针旋转:rotateClockwise()
- 页面逆时针旋转:rotateCounterClockwise()
- PDF解密:decrypt()
- PDF加密:encrypt()
- 判断文档是否加密:isEncrypted
注:本中的案例均来自《Python编程快速上手 让繁琐工作自动化》——[美] Al Sweigart 斯维加特