关于PDF的相关操作-----PyPDF2

对于pdf文件的相关操作,PyPDF2文档中具有许多功能,阅读完本文后相信你会对pdf的操作变得非常自信!!

https://pythonhosted.org/PyPDF2/

该网址是PyPDF2英文文档的链接,本人从中提取了相应数据,并制作成表格方便大家比较和分析。

目录

一、准备工作

1.安装PyPDF2

 2.导入相应的库

 二、类的介绍

1.PdfFileReader()

2.PdfFileMerger()

3.PageObject()

4.PdfFileWriter()

三、代码演示---将pdf分割成自己想要的pdf

1.思路

2.代码与结果展示

3.总结


一、准备工作

1.安装PyPDF2

本文采用在pycharm中安装,左上角File---Settings---找到Project---Python interpreter---点击+

---输入pypdf2(大小写均可)---点击install Package---最后等待安装

 2.导入相应的库

由于PyPDF2中有很多类,每个类中又有许多方法

 所以导入相应的类时要注意层次和大小写

from PyPDF2 import PdfFileReader, PdfFileWriter

 二、类的介绍

注:以下表格建议在电脑上查看,红色的内容为平时用的比较多的方法。

1.PdfFileReader

PdfFileReaderstrict=Truewarndest=NoneoverwriteWarnings=True 

含义:初始化 PdfFileReader 对象。此操作可能需要一些时间,因为 PDF 流的交叉引用表被读入内存。

参数:
  • – File 对象或支持类似于 File 对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。
  • 严格bool ) - 确定是否应警告用户所有问题,并导致一些可纠正的问题成为致命的。默认为True.
  • warndest – 记录警告的目的地(默认为 sys.stderr)。
  • overwriteWarnings ( bool ) – 确定是否warnings.py使用自定义实现覆盖 Python 的 模块(默认为 True)。
方法名含义参数返回返回类型
decrypt(密码)当使用带有 PDF 标准加密处理程序的加密/安全 PDF 文件时,此功能将允许解密文件。它根据文档的用户密码和所有者密码检查给定的密码,然后如果其中一个密码正确,则存储生成的解密密钥。密码str ) – 要匹配的密码。

0如果密码失败,

1密码是否与用户密码匹配,

2密码是否与所有者密码匹配。

整数

getDestinationPageNumber(目的地)

检索给定 Destination 对象的页码目的地目的地)– 获取页码的目的地。页码  或 -1(找不到页面)整数
getDocumentInfo检索 PDF 文件的文档信息字典(如果存在)。请注意,某些 PDF 文件使用元数据流而不是 docinfo 词典,并且此功能不会访问这些元数据流。此 PDF 文件的文档信息DocumentInformation或者None(不存在)

getFieldstree=None ,

 retval=None , fileobj=None )

如果此 PDF 包含交互式表单字段,则提取字段数据。该retval的参数是递归使用。fileobj – 一个文件对象(通常是一个文本文件),用于针对找到的所有交互式表单字段编写报告。一个字典,其中每个键是一个字段名称,每个值是一个Field对象。默认情况下,映射名称用于键。dict,或者None如果找不到表单数据。
getFormTextFields)从带有文本数据(输入、下拉菜单)的文档中检索表单域
getNamedDestinationstree=None , retval=None )检索文档中存在的命名目的地。将名称映射到 Destinations字典
getNumPages( ) 计算此 PDF 文件中的页数。页数整数
getOutlinesnode=None , outlines=None )检索文档中存在的文档大纲。嵌套列表Destinations
getPagepageNumber )从此 PDF 文件中按编号检索页面。pageNumber ( int ) – 要检索的页码(页面从零开始)一个PageObject实例PageObject
getPageLayout获取页面布局。有关setPageLayout() 有效布局的说明,请参见当前使用的页面布局。str,None如果没有指定
getPageMode获取页面模式。有关setPageMode() 有效模式的说明,请参见当前使用的页面模式str,None如果没有指定
getPageNumber(页面检索给定 PageObject 的页码page ( PageObject ) – 获取页码的页面。应该是一个实例PageObject页码  或 -1(找不到页面)整数
getXmpMetadata)从 PDF 文档根检索 XMP(可扩展元数据平台)数据XmpInformation 可用于从文档访问 XMP 元数据的实例XmpInformation或者 None如果在文档根目录中未找到元数据

