2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python自动化办公:pdf文档操作

Python自动化办公:pdf文档操作

时间:2023-10-04 13:36:43

相关推荐

Python自动化办公:pdf文档操作

在后台回复【阅读书籍】

即可获取python相关电子书~

Hi,我是山月。

之前给大家介绍了python处理excel、word、ppt的相关教程,不知道大家学的怎么样?

在后台回复【自动化办公】即可查看全部自动化办公教程哦~

今天来给大家介绍下python处理pdf文档的一个库--PyPDF2

PyPDF2 是源自 pyPdf 项目的纯 Python PDF 工具包。它擅长处理PDF文档本身,比如对PDF 文档进行分割、 合并、 插入等操作

官网:/PyPDF2/index.html

安装:pip install pypdf2

01

基础知识

PyPDF2 一共有4大主模块:PdfFileReader、PdfFileWriter、PdfFileMerger、PageObject,分别是读、写、合并、页面对象。

1、PdfFileReader

1、导入

fromPyPDF2importPdfFileReader

2、获取 PdfFileReader 对象

PdfFileReader(stream,strict=True,warndest=None,overwriteWarnings=True)参数:stream :一个 File 对象或支持类似于 File 对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。strict (bool):确定是否应该警告用户所有的问题,也会导致一些可纠正的问题是致命的。默认值为True。warndest :记录警告的目标(默认为 sys.stderr)。overwriteWarnings (bool):确定是否使用自定义实现覆盖 Python 的 warnings.py 模块(默认为 True)。

比如想读取将进酒.pdf内容:

pdfFileReader=PdfFileReader(open('将进酒.pdf','rb'))#获取PdfileReader对象#也可以:pdfFileReader = PdfFileReader('将进酒.pdf')

3、一些方法与属性

4、实例

现在有一个2页的将进酒.pdf文件:

fromPyPDF2importPdfFileReaderpdfFileReader=PdfFileReader(open('将进酒.pdf','rb'))documentInfo=pdfFileReader.documentInfoprint(documentInfo)#检索文档信息'''{'/Author':'是山月呀','/Comments':'','/Company':'','/CreationDate':"D:0312161040+08'10'",'/Creator':'WPS文字','/Keywords':'','/ModDate':"D:0314130926+08'00'",'/Producer':'','/SourceModified':"D:0312161040+08'10'",'/Subject':'','/Title':'','/Trapped':'/False'}'''print(documentInfo.author)#检索文档的作者--->>是山月呀pages=pdfFileReader.numPages#计算文件的页数print(pages)#--->>2page=pdfFileReader.getPage(1)#检索第2页页面print(page)'''{'/Type':'/Page','/Parent':IndirectObject(2,0),'/MediaBox':[0,0,595.276,841.89],'/Rotate':0,'/Resources':{'/Font':{'/KSPF1':IndirectObject(29,0),'/KSPF2':IndirectObject(31,0)}},'/Contents':IndirectObject(33,0)}'''pageLayout=pdfFileReader.pageLayout#获取页面布局print(pageLayout)#--->>Noneis_Encrypted=pdfFileReader.isEncrypted#判断是否加密print(is_Encrypted)#--->>False

2、PdfFileWriter

1、导入

fromPyPDF2importPdfFileWriter

2、初始化PdfFileReader 对象

PdfFileWriter=PdfFileWriter()

3、一些方法与属性

1、文件写入

write(stream)参数:stream:要将文件写入的对象。

2、添加页面

addPage(page)参数:page:要添加到文档的页面,应该是 PageObject 的一个实例

3、添加空白页

addBlankPage(width=None,height=None)参数:width(float)–页面的宽度。height(float)–页面的高度。如果未指定页面大小,则使用最后一页的大小。如果未指定页面大小并且上一页不存在,则会引发PageSizeNotDefinedError。

4、添加书签

addBookmark(title,pagenum,parent=None,color=None,bold=False,italic=False,fit='/Fit',*args)参数:title (str):用于此书签的标题。pagenum (int):此书签将指向的页码。parent :对父书签的引用以创建嵌套书签。color (tuple):书签的颜色为从0.0到 1.0的红、绿、蓝元组bold (bool):书签为粗体italic (bool):书签是斜体fit (str):目标页面的适合度。

