PyPDF2模块

PDF介绍

  • 在学习和工作中大家一定对pdf非常熟悉。事实上,pdf也是非常重要并且应用广泛的一种数字媒体。PDF全称是Portable Document Format,即可移植的文档格式。它使用.pdf作为扩展名。用于可靠的呈现和交换文档,与软件,硬件和操作系统无关。
  • pdf使用Adobe公司开发,现在由国际标准化组织ISO进行维护。

环境安装

  • Python处理PDF

    • 用于处理 PDF 的模块是 PyPDF2。
    • 要安装它,就从命令行运行 pip install PyPDF2
      • 这个模块名称是区分大小写的,所以要确保 y 是小写,其他字母都是大写
  • PyPDF2可以实现:

    • 提取文档信息(标题,作者,...)
    • 按页拆分文档
    • 逐页合并文档
    • 裁剪页面
    • 合并多个页面到一个页
    • 对pdf文档进行加密解密
    • ......

读取PDF文件操作

  • 注意:
    • 虽然PDF文件非常适合以一种便于打印和阅读的方式显示文本,但是对于程序来说,将其解析为纯文本并不容易。因此,PyPDF2在从PDF中提取文本时可能会出错,甚至可能根本无法打开某些PDF。很不幸的是,我们对此无能为力。
#打开指定文件
import PyPDF2
pdfFile = open('./data/example.pdf','rb')

#创建读取器对象
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfReader   #<PyPDF2.pdf.PdfFileReader at 0x10afe1cf8>

#返回总页码数
pdfReader.numPages

#获取指定页面对象
page = pdfReader.getPage(0)

#提取出页面中的文字
page.extractText()

PDF的写入操作

  • 将一个完整pdf拆分成两个单独的pdf文件进行保存,且去除不想要的指定页面
import PyPDF2
pdfFile = open('./data/example.pdf','rb')
#创建读取器对象
pdfReader = PyPDF2.PdfFileReader(pdfFile)
#创建写入器对象
pdfWriter1 = PyPDF2.PdfFileWriter()
pdfWriter2 = PyPDF2.PdfFileWriter()

all_pages = pdfReader.numPages
for page in range(all_pages):
    #去除不想要的页面
    if page in [1,3,5,7,9]:
        continue
    #获取中间页码值
    middle_num = all_pages // 2
    #提取一页数据
    pageObj = pdfReader.getPage(page)
    if page <= middle_num:
        pdfWriter1.addPage(pageObj)
    else:
        pdfWriter2.addPage(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 不能在 PdfFileWriter 对象中间插入页面,addPage()方法只能够在末尾添加页面。
  • 旋转页面

    • 利用 rotateClockwise()和 rotateCounterClockwise()方法,PDF 文档的页面也可以 旋转 90 度的整数倍。向这些方法传入整数 90、180 或 270 就可以了
#翻转第一张页面
import PyPDF2
minutesFile = open('./data/example.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
page = pdfReader.getPage(0)
page.rotateCounterClockwise(90)

#创建写入器,将翻转的第一张页面添加到写入器中
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(page)


#将翻转的页面写入到一个新的pdf中
resultPdfFile = open('./data/rotatedPage.pdf', 'wb')
pdfWriter.write(resultPdfFile)
resultPdfFile.close()
minutesFile.close()
  • 叠加页面
    • PyPDF2 也可以将一页的内容叠加到另一页上,这可以用来在页面上添加公司标志、时间戳或水印。利用 Python,很容易为多个文件添加水印,并且只针对程序 指定的页面添加。
import PyPDF2
#打开需要添加水印的pdf
pythonFile = open('./data/example.pdf', 'rb')
#对需要添加水印的pdf生成器读取器
pdfReader = PyPDF2.PdfFileReader(pythonFile)

#生成水印pdf的读取器
pdfWatermarkReader = PyPDF2.PdfFileReader(open('./data/watermark.pdf', 'rb'))



#创建写入器对象
pdfWriter = PyPDF2.PdfFileWriter()
#遍历需要添加水印pdf的每一页
for pageNum in range(0, pdfReader.numPages): 
    #获取页面对象
    pageObj = pdfReader.getPage(pageNum)
    #添加水印(叠加两张页面)
    pageObj.mergePage(pdfWatermarkReader.getPage(0))
    #添加到写入器中(注意:写入器中已经添加了水印)
    pdfWriter.addPage(pageObj)
resultPdfFile = open('./data/watermarkedCover.pdf', 'wb') 
pdfWriter.write(resultPdfFile)
minutesFile.close()
resultPdfFile.close()
  • 加密 PDF
    • PdfFileWriter 对象也可以为 PDF 文档进行加密
    • encrypt()方法,传入口令字符串。PDF 可以有一个用户口令(允许查看这个PDF)和一个拥有者口令(允许设置打印、注释、 提取文本和其他功能的许可)。用户口令和拥有者口令分别是 encrypt()的第一个和第二个参数。如果只传入一个字符串给 encrypt(),它将作为两个口令。
import PyPDF2
pdfFile = open('./data/watermark.pdf', 'rb') 
pdfReader = PyPDF2.PdfFileReader(pdfFile) 
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages): 
    pdfWriter.addPage(pdfReader.getPage(pageNum))
pdfWriter.encrypt('1324')
resultPdf = open('./data/encryptedminutes.pdf', 'wb')
pdfWriter.write(resultPdf)
resultPdf.close()
  • 项目:从多个 PDF 中合并选择的页面
    • 假定你有一个很无聊的任务,需要将几十个 PDF 文件合并成一个 PDF 文件。每 一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封 面。即使有许多免费的程序可以合并 PDF,很多也只是简单的将文件合并在一起。 让我们来写一个 Python 程序,定制需要合并到 PDF 中的页面。
    • 总的来说,该程序需要完成:
      • 找到当前工作目录中所有 PDF 文件。
      • 按文件名排序,这样就能有序地添加这些 PDF。
      • 除了第一页之外,将每个 PDF 的所有页面写入输出的文件。
    • 从实现的角度来看,代码需要完成下列任务:
      • 调用 os.listdir(),找到当前工作目录中的所有文件,去除掉非 PDF 文件。
      • 调用 Python 的 sort()列表方法,对文件名按字母排序。
      • 为输出的 PDF 文件创建 PdfFileWriter 对象。
      • 循环遍历每个 PDF 文件,为它创建 PdfFileReader 对象。
      • 针对每个 PDF 文件,循环遍历每一页,第一页除外。 将页面添加到输出的 PDF。
      • 将输出的 PDF 写入一个文件,名为 allminutes.pdf。
      • 针对这个项目,打开一个新的文件编辑器窗口,将它保存为 combinePdfs.py。
posted @ 2022-05-29 22:32  silencio。  阅读(294)  评论(0编辑  收藏  举报