在学习和工作中大家一定对pdf非常熟悉。事实上,pdf也是非常重要并且应用广泛的一种数字媒体。
PDF全称是Portable Document Format,即可移植的文档格式。它使用.pdf作为扩展名。用于可靠的呈现和交换文档,与软件,硬件和操作系统无关。
- pdf使用Adobe公司开发,现在由国际标准化组织ISO进行维护。
- Python处理PDF
用于处理 PDF 的模块是 PyPDF2。
要安装它,就从命令行运行 pip install PyPDF2
这个模块名称是区分大小写的,所以要确保 y 是小写,其他字母都是大写
PyPDF2可以实现: 提取文档信息(标题作者等),拆分,裁剪,合并页面,加/解密
1.PDF基本读取
import PyPDF2
pdfFile = open('./data/1.pdf','rb')
pdfReader = PyPDF2.PdfReader(pdfFile)
print(len(pdfReader.pages)) #打印页数
page = pdfReader.pages[1]
print(page.extract_text()) #打印具体页内容
在PyPDF2 3.0版本后方法进行了简化:
PdfFileReader---> PdfReader
对于程序来说,将其解析为纯文本并不容易。因此,PyPDF2在从PDF中提取文本时可能会出错,甚至可能根本无法打开某些PDF。有些pdf打不开很正常,毫无办法。
2.
2.1 PDF拆分写入新文件:
将一个完整pdf拆分成两个单独的pdf文件进行保存,并去除不想要的指定页面
pdfFile = open('./data/example.pdf','rb') #创建读取器对象 pdfReader = PyPDF2.PdfReader(pdfFile) #创建写入器对象 pdfWriter1 = PyPDF2.PdfWriter() pdfWriter2 = PyPDF2.PdfWriter() all_pages = len(pdfReader.pages) for page in range(all_pages): #去除不想要的页面 if page in [1,3,5,7,9]: continue #获取中间页码值 middle_num = all_pages // 2 print("middle_num is",middle_num) #提取一页数据 pageObj = pdfReader.pages[page] if page <= middle_num: pdfWriter1.add_page(pageObj) else: pdfWriter2.add_page(pageObj) f1 = open('./data/example_1.pdf','wb') f2 = open('./data/example_2.pdf','wb') pdfWriter1.write(f1) pdfWriter2.write(f2) pdfFile.close() f1.close() f2.close() 同样在PyPDF2 3.0版本后,部分方法发生了变化 pdfReader.getPage(page) ----> len(reader.pages) pdfReader.getPage(xx)---->pdfReader.pages[xx] addPage ----> add_page
2.2 PDF旋转处理并写入新文件
minutesFile = open('./data/example_1.pdf', 'rb') pdfReader = PyPDF2.PdfReader(minutesFile) #打开源文件 page = pdfReader.pages[0] #读取源文件第一页 page1 = page.rotate(90) #旋转90度形成page1 writer = PyPDF2.PdfWriter() #初始化writer写对象 writer.add_page(page1) #把旋转处理后的内容page1放入写入器中 resultfile = open('./data/resultfile.pdf', 'wb') writer.write(resultfile) #关闭文件对象 resultfile.close() minutesFile.close() 同样旋转方法发生了变化:page.rotateClockwise或rotateCounterClockwise都废弃了--> page.rotate(90/-90)顺时针90,逆时针-90即可,可选旋转 90 度的整数倍,向这些方法传入整数 90、180 或 270 即可,其他度数会报错
3.PDF合并,添加水印
PyPDF2 也可以将一页的内容叠加到另一页上,这可以用来在页面上添加公司标志、时间戳或水印。利用 Python,很容易为多个文件添加水印,并且只针对程序 指定的页面添加。
pythonFile = open('./data/example.pdf', 'rb') #对需要添加水印的pdf生成器读取器 pdfReader = PyPDF2.PdfReader(pythonFile) pdfWatermarkReader = PyPDF2.PdfReader(open('./data/waterprint.pdf', 'rb')) #创建写入器对象 pdfWriter = PyPDF2.PdfWriter() #遍历需要添加水印pdf的每一页 for pageNum in range(0, len(pdfReader.pages)): #获取页面对象 pageObj = pdfReader.pages[pageNum] #添加水印(叠加两张页面) pageObj.merge_page(pdfWatermarkReader.pages[0]) #添加到写入器中(注意:写入器中已经添加了水印) pdfWriter.add_page(pageObj) resultPdfFile = open('./data/watermarkedCover.pdf', 'wb') pdfWriter.write(resultPdfFile)
4. 加/解密
- PdfFileWriter 对象也可以为 PDF 文档进行加密
- encrypt()方法,传入口令字符串。PDF 可以有一个用户口令(允许查看这个PDF)和一个拥有者口令(允许设置打印、注释、 提取文本和其他功能的许可)。
用户口令和拥有者口令分别是 encrypt()的第一个和第二个参数。如果只传入一个字符串给 encrypt(),它将作为两个口令。"
4.1 加密操作
import PyPDF2 pdfFile = open('./data/waterprint.pdf', 'rb') reader = PyPDF2.PdfReader(pdfFile) pdfWriter = PyPDF2.PdfWriter() for pageNum in range(len(reader.pages)): print(pageNum) pdfWriter.add_page(reader.pages[pageNum]) pdfWriter.encrypt('aelo') resultPdf = open('./data/encryptedminutes.pdf', 'wb') pdfWriter.write(resultPdf) resultPdf.close()
4.2 解密操作
使用迭代工具迭代得到四位组合:
import itertools
from PyPDF2 import PdfReader
mylist = ("".join(x) for x in itertools.product("abcdefghjklmno",repeat=4))
path = './data/encryptedminutes.pdf'
reader = PdfReader(path)
while True: i = next(mylist) if reader.decrypt(i):
print(f"破解成功,密码是{i}")
破解成功,密码是aelo