5、写入读取的文档

appendPagesFromReader(reader,after_page_append=None)参数:reader:一个 PdfFileReader 对象after_page_append(function):调用的回调函数

6、加密

encrypt(user_pwd,owner_pwd=None,use_128bit=True)参数:user_pwd (str):“用户密码”,允许在提供的限制下打开和阅读 PDF 文件。owner_pwd (str):“所有者密码”,允许不受任何限制地打开 PDF 文件。默认情况下,所有者密码与用户密码相同。use_128bit (bool):标记是否使用 128 位加密,默认为True。为false时,将使用 40位加密。

7、插入空白页

insertBlankPage(width=None,height=None,index=0)参数:width(float):页面的宽度。height(float):页面的高度。index (int):添加页面的位置。如果未指定页面大小,则使用最后一页的大小。如果未指定页面大小并且上一页不存在,则会引发PageSizeNotDefinedError

8、插入页面

insertPage(page,index=0)参数:page (PageObject):要添加到文档的页面,该参数是 PageObject 的一个实例。index (int):将插入页面的位置。

9、获取页数

getNumPages()

10、按页码检索页面

getPage(pageNumber)参数:pageNumber (int):要检索的页码(从0开始)

11、设置页面布局

setPageLayout(layout)参数:layout (str):要使用的页面布局。但是设置了没有发生作用。可设置的布局有:/NoLayout:未指定布局/SinglePage:一次显示一页/OneColumn:一次显示一列/TwoColumnLeft:分两列显示页面,奇数页在左边/TwoColumnRight:分两列显示页面,奇数页在右边/TwoPageLeft:一次显示两页,奇数页在左边/TwoPageRight:一次显示两页,奇数页在右边

12、获取页面布局

getPageLayout()#也可以:pageLayout

13、设置页面模式

setPageMode(mode)参数:mode (str):要使用的页面模式。但是设置了没有发生作用。可设置的页面模式有:/UseNone:不显示面板/UseOutlines:查看文档书签/UseThumbs:查看文档缩略图/UseAttachments:查看文件附件/FullScreen:全屏视图/UseOC:显示可选内容组(OCG)

14、获取页面模式

getPageMode()#也可以:pageMode

15、删除图像

removeImages(ignoreByteStringObject=False)参数:ignoreByteStringObject (bool):忽略 ByteString 对象的可选参数。

16、删除文字

removeText(ignoreByteStringObject=False)参数:ignoreByteStringObject (bool):忽略 ByteString 对象的可选参数。

17、删除链接和注释

removeLinks()

3、PdfFileMerger

1、导入

fromPyPDF2importPdfFileMerger

2、获取PdfFileMerger 对象

PdfFileMerger(strict=True)参数:strict (bool)–确定是否应该警告用户所有的问题,也会导致一些可纠正的问题是致命的。默认值为True。

3、一些方法与属性

1、合并

merge(position,fileobj,bookmark=None,pages=None,import_bookmarks=True)参数:position (int):插入此文件的页码,文件将在给定编号之后插入。fileobj:文件对象或支持类似于文件对象的标准读取和查找方法的对象,也可以是表示 PDF 文件路径的字符串。bookmark (str):可以通过提供书签的文本来指定要在包含文件的开头应用的书签。pages :指定要合并的的页面范围,可以是Range 或(start, stop[, step])元组import_bookmarks (bool):可以通过将其指定为 False 来阻止导入源文档的书签。

2、附加

append(fileobj,bookmark=None,pages=None,import_bookmarks=True)参数:fileobj:文件对象或支持类似于文件对象的标准读取和查找方法的对象,也可以是表示 PDF 文件路径的字符串。bookmark (str):可以通过提供书签的文本来指定要在包含文件的开头应用的书签。pages :指定要合并的的页面范围,可以是Range 或(start, stop[, step])元组import_bookmarks (bool):可以通过将其指定为 False 来阻止导入源文档的书签。

3、添加书签

addBookmark(title,pagenum,parent=None)参数:title (str):用于此书签的标题。pagenum (int):此书签将指向的页码。parent:对父书签的引用以创建嵌套书签。