2.PdfFileMerger()

PdfFileMerger严格=真

含义:初始化 PdfFileMerger 对象。PdfFileMerger 将多个 PDF 合并为一个 PDF。它可以连接、切片、插入或以上任意组合。

参数:严格bool ) - 确定是否应警告用户所有问题,并导致一些可纠正的问题成为致命的。默认为True.

方法名含义参数
addBookmarktitle , pagenum , parent=None )向此 PDF 文件添加书签。

title ( str ) – 用于此书签的标题。

pagenum ( int ) – 此书签将指向的页码。

parent – 对父书签的引用以创建嵌套书签。

addMetadata(信息)将自定义元数据添加到输出。

infos ( dict ) – 一个 Python 字典,其中每个键都是一个字段,每个值都是您的新元数据。例:{u'/Title': u'My title'}

addNamedDestination(标题,页码向输出添加目的地 。         

title ( str ) – 要使用的标题

pagenum ( int ) – 此目标指向的页码

appendfileobj , bookmark=None , 

pages=None , import_bookmarks=True )

与该merge()方法相同,但假设您希望将所有页面连接到文件末尾而不是指定位置

fileobj – 文件对象或支持类似于文件对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。

bookmark ( str ) – 可选地,您可以通过提供书签的文本来指定要在包含文件的开头应用的书签。

pages - 可以是一个Page Range或一个元组,用于将源文档中的指定范围的页面合并到输出文档中。(start, stop[, step])

import_bookmarks ( bool ) – 您可以通过将其指定为 来阻止源文档的书签被导入False

close( ) 关闭所有文件描述符(输入和输出)并清除所有内存使用。

mergeposition , fileobj , bookmark=No

ne,pages=None , import_bookmarks=True 

将给定文件中的页面合并到指定页码处的输出文件中。

position ( int ) –要插入此文件的页码。文件将被插入到给定的数字之后。

fileobj – 文件对象或支持类似于文件对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。

bookmark ( str ) – 可选地,您可以通过提供书签的文本来指定要在包含文件的开头应用的书签。

pages - 可以是一个Page Range或一个元组,用于将源文档中的指定范围的页面合并到输出文档中。(start, stop[, step])

import_bookmarks ( bool ) – 您可以通过将其指定为 来阻止源文档的书签被导入False

setPageLayout(布局设置页面布局layout ( str ) – 要使用的页面布局
setPageMode(模式)设置页面模式。mode ( str ) – 要使用的页面模式。
write( 文件对象)写入已合并到给定输出文件的所有数据。fileobj – 输出文件。可以是文件名或任何类型的类文件对象。

3.PageObject

PageObjectpdf=NoneindirectRef=None 

含义:此类表示 PDF 文件中的单个页面。通常这个对象会通过访问类的getPage()方法 来创建 PdfFileReader,但也可以使用createBlankPage()静态方法创建一个空页面 。

参数:
  • pdf – 页面所属的 PDF 文件。
  • 间接引用 - 在其源 PDF 中存储对该对象的原始间接引用
方法名含义参数

addTransformationctm 

  将转换矩阵应用于页面。ctm ( tuple ) – 包含变换矩阵操作数的 6 元素元组。

compressContentStreams( ) 

通过加入所有内容流并应用 FlateDecode 过滤器来压缩此页面的大小。

但是,如果由于某种原因内容流压缩变为“自动”,则此功能可能不会执行任何操作。

extractText( ) 

按照内容流中提供的顺序定位所有文本绘制命令,然后提取文本。这对某些 PDF 文件效果很好,但对其他文件效果不佳,具体取决于所使用的生成器。这将在未来细化。不要依赖于这个函数的文本顺序,因为如果这个函数变得更复杂,它会改变。一个 unicode 字符串对象。

getContents( ) 

访问页面内容。/Contents对象,或者None如果它不存在。 /Contents是可选的

mergePage第2页

将两个页面的内容流合并为一个。资源引用(即字体)由两个页面维护。此页面的媒体框/裁剪框/等未更改。参数页面的内容流将被添加到此页面的内容流的末尾,这意味着它将在此页面之后或“顶部”绘制。page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

mergeRotatedPagepage2 ,旋转expand=False 

这类似于mergePage,但要合并的流是通过应用转换矩阵来旋转的

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

旋转float)–旋转的角度,以度为单位

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeRotatedScaledPagepage2 , rotation , scale , expand=False 

