PyPDF2–如何使用python操作你的PDF文档
前言
大家好!最近想操作一下PDF文档,总是收费,于是浅尝辄止地了解了一下python当中的PyPDF2这个库。借助本篇博客总结了一下个人所学到的内容。本人才疏学浅,还望各位大佬多多指正。Python在自动化办公方面有很多实用的第三方库,可以很方便的处理word、excel、ppt、pdf文件,Python处理PDF文档的两个常用库pdfplumber,PyPDF2。在此本人对PyPDF2进行一个简单的介绍。
0.0:PyPDF2简介以及安装
PyPDF2 是一个纯 Python PDF 库,可以读取文档信息(标题,作者等)、写入、分割、合并PDF文档,它还可以对pdf文档进行添加水印、加密解密等操作。
很多具体参数设置大家可以访问其官方文档→https://pythonhosted.org/PyPDF2
Windows安装方法:
- win+r输入cmd 打开命令窗口
- 直接输入 pip install PyPDF2
- 速度太慢可以使用镜像如
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyPDf2
- 在pycharm上面:左上角File->Settings->Project Interpreter->+找到后Install就可以了
- 在https://pypi.org/project/PyPDF2/ 中搜索PyPDF2 1.26.0下载后也可以直接安装
(注:IOS系统以及Linux系统上安装在此不过多描述)
我们可以在其官方文档首页看到如下页面
我们可以看到这个第三方库主要包括PdfFileReader Class,PdfFileMerger,PageObject Class,PdfFileWriter这四个大类还有一个其他类。下面我们开始对其一一进行描述。
1:The PdfFileReader Class:
初始化一个 PdfFileReader 对象A,此操作可能需要一些时间,因为 PDF 流的交叉引用表被读入内存。
A = PyPDF2.PdfFileReader(stream, strict=True, warndest=None, overwriteWarnings=True)
其中参数:
stream:这个单词直接翻译成中文表示溪流或者流动,这里表示你需要操作的pdf文件或者其路径的字符串。
strict:确定是否应警告用户所有问题,并导致一些可纠正的问题致命。默认为True。
warndest:记录警告的目标(默认为系统标准)
overwriteWarnings:觉得是否使用一个自定义实现来覆盖python的warning模块。
正常情况下我们一般只会用到第一个参数stream
关于PdfFileReader的一些操作函数属性的讲解
相关属性以及函数 | 描述 | 备注 |
---|---|---|
decrypt(password) | 可以对加密的文档进行解密操作 | |
documentInfo | 通过getDocumentInfo()函数功能访问的只读属性 | |
getDestinationPageNumber(destination) | 检索目标对象的页数 | 若错误则返回-1 |
getDocumentInfo() | 检索PDF文件的字典信息是否存在存在会返回相关信息,不存在则会返回None | 部分PDF文件使用的是元数据流 |
getFields(tree=None, retval=None, fileobj=None) | 如果此 PDF文档中包含交互式表单字段,则提取字段数据 | 返回类型是字典或者None |
getFormTextFields() | 从文档中检索带有文本数据(输入,下拉列表)的表单域 | |
getNamedDestinations(tree=None, retval=None) | 检索文档中的特定的目标 | 返回字典类型 |
namedDestinations | 通过getNamedDestinations()函数的只读属性 | |
getNumPages() | 计算此PDF的页数 | |
numPages | 通过getNumPages()函数的只读属性 | |
getOutlines(node = None,outlines = None ) | 检索文档中存在的文档大纲 | |
outlines | 通过getOutlines()函数的只读属性 | |
getPage(pageNumber ) | 按编号检索页面 | 就是找到某页内容 |
getPageLayout() | 获取页面布局 | 返回类型为字符串 |
pageLayout | 通过getPageLayout()的只读属性 | |
getPageMode() | 获取页面模式 | 返回类型为字符串 |
pageMode | 通过getPageMode的只读属性 | |
getPageNumber(页面) | 检索给定页面的页码 | |
getXmpMetadata() | 从PDF文档根目录检索XMP(可扩展元数据平台)数据 | |
xmpMetadata | 通过getXmpMetadata()的只读属性 | |
isEncrypted | 显示此文档是否被加密的属性 | 如果为True调用decrypt()解密之后属性依旧为True |
PdfFileReader相关代码举例
以下代码均在Anaconda3上正常运行
from PyPDF2 import PdfFileReader
import os #os库可以进行相关路径操作在此不做多示范
readFile = './XXX.pdf'#这里XXX改成你这个.py同文件夹下的pdf文件名即可
# 获取 PdfFileReader 对象
pdfFileReader = PdfFileReader(readFile) # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
# 获取 PDF 文件的文档信息
documentInfo = pdfFileReader.getDocumentInfo()
print('documentInfo = %s' % documentInfo)
# 获取页面布局
pageLayout = pdfFileReader.getPageLayout()
print('pageLayout = %s ' % pageLayout)
# 获取页模式
pageMode = pdfFileReader.getPageMode()
print('pageMode = %s' % pageMode)
xmpMetadata = pdfFileReader.getXmpMetadata()
print('xmpMetadata = %s ' % xmpMetadata)
# 获取 pdf 文件页数
pageCount = pdfFileReader.getNumPages()
print('pageCount = %s' % pageCount)
for index in range(0, pageCount):
# 返回指定页编号的 pageObject
pageObj = pdfFileReader.getPage(index)
print('index = %d , pageObj = %s' % (index, type(pageObj)))
# 获取 pageObject 在 PDF 文档中处于的页码
pageNumber = pdfFileReader.getPageNumber(pageObj)
print('pageNumber = %s ' % pageNumber)
结果
2:The PdfFileMerger Class:
初始化一个PdfFileMerger对象B,其可以将多个pdf合并成 一个,可以串联、切片或者插入
B = PyPDF2.PdfFileMerger(strict