4、文件写入

write(fileobj)参数:fileobj :输出文件。可以是文件名或任何类型的类似文件的对象。

5、设置页面布局

setPageLayout(layout)参数:layout (str):要使用的页面布局

6、设置页面模式

setPageMode(mode)参数:mode (str):要使用的页面模式。

4、PageObject

页面对象一般是通过访问 PdfFileReader 的 getPage() 方法创建的。

1、几个页面大小属性

1、artBox

一个 RectangleObject,以默认用户空间单位表示,定义页面创建者所期望的页面有意义内容的范围。

2、bleedBox

一个 RectangleObject,以默认用户空间单位表示,定义在生产环境中输出时页面内容应剪切到的区域。

3、cropBox

一个 RectangleObject,以默认用户空间单位表示,定义默认用户空间的可见区域。

当页面被显示或打印时,其内容将被剪裁(裁剪)到这个矩形,然后以某种实现定义的方式施加到输出介质上。

默认值:与 mediaBox 相同。

4、mediaBox

一个 RectangleObject,以默认用户空间单位表示,定义了要在其上显示或打印页面的物理介质的边界。

5、trimBox

一个 RectangleObject,以默认用户空间单位表示,定义修剪后完成页面的预期尺寸。

2、合并页面

1、合并页面

mergePage(page2)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。

2、合并旋转页面

