600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > PyPDF2--如何使用python操作你的PDF文档

PyPDF2--如何使用python操作你的PDF文档

时间:2022-05-18 03:35:14

相关推荐

PyPDF2--如何使用python操作你的PDF文档

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

Windows安装方法:

win+r输入cmd 打开命令窗口直接输入 pip install PyPDF2速度太慢可以使用镜像如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 trimBox

P = PyPDF2.generic.RectangleObject(arr)

其中参数:

关于The RectangleObject Class的一些属性的讲解

5.5:The Field Class

表示字段字典的类。此类通过以下方式访问

getFields()

M = PyPDF2.generic.Field(data)

其中参数:

data:数据

关于The Field Class的一些属性的讲解

以下属性均为只读属性

后记

本篇文章主要参考PyPDF2官方文档撰写,但本人英语水平有限,很多地方讲解可能没有到位。写这篇博客主要是想锻炼一下英语阅读水平有错的地方还请大家提出。这篇博客部分参考:/xingxtao/article/details/79056341很多代码并没有添加修改完善。等后期有时间再进行添加。下一期想出一个利用爬虫爬取基金的历史的估值和实际涨幅值作为训练数据再经过学习后进行预测可视化。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。