PyPDF2–如何使用python操作你的PDF文档
前言
大家好!最近想操作一下PDF文档,总是收费,于是浅尝辄止地了解了一下python当中的PyPDF2这个库。借助本篇博客总结了一下个人所学到的内容。本人才疏学浅,还望各位大佬多多指正。Python在自动化办公方面有很多实用的第三方库,可以很方便的处理word、excel、ppt、pdf文件,Python处理PDF文档的两个常用库pdfplumber,PyPDF2。在此本人对PyPDF2进行一个简单的介绍。
0.0:PyPDF2简介以及安装
PyPDF2 是一个纯 Python PDF 库,可以读取文档信息(标题,作者等)、写入、分割、合并PDF文档,它还可以对pdf文档进行添加水印、加密解密等操作。
很多具体参数设置大家可以访问其官方文档→/PyPDF2
win+r输入cmd 打开命令窗口直接输入 pip install PyPDF2速度太慢可以使用镜像如Windows安装方法:
pip install -i https://pypi.tuna./simple PyPDf2
在pycharm上面:左上角File->Settings->Project Interpreter->+找到后Install就可以了在/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的一些操作函数属性的讲解
PdfFileReader相关代码举例
以下代码均在Anaconda3上正常运行
from PyPDF2 import PdfFileReaderimport 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):# 返回指定页编号的 pageObjectpageObj = 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=True)
其中参数:
strict:默认为True,决定是否用户因一下问题被警告,并且可能导致一些可以纠正的问题是致命的。
关于PdfFileMerger的一些操作函数属性的讲解
PdfFileMerger相关代码举例
以下代码展示的是利用PdfFileMerger进行多个pdf文件的合并
from PyPDF2 import PdfFileMergerimport os #os库可以进行相关路径操作在此不做多示范import sys def remove_pdf_file(file):os.remove(file)def get_all_pdf_files(path):pdfs = [ file for file in os.listdir(path) if '.pdf' in file ]return pdfs def merge_pdf_file(pdfs):pdf_file_merger = PdfFileMerger()merged_pdf = 'merged_pdf_file.pdf' for pdf in pdfs:if merged_pdf == pdf:remove_pdf_file(pdf)try:pdf_file_merger.append(open(pdf, 'rb'))except:print("merging pdf file %s failed." % pdf)with open(merged_pdf, 'wb') as fout:pdf_file_merger.write(fout)return merged_pdf def main():pdfs = get_all_pdf_files(sys.path[0]) # current pathprint('The file', merge_pdf_file(pdfs), 'is generated.') if __name__ == "__main__":main()
此处不展示结果还请大家自己运行查看
大家可以自行拓展将爬虫技术结合自动爬取网络上的pdf资源并进行合并
3:The PdfFileObject Class:
此类表示PDF文件中的单个页面。通常,将通过访问类的getPage()方法 来创建此对象 PdfFileReader,但是也可以使用createBlankPage()静态方法来创建一个空页面
C = PyPDF2.pdf.PageObject(pdf=None, indirectRef=None)
其中参数 pdf:页面所属的PDF文件 indirectRef:在该对象的源PDF中存储对该对象的原始间接引用(通俗来讲就是)
关于PdfFileObject的一些操作函数属性的讲解
PdfFileObject相关代码举例
以下代码为粗略读取PDF文本内容
def getPdfContent(filename):pdf = PdfFileReader(open(filename, "rb"))content = ""for i in range(0, pdf.getNumPages()):pageObj = pdf.getPage(i)extractedText = pageObj.extractText()content += extractedText + "\n"# return content.encode("ascii", "ignore")return content
4:The PdfFileWriter Class:
此类支持将PDF文件写出,给定由另一类产生的页面(通常为PdfFileReader)
D = PyPDF2.PdfFileWriter()
其中参数:
关于PdfFileWriter的一些操作函数属性的讲解
PdfFileWriter相关代码举例
以下代码均在Anaconda3上正常运行
"""本程序用于编辑PDF页@author:"""from PyPDF2 import PdfFileWriter, PdfFileReader#删除output = PdfFileWriter()#// 1input1 = PdfFileReader(open("Linux讲义.pdf", "rb")) #// 2def delete_pdf(index):pages = input1.getNumPages() #// 3for i in range(pages):if i+1 in index:continueoutput.addPage(input1.getPage(i)) #// 4outputStream = open("Linux讲义0.pdf", "wb")output.write(outputStream) #// 5#删除测试delete_pdf([2,3,4])'''1声明一个用于输出PDF的实例;2读取本地PDF文件;3获取PDF文档的页数;4读取PDF的第i页,添加到输出output实例中;5把编辑后的文档保存到本地;'''##合并 #方法一output = PdfFileWriter()input1 = PdfFileReader(open("Linux讲义0.pdf", "rb"))input2 = PdfFileReader(open("Linux讲义.pdf", "rb")) #// 1def merge_pdf(add_index, origin_index):pages = input1.getNumPages()k = 0for i in range(pages):if i+1 in add_index:output.addPage(input2.getPage(origin_index[k]))# // 2pages += 1k += 1output.addPage(input1.getPage(i))outputStream = open("PyPDF2-output.pdf", "wb")output.write(outputStream)merge_pdf([2,3,4], [0, 0, 0])"""1读取需要合并的源文件;2遍历到指定页,合并源PDF的页面;"""#方法二from PyPDF2 import PdfFileMerger #// 1merger = PdfFileMerger()input1 = open("document1.pdf", "rb") #// 2input2 = open("document2.pdf", "rb")input3 = open("document3.pdf", "rb")merger.append(fileobj = input1, pages = (0,3))# // 3merger.merge(position = 2, fileobj = input2, pages = (0,1))# // 4merger.append(input3)# // 5output = open("document-output.pdf", "wb")merger.write(output)'''1导入PyPDF2合并模块PdfFileMerger;2读取需要处理和合并的PDF文档;3从第一个PDF文档中取出需要合并的前3页;4把第二个PDF文档的第一页插入到文档中;5把第三个PDF文档附到输出文档末尾;'''#旋转input1.getPage(1).rotateClockwise(90)#使页面1旋转90度#添加水印page = input1.getPage(3)watermark = PdfFileReader(open("watermark.pdf", "rb"))page.mergePage(watermark.getPage(0))#其中,水印存储在另外一个PDF文档watermark.pdf中。#加密password = "secret"output.encrypt(password)
结果
还请各位自己运行,运行程序时注意修改PDF文档的文件名
5:The Other Classes in PyPDF2:
5.1:The DocumentInformation Class
表示PDF文件中提供的基本文档元数据的类。该类可通过以下方式访问 getDocumentInfo() 文档元数据的所有文本属性都有 两个属性,例如。作者和author_raw。non-raw属性将始终返回a TextStringObject,使其非常适合显示元数据的情况。ByteStringObject如果PyPDF2无法解码字符串的文本编码,则raw属性有时会返回;这要求在呼叫者中增加安全性,因此不常用。
M = PyPDF2.DocumentInformation()
其中参数:无
关于The DocumentInformation Class的一些属性的讲解
The DocumentInformation Class相关代码举例
以下代码均在Anaconda3上正常运行
from PyPDF2 import PdfFileReader>>> inputPdf = PdfFileReader(open("test.pdf", "rb"))>>> docInfo = inputPdf.getDocumentInfo()>>> docInfo.authorAnonymous>>> docInfo.creatorHewlett Packard MFP>>> docInfo.producerAcrobat Distiller 10.0.0 (Windows)>>> docInfo.titleA Test>>> docInfo.subjecttesting
结果
5.2:The XmpInformation Class
表示Adobe XMP元数据的对象。通常由getXmpMetadata()
N = PyPDF2.XmpInformation(stream)
其中参数:无
关于The XmpInformation Class的一些属性的讲解
5.3:The Destination Class
表示PDF文件中目标的类
O = PyPDF2.generic.Destination(title, page, typ, *args)
其中参数: title:此目的地的标题 page:此目标的页码 typ:如何显示目的地 *args:其他参数
关于The Destination Class的一些属性的讲解
以下属性均为只读属性
5.4:The RectangleObject Class
此类用于表示PyPDF2中的页面框。这些框包括: artBox bleedBox cropBox mediaBox trimBoxP = PyPDF2.generic.RectangleObject(arr)
其中参数:无
关于The RectangleObject Class的一些属性的讲解
5.5:The Field Class
表示字段字典的类。此类通过以下方式访问 getFields()
M = PyPDF2.generic.Field(data)
其中参数:
data:数据
关于The Field Class的一些属性的讲解
以下属性均为只读属性