mergeRotatedPage(page2,rotation,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。rotation(float):旋转的角度,以度为单位expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

3、合并旋转缩放页面

mergeRotatedScaledPage(page2,rotation,scale,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。rotation(float):旋转的角度,以度为单位scale(float):比例因子expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

4、合并旋转缩放平移页面

mergeRotatedScaledTranslatedPage(page2,rotation,scale,tx,ty,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。tx(float):X轴平移ty(float):Y轴平移rotation(float):旋转的角度,以度为单位scale(float):比例因子expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

5、合并旋转平移页面

mergeRotatedTranslatedPage(page2,rotation,tx,ty,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。tx(float):X轴平移ty(float):Y轴平移rotation(float):旋转的角度,以度为单位expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

6、合并缩放页面

mergeScaledPage(page2,scale,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。scale(float):比例因子expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

7、合并缩放平移页面

mergeScaledTranslatedPage(page2,scale,tx,ty,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。scale(float):比例因子tx(float):X轴平移ty(float):Y轴平移expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

8、合并转换页面

mergeTransformedPage(page2,ctm,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。ctm (tuple):包含转换矩阵操作的6元元组expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

9、合并平移页面

mergeTranslatedPage(page2,tx,ty,expand=False)参数:page2 (PageObject):要合并到此页面的页面,是 PageObject 的一个实例。tx(float):X轴平移ty(float):Y轴平移expand (bool):是否应扩展页面以适应要合并的页面的尺寸。

3、旋转

1、顺时针旋转

rotateClockwise(angle)参数:angle (int):旋转页面的角度,必须是 90度的增量。

2、逆时针旋转

rotateCounterClockwise(angle)参数:angle (int):旋转页面的角度,必须是 90度的增量。

4、缩放

1、x、y轴分别缩放

scale(sx,sy)参数:sx(float):水平轴上的比例因子。sy(float):垂直轴上的比例因子。

2、x、y轴同时缩放

scaleBy(factor)参数:factor(float):比例因子(对于 X 和 Y 轴)。

3、缩放到指定尺寸

scaleTo(width,height)参数:width(float):新的宽度height(float):新的高度

02

实例

1、添加水印

有一个将进酒.pdf文件:

现在要给它加上水印,要如何实现呢?

1、文字水印

新建一个pdf水印文件,里面是要加的水印文字,如:

代码实现:

fromPyPDF2importPdfFileReader,PdfFileWriter#导入读、写模块PdfFileWriter=PdfFileWriter()#获取PdfFileWriter对象pdf_file=PdfFileReader(open('将进酒.pdf','rb'))#要添加水印的文档num_pages=pdf_file.getNumPages()#获取pdf文件的页数foriinrange(num_pages):first_page=pdf_file.getPage(i)#获取文件的第i+1页text_watermark=PdfFileReader(open('文字.pdf','rb'))#文字水印文档page_watermark=text_watermark.getPage(0)#获取pdf文件第1页页面page_watermark.mergePage(first_page)#合并两个页面PdfFileWriter.addPage(page_watermark)#把合并后的页面写入pdf文件PdfFileWriter.write(open('实例.pdf','wb'))#保存pdf文件

效果:

2、图片水印

添加图片水印与添加文字水印是一样的操作。

新建一个图片水印文件:

然后把代码里的文字水印文件改成图片水印文件:

fromPyPDF2importPdfFileReader,PdfFileWriter#导入读、写模块PdfFileWriter=PdfFileWriter()#获取PdfFileWriter对象pdf_file=PdfFileReader(open('将进酒.pdf','rb'))#要添加水印的文档num_pages=pdf_file.getNumPages()#获取pdf文件的页数foriinrange(num_pages):first_page=pdf_file.getPage(i)#获取文件的第i+1页text_watermark=PdfFileReader(open('图片.pdf','rb'))#图片水印文档page_watermark=text_watermark.getPage(0)#获取pdf文件第1页页面page_watermark.mergePage(first_page)#合并两个页面PdfFileWriter.addPage(page_watermark)#把合并后的页面写入pdf文件PdfFileWriter.write(open('实例.pdf','wb'))#保存pdf文件

效果:

2、PDF合并

现在有两个pdf文件:将进酒.pdf、梦游天姥吟留别.pdf。

合并两个文档的代码实现:

fromPyPDF2importPdfFileMergerPdfFileMerger=PdfFileMerger()PdfFileMerger.append('将进酒.pdf')#附加将进酒.pdf内容PdfFileMerger.append('梦游天姥吟留别.pdf')#附加梦游天姥吟留别.pdf内容PdfFileMerger.write(open('实例.pdf','wb'))

效果:

3、PDF插入

以我们刚刚的两个文件:将进酒.pdf、梦游天姥吟留别.pdf为例。

假如我们现在需要,在将进酒.pdf第一页的后面插入梦游天姥吟留别.pdf的文档内容,要如何实现呢?

代码实现:

fromPyPDF2importPdfFileMergerPdfFileMerger=PdfFileMerger()PdfFileMerger.merge(0,'将进酒.pdf')PdfFileMerger.merge(1,'梦游天姥吟留别.pdf')PdfFileMerger.write(open('实例.pdf','wb'))

效果:

4、PDF分割

假设我们现在有这样一个文件:数据.pdf,它一共有6页:

现在我们把它两页两页的分割成一个文档,也就是一共分成三个文档。

代码实现:

fromPyPDF2importPdfFileReader,PdfFileWriterpdfFileReader=PdfFileReader('数据.pdf')#获取PdfFileReader对象num_pages=pdfFileReader.getNumPages()#获取页数foriinrange(0,num_pages,2):pdfFileWriter=PdfFileWriter()page_Obj=pdfFileReader.getPage(i)#获取第i+1页页面pdfFileWriter.addPage(page_Obj)#添加读取的第i+1页页面page_Obj=pdfFileReader.getPage(i+1)#获取第i+2页页面pdfFileWriter.addPage(page_Obj)#添加读取的第i+2页页面outfile='第%s页--第%s页.pdf'%(i+1,i+2)pdfFileWriter.write(open(outfile,'wb'))

效果:

5、PDF删除页面

一样的,我们以数据.pdf文件为例,现在我们来删除第3页的内容。

代码实现:

fromPyPDF2importPdfFileReader,PdfFileWriterpdfFileReader=PdfFileReader('数据.pdf')#获取PdfFileReader对象num_pages=pdfFileReader.getNumPages()#获取页数pdfFileWriter=PdfFileWriter()foriinrange(num_pages):ifi!=2:page_Obj=pdfFileReader.getPage(i)#获取第i+1页页面pdfFileWriter.addPage(page_Obj)#添加读取的第i+1页页面outfile='实例.pdf'pdfFileWriter.write(open(outfile,'wb'))

效果:

6、PDF提取页面

一样的,我们以数据.pdf文件为例,现在我们来提取第3页的内容,并另存为一个新文件。

代码:

fromPyPDF2importPdfFileReader,PdfFileWriterpdfFileReader=PdfFileReader('数据.pdf')#获取PdfFileReader对象num_pages=pdfFileReader.getNumPages()#获取页数pdfFileWriter=PdfFileWriter()foriinrange(num_pages):ifi==2:page_Obj=pdfFileReader.getPage(i)#获取第i+1页页面pdfFileWriter.addPage(page_Obj)#添加读取的第i+1页页面outfile='实例.pdf'pdfFileWriter.write(open(outfile,'wb'))

效果:

7、PDF旋转页面

我们把将进酒.pdf文档顺时针旋转90°。

代码:

fromPyPDF2importPdfFileReader,PdfFileWriterpdfFileReader=PdfFileReader('将进酒.pdf')#获取PdfFileReader对象num_pages=pdfFileReader.getNumPages()#获取页数pdfFileWriter=PdfFileWriter()foriinrange(num_pages):page_Obj=pdfFileReader.getPage(i)#获取第i+1页页面page_Obj.rotateClockwise(90)#顺时针旋转90°pdfFileWriter.addPage(page_Obj)#添加读取的第i+1页页面outfile='实例.pdf'pdfFileWriter.write(open(outfile,'wb'))

效果:

8、PDF拼接页面

我们以数据.pdf为例,假设我们现在需要把前4页的页面,拼接到一个页面上去,如何实现呢?

代码实现:

fromPyPDF2importPdfFileReader,PdfFileWriterPdfFileWriter=PdfFileWriter()pdfFileReader=PdfFileReader(open('数据.pdf','rb'))page_1=pdfFileReader.getPage(0)#获取第1页页面page_1.scaleTo(100,150)#页面缩放至宽100,高150page_2=pdfFileReader.getPage(1)#获取第2页页面page_2.scaleTo(100,150)#页面缩放至宽100,高150page_3=pdfFileReader.getPage(2)#获取第3页页面page_3.scaleTo(100,150)#页面缩放至宽100,高150page_4=pdfFileReader.getPage(3)#获取第4页页面page_4.scaleTo(100,150)#页面缩放至宽100,高150page_1.mergeTranslatedPage(page_2,100,0,expand=True)#拼接页面page_1.mergeTranslatedPage(page_3,0,-150,expand=True)#拼接页面page_1.mergeTranslatedPage(page_4,100,-150,expand=True)#拼接页面PdfFileWriter.addPage(page_1)PdfFileWriter.write(open('实例.pdf','wb'))

效果:

9、PDF加密解密

1、加密

fromPyPDF2importPdfFileReader,PdfFileWriterpdfFileReader=PdfFileReader('将进酒.pdf')#获取PdfFileReader对象num_pages=pdfFileReader.getNumPages()#获取页数pdfFileWriter=PdfFileWriter()foriinrange(num_pages):page_Obj=pdfFileReader.getPage(i)#获取第i+页页面pdfFileWriter.addPage(page_Obj)#添加读取的第i+1页页面pdfFileWriter.encrypt('123456')#加密outfile='实例.pdf'pdfFileWriter.write(open(outfile,'wb'))

效果:

如果这个时候我们操作文件的话,会报错:

2、解密

fromPyPDF2importPdfFileReaderpdfFileReader=PdfFileReader('实例.pdf')#获取PdfFileReader对象is_encrypted=pdfFileReader.isEncrypted#判断是否加密print(is_encrypted)#-->>Trueis_password=pdfFileReader.decrypt('123456')print(is_password)#-->>1is_encrypted=pdfFileReader.isEncrypted#判断是否加密print(is_encrypted)#-->>Truenum_pages=pdfFileReader.getNumPages()#获取页数print(num_pages)#-->>2

好啦,关于PyPDF2的内容我们就讲到这。

当然,对于PyPDF2的操作更多是在文档本身上,因此如果想对文档内容进行操作的话,得另找它路。这个我们就下次再分享啦。

关注👉是山月呀,来和山月一起学习吧~

END

您的“点赞”、“在看”和 “分享”是我们产出的动力。

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