这类似于mergePage,但要合并的流通过应用变换矩阵进行旋转和缩放。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

旋转float)–旋转的角度,以度为单位

scale ( float ) – 缩放因子expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeRotatedScaledTranslatedPagepage2 , rotation , scale , tx , ty , expand=False 

这类似于mergePage,但要合并的流通过应用转换矩阵进行平移、旋转和缩放。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

tx ( float ) – X 轴上的平移

ty ( float ) – Y 轴上的平移

旋转float)–旋转的角度,以度为单位

scale ( float ) – 缩放因子

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeRotatedTranslatedPagepage2 , rotation , tx , ty , expand=False 

这类似于mergePage,但要合并的流通过应用转换矩阵进行旋转和平移。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

tx ( float ) – X 轴上的平移

ty ( float ) – Y 轴上的平移

旋转float)–旋转的角度,以度为单位

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeScaledPagepage2 , scale , expand=False )

这类似于mergePage,但要合并的流是通过应用转换矩阵来缩放的。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

scale ( float ) – 缩放因子

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeScaledTranslatedPagepage2 , scale , tx , ty , expand=False 

这类似于mergePage,但要合并的流通过应用转换矩阵进行转换和缩放。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

scale ( float ) – 缩放因子

tx ( float ) – X 轴上的平移

ty ( float ) – Y 轴上的平移

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeTransformedPagepage2 , ctm , expand=False 

这类似于mergePage,但转换矩阵应用于合并的流。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

ctm ( tuple ) – 包含变换矩阵操作数的 6 元素元组

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

mergeTranslatedPagepage2 , tx , ty , expand=False 

这类似于mergePage,但要合并的流是通过应用转换矩阵来转换的。

page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject

tx ( float ) – X 轴上的平移

ty ( float ) – Y 轴上的平移

expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。

rotateClockwise(角度

以 90 度为增量顺时针旋转页面。角度int ) – 旋转页面的角度。必须是 90 度的增量

rotateCounterClockwise(角度

以 90 度为增量逆时针旋转页面。角度int ) – 旋转页面的角度。必须是 90 度的增量

scalesx , sy 

通过将转换矩阵应用于其内容并更新页面大小,按给定因子缩放页面。

sx ( float ) – 水平轴上的缩放因子。

sy ( float ) – 垂直轴上的缩放因子。

scaleBy(因子

通过将转换矩阵应用于其内容并更新页面大小,按给定因子缩放页面。factor ( float ) – 缩放因子(对于 X 和 Y 轴)。

scaleTo(宽度,高度

通过将转换矩阵应用于其内容并更新页面大小,将页面缩放到指定的尺寸。

width ( float ) – 新的宽度。

height ( float ) – 新的高度。


 

4.PdfFileWriter()

PdfFileWriter

含义:给定由另一个类(通常为PdfFileReader)生成的页面,此类支持写出 PDF 文件。

方法名含义参数返回返回类型

addAttachmentfname , fdata 

在 PDF 中嵌入文件。

fname ( str ) – 要显示的文件名。

fdata ( str ) – 文件中的数据。

addBlankPage宽度=无高度=无

将空白页附加到此 PDF 文件并返回。如果未指定页面大小,则使用最后一页的大小。

width ( float ) – 以默认用户空间单位表示的新页面的宽度。

height ( float ) – 以默认用户空间单位表示的新页面的高度。

addBookmarktitle , pagenum , parent=None

 , color=None , bold=False ,

 italic=False , fit='/Fit' , *args 

向此 PDF 文件添加书签。

title ( str ) – 用于此书签的标题。

pagenum ( int ) – 此书签将指向的页码。

parent – 对父书签的引用以创建嵌套书签。

color ( tuple ) – 书签的颜色为从 0.0 到 1.0 的红、绿、蓝元组

粗体bool ) – 书签为粗体

斜体bool ) – 书签为斜体

fit ( str ) – 目标页面的适合度。详情请参阅 addLink()

addJSjavascript 

添加将在打开此 PDF 时启动的 Javascript。javascript ( str ) – 你的 Javascript。

addLinkpagenum , pagedest , 

rect , border=None , fit='/Fit' , *args 

添加从矩形区域到指定页面的内部链接。

pagenum ( int ) – 放置链接的页面的索引。

pagedest ( int ) – 链接应该转到的页面的索引。

rect –RectangleObject或四个整数的数组,指定可点击的矩形区域 ,或形式为 的字符串。[xLL, yLL, xUR, yUR]"[ xLL yLL xUR yUR ]"

border - 如果提供,则是一个描述边框绘制属性的数组。有关详细信息,请参阅 PDF 规范。如果省略此参数,则不会绘制边框。

fit ( str ) – 页面适合或“缩放”选项(见下文)。可能需要提供其他参数。传递None将被读取为该坐标的空值。

addMetadata(信息

将自定义元数据添加到输出。infos ( dict ) – 一个 Python 字典,其中每个键都是一个字段,每个值都是您的新元数据。

addPage(页面

向此 PDF 文件添加页面。该页面通常是从PdfFileReader实例中获取的 。page ( PageObject ) – 要添加到文档的页面。应该是一个实例PageObject

appendPagesFromReader(读者after_page_append=None 

将页面从读者复制到作者。包括一个可选的回调参数,在将页面附加到编写器后调用该参数。

reader – 一个 PdfFileReader 对象,从中复制页面注释到这个 writer 对象。

cloneDocumentFromReader(读者after_page_append=None 

从 PDF 文件阅读器创建文档的副本(克隆)

阅读器- 应从中创建克隆的 PDF 文件阅读器实例。

cloneReaderDocumentRoot(读者

将读取器文档根目录复制到写入器。reader – 应复制文档根目录中的 PdfFileReader。

encryptuser_pwd , owner_pwd=None , 

use_128bit=True 

使用 PDF 标准加密处理程序加密此 PDF 文件。

user_pwd ( str ) – “用户密码”,允许在提供的限制下打开和阅读 PDF 文件。

owner_pwd ( str ) – “所有者密码”,允许在没有任何限制的情况下打开 PDF 文件。默认情况下,所有者密码与用户密码相同。

use_128bit ( bool ) – 是否使用 128 位加密的标志。当为 false 时,将使用 40 位加密。默认情况下,此标志处于打开状态。

getNumPages( ) 

页数。整数

getPagepageNumber 

从此 PDF 文件中按编号检索页面。pageNumber ( int ) – 要检索的页码(页面从零开始)pageNumber给出的索引处的页面PageObject

getPageLayout( ) 

获取页面布局。有关setPageLayout()有效布局的说明,请参见。当前使用的页面布局。str, None 如果未指定

getPageMode( ) 

获取页面模式。有关setPageMode()有效模式的说明,请参见。当前使用的页面模式。str, None 如果未指定

insertBlankPagewidth=None ,

 height=None , index=0 

在此 PDF 文件中插入一个空白页并将其返回。如果未指定页面大小,则使用最后一页的大小。

width ( float ) – 以默认用户空间单位表示的新页面的宽度。

height ( float ) – 以默认用户空间单位表示的新页面的高度。

index ( int ) – 添加页面的位置。

新添加的页面PageObject

insertPage(,索引=0 

在此 PDF 文件中插入页面。该页面通常是从PdfFileReader实例中获取的 。

page ( PageObject ) – 要添加到文档的页面。这个参数应该是 的一个实例PageObject

index ( int ) – 页面将被插入的位置。

removeImagesignoreByteStringObject=False 

从此输出中删除图像。ignoreByteStringObject ( bool ) – 忽略 ByteString 对象的可选参数。

removeLinks( ) 

从此输出中删除链接和注释。

removeTextignoreByteStringObject=False 

从此输出中删除图像。ignoreByteStringObject ( bool ) – 忽略 ByteString 对象的可选参数。

setPageLayout(布局

设置页面布局layout ( str ) – 要使用的页面布局

setPageMode(模式

设置页面模式。mode ( str ) – 要使用的页面模式。

updatePageFormFieldValues页面字段

从字段字典更新给定页面的表单字段值。将字段文本和值从字段复制到页面。

page – PDF writer 的页面参考,其中注释和字段数据将被更新。

fields – 字段名称 (/T) 和文本值 (/V) 的 Python 字典

write(

将添加到此对象的页面集合作为 PDF 文件写出。stream -- 要写入文件的对象。该对象必须支持 write 方法和 tell 方法,类似于文件对象。

以上介绍了PyPDF2的四个主要类以及其中的方法名和具体用法。

三、代码演示---将pdf分割成自己想要的pdf

1.思路

现在网上的学习资料非常多,pdf也是如此,很多pdf都是书籍,一份pdf可能有上百页甚至上千页,这使得我们查具体资料的时候非常困难。

例:你现在有一本关于爬虫的书,有430页,当然,你基础知识是有的,只是你在写爬虫时经常忘记html解析的具体写法,如正则表达式、xpath语法的使用,这时如果你翻pdf,会发现步骤非常繁琐,首先你要找目录,根据目录来找到html解析的具体页数,最终通过滑动找到相应内容。而且如果你接着阅读pdf,等到下次要用到正则表达式、xpath语法时,你又得重新以上步骤,导致过程十分繁琐。

 

这时,你就可以运用以上知识,写一个代码,将你所需要的pdf从原pdf中"抠"出来。

2.代码与结果展示

看到这记得查看一下上面标红(平时用到比较多)的方法哦!!

from PyPDF2 import PdfFileReader, PdfFileWriter
def splitPDF():
    # C:\Users\knighthood\OneDrive\桌面\python合集\Python爬虫开发与项目实战.pdf
    readFile = input('请输入原PDF的所在位置与名称:')
    # .\copy.pdf 该格式使得pdf在当前目录下
    outFile = input('请输入你要将生成的PDF保存的位置与名称:')
    # 调用PdfFileWriter()类
    pdfFileWriter = PdfFileWriter()

    # 获取PdfFileReader 对象
    pdfFileReader = PdfFileReader(readFile)
    # 文档总页数
    numPages = pdfFileReader.getNumPages()
    print("原文档有{}页".format(numPages))

    a = int(input('从哪一页开始:'))
    b = int(input('到哪一页结束:'))
    c = b-a+1
    # 显示新文档有几页
    print("新文档共有{}页".format(c))
    for i in range(a-1, b):
        page = pdfFileReader.getPage(i)
        pdfFileWriter.addPage(page)

    # 添加完每页,然后一起保存在outFile中
    with open(outFile, 'wb') as f:
        pdfFileWriter.write(f)
splitPDF()

分析:该代码主要使用PdfFileReader, PdfFileWriter这两类,一个读取,一下写入。首先定义一个函数,在函数中读取pdf,将读取的pdf存到新的pdf中。

运行程序时,首先你要输入原pdf和新生成的pdf的路径与名称(要带后缀),接下来你要输入pdf截取的页数开头和结尾,你可以在wps中查看。如下:

运行结果如下:

 

只不过有时候你截的pdf开头或者结尾会有不是相关内容的出现,如下:

 

 但是这还是可以接受的,毕竟下一次阅读相关文档方便多了。

3.总结

使用该代码可以大幅度提高你查阅相关资料的速度,非常适用于对于我这样的懒人(记不住还不拿笔记在本子上)。

这篇万字文章就此完结,如果觉得写的不错的,希望点赞,这会是我接下来创作的动力!!

 

 

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

knighthood2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值