对于pdf文件的相关操作,PyPDF2文档中具有许多功能,阅读完本文后相信你会对pdf的操作变得非常自信!!
https://pythonhosted.org/PyPDF2/
该网址是PyPDF2英文文档的链接,本人从中提取了相应数据,并制作成表格方便大家比较和分析。
目录
一、准备工作
1.安装PyPDF2
2.导入相应的库
二、类的介绍
1.PdfFileReader()
2.PdfFileMerger()
3.PageObject()
4.PdfFileWriter()
三、代码演示---将pdf分割成自己想要的pdf
1.思路
2.代码与结果展示
3.总结
本文采用在pycharm中安装,左上角File---Settings---找到Project---Python interpreter---点击+
---输入pypdf2(大小写均可)---点击install Package---最后等待安装
由于PyPDF2中有很多类,每个类中又有许多方法
所以导入相应的类时要注意层次和大小写
from PyPDF2 import PdfFileReader, PdfFileWriter
注:以下表格建议在电脑上查看,红色的内容为平时用的比较多的方法。
PdfFileReader
()PdfFileReader
(流,strict=True,warndest=None,overwriteWarnings=True )
含义:初始化 PdfFileReader 对象。此操作可能需要一些时间,因为 PDF 流的交叉引用表被读入内存。
参数: |
|
---|
方法名 | 含义 | 参数 | 返回 | 返回类型 |
---|---|---|---|---|
decrypt (密码) |
当使用带有 PDF 标准加密处理程序的加密/安全 PDF 文件时,此功能将允许解密文件。它根据文档的用户密码和所有者密码检查给定的密码,然后如果其中一个密码正确,则存储生成的解密密钥。 | 密码( str ) – 要匹配的密码。 |
|
整数 |
|
检索给定 Destination 对象的页码 | 目的地(目的地)– 获取页码的目的地。 | 页码 或 -1(找不到页面) | 整数 |
getDocumentInfo ( ) |
检索 PDF 文件的文档信息字典(如果存在)。请注意,某些 PDF 文件使用元数据流而不是 docinfo 词典,并且此功能不会访问这些元数据流。 | 此 PDF 文件的文档信息 | DocumentInformation 或者None( 不存在) |
|
retval=None , fileobj=None ) |
如果此 PDF 包含交互式表单字段,则提取字段数据。该树和retval的参数是递归使用。 | fileobj – 一个文件对象(通常是一个文本文件),用于针对找到的所有交互式表单字段编写报告。 | 一个字典,其中每个键是一个字段名称,每个值是一个Field 对象。默认情况下,映射名称用于键。 |
dict,或者None 如果找不到表单数据。 |
getFormTextFields ( ) |
从带有文本数据(输入、下拉菜单)的文档中检索表单域 | |||
getNamedDestinations ( tree=None , retval=None ) |
检索文档中存在的命名目的地。 | 将名称映射到 Destinations |
字典 | |
getNumPages ( ) |
计算此 PDF 文件中的页数。 | 页数 | 整数 | |
getOutlines ( node=None , outlines=None ) |
检索文档中存在的文档大纲。 | 嵌套列表Destinations |
||
getPage ( pageNumber ) |
从此 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 如果在文档根目录中未找到元数据 |
PdfFileMerger
(严格=真)
含义:初始化 PdfFileMerger 对象。PdfFileMerger 将多个 PDF 合并为一个 PDF。它可以连接、切片、插入或以上任意组合。
参数: | 严格( bool ) - 确定是否应警告用户所有问题,并导致一些可纠正的问题成为致命的。默认为True . |
---|
方法名 | 含义 | 参数 |
---|---|---|
addBookmark ( title , pagenum , parent=None ) |
向此 PDF 文件添加书签。 | title ( str ) – 用于此书签的标题。 pagenum ( int ) – 此书签将指向的页码。 parent – 对父书签的引用以创建嵌套书签。 |
addMetadata (信息) |
将自定义元数据添加到输出。 | infos ( dict ) – 一个 Python 字典,其中每个键都是一个字段,每个值都是您的新元数据。例: |
addNamedDestination (标题,页码) |
向输出添加目的地 。 | title ( str ) – 要使用的标题 pagenum ( int ) – 此目标指向的页码 |
pages=None , import_bookmarks=True ) |
与该merge() 方法相同,但假设您希望将所有页面连接到文件末尾而不是指定位置 |
fileobj – 文件对象或支持类似于文件对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。 bookmark ( str ) – 可选地,您可以通过提供书签的文本来指定要在包含文件的开头应用的书签。 pages - 可以是一个Page Range或一个元组,用于将源文档中的指定范围的页面合并到输出文档中。 import_bookmarks ( bool ) – 您可以通过将其指定为 来阻止源文档的书签被导入 |
close ( ) |
关闭所有文件描述符(输入和输出)并清除所有内存使用。 | |
ne,pages=None , import_bookmarks=True ) |
将给定文件中的页面合并到指定页码处的输出文件中。 | position ( int ) –要插入此文件的页码。文件将被插入到给定的数字之后。 fileobj – 文件对象或支持类似于文件对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。 bookmark ( str ) – 可选地,您可以通过提供书签的文本来指定要在包含文件的开头应用的书签。 pages - 可以是一个Page Range或一个元组,用于将源文档中的指定范围的页面合并到输出文档中。 import_bookmarks ( bool ) – 您可以通过将其指定为 来阻止源文档的书签被导入 |
setPageLayout (布局) |
设置页面布局 | layout ( str ) – 要使用的页面布局 |
setPageMode (模式) |
设置页面模式。 | mode ( str ) – 要使用的页面模式。 |
write ( 文件对象) |
写入已合并到给定输出文件的所有数据。 | fileobj – 输出文件。可以是文件名或任何类型的类文件对象。 |
PageObject
()PageObject
(pdf=None,indirectRef=None )
含义:此类表示 PDF 文件中的单个页面。通常这个对象会通过访问类的getPage()
方法 来创建 PdfFileReader
,但也可以使用createBlankPage()
静态方法创建一个空页面 。
参数: |
|
---|
方法名 | 含义 | 参数 |
---|---|---|
|
将转换矩阵应用于页面。 | ctm ( tuple ) – 包含变换矩阵操作数的 6 元素元组。 |
|
通过加入所有内容流并应用 FlateDecode 过滤器来压缩此页面的大小。 但是,如果由于某种原因内容流压缩变为“自动”,则此功能可能不会执行任何操作。 |
|
|
按照内容流中提供的顺序定位所有文本绘制命令,然后提取文本。这对某些 PDF 文件效果很好,但对其他文件效果不佳,具体取决于所使用的生成器。这将在未来细化。不要依赖于这个函数的文本顺序,因为如果这个函数变得更复杂,它会改变。 | 一个 unicode 字符串对象。 |
|
访问页面内容。 | /Contents 对象,或者None 如果它不存在。 /Contents 是可选的 |
|
将两个页面的内容流合并为一个。资源引用(即字体)由两个页面维护。此页面的媒体框/裁剪框/等未更改。参数页面的内容流将被添加到此页面的内容流的末尾,这意味着它将在此页面之后或“顶部”绘制。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例PageObject 。 |
|
这类似于mergePage,但要合并的流是通过应用转换矩阵来旋转的 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 旋转(float)–旋转的角度,以度为单位 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流通过应用变换矩阵进行旋转和缩放。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 旋转(float)–旋转的角度,以度为单位 scale ( float ) – 缩放因子expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流通过应用转换矩阵进行平移、旋转和缩放。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 tx ( float ) – X 轴上的平移 ty ( float ) – Y 轴上的平移 旋转(float)–旋转的角度,以度为单位 scale ( float ) – 缩放因子 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流通过应用转换矩阵进行旋转和平移。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 tx ( float ) – X 轴上的平移 ty ( float ) – Y 轴上的平移 旋转(float)–旋转的角度,以度为单位 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流是通过应用转换矩阵来缩放的。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 scale ( float ) – 缩放因子 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流通过应用转换矩阵进行转换和缩放。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 scale ( float ) – 缩放因子 tx ( float ) – X 轴上的平移 ty ( float ) – Y 轴上的平移 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但转换矩阵应用于合并的流。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 ctm ( tuple ) – 包含变换矩阵操作数的 6 元素元组 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
这类似于mergePage,但要合并的流是通过应用转换矩阵来转换的。 | page2 ( PageObject ) – 要合并到这个页面的页面。应该是 的一个实例 tx ( float ) – X 轴上的平移 ty ( float ) – Y 轴上的平移 expand ( bool ) – 是否应扩展页面以适合要合并的页面的尺寸。 |
|
以 90 度为增量顺时针旋转页面。 | 角度( int ) – 旋转页面的角度。必须是 90 度的增量 |
|
以 90 度为增量逆时针旋转页面。 | 角度( int ) – 旋转页面的角度。必须是 90 度的增量 |
|
通过将转换矩阵应用于其内容并更新页面大小,按给定因子缩放页面。 | sx ( float ) – 水平轴上的缩放因子。 sy ( float ) – 垂直轴上的缩放因子。 |
|
通过将转换矩阵应用于其内容并更新页面大小,按给定因子缩放页面。 | factor ( float ) – 缩放因子(对于 X 和 Y 轴)。 |
|
通过将转换矩阵应用于其内容并更新页面大小,将页面缩放到指定的尺寸。 | width ( float ) – 新的宽度。 height ( float ) – 新的高度。 |
PdfFileWriter
含义:给定由另一个类(通常为PdfFileReader
)生成的页面,此类支持写出 PDF 文件。
方法名 | 含义 | 参数 | 返回 | 返回类型 |
---|---|---|---|---|
|
在 PDF 中嵌入文件。 | fname ( str ) – 要显示的文件名。 fdata ( str ) – 文件中的数据。 |
||
|
将空白页附加到此 PDF 文件并返回。如果未指定页面大小,则使用最后一页的大小。 | width ( float ) – 以默认用户空间单位表示的新页面的宽度。 height ( float ) – 以默认用户空间单位表示的新页面的高度。 |
||
, 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 ) – 目标页面的适合度。详情请参阅 |
||
|
添加将在打开此 PDF 时启动的 Javascript。 | javascript ( str ) – 你的 Javascript。 | ||
rect , border=None , fit='/Fit' , *args ) |
添加从矩形区域到指定页面的内部链接。 | pagenum ( int ) – 放置链接的页面的索引。 pagedest ( int ) – 链接应该转到的页面的索引。 rect – border - 如果提供,则是一个描述边框绘制属性的数组。有关详细信息,请参阅 PDF 规范。如果省略此参数,则不会绘制边框。 fit ( str ) – 页面适合或“缩放”选项(见下文)。可能需要提供其他参数。传递 |
||
|
将自定义元数据添加到输出。 | infos ( dict ) – 一个 Python 字典,其中每个键都是一个字段,每个值都是您的新元数据。 | ||
|
向此 PDF 文件添加页面。该页面通常是从PdfFileReader 实例中获取的 。 |
page ( PageObject ) – 要添加到文档的页面。应该是一个实例PageObject |
||
|
将页面从读者复制到作者。包括一个可选的回调参数,在将页面附加到编写器后调用该参数。 | reader – 一个 PdfFileReader 对象,从中复制页面注释到这个 writer 对象。 |
||
|
从 PDF 文件阅读器创建文档的副本(克隆) | 阅读器- 应从中创建克隆的 PDF 文件阅读器实例。 |
||
|
将读取器文档根目录复制到写入器。 | reader – 应复制文档根目录中的 PdfFileReader。 | ||
use_128bit=True ) |
使用 PDF 标准加密处理程序加密此 PDF 文件。 | user_pwd ( str ) – “用户密码”,允许在提供的限制下打开和阅读 PDF 文件。 owner_pwd ( str ) – “所有者密码”,允许在没有任何限制的情况下打开 PDF 文件。默认情况下,所有者密码与用户密码相同。 use_128bit ( bool ) – 是否使用 128 位加密的标志。当为 false 时,将使用 40 位加密。默认情况下,此标志处于打开状态。 |
||
|
页数。 | 整数 | ||
|
从此 PDF 文件中按编号检索页面。 | pageNumber ( int ) – 要检索的页码(页面从零开始) | pageNumber给出的索引处的页面 | PageObject |
|
获取页面布局。有关setPageLayout() 有效布局的说明,请参见。 |
当前使用的页面布局。 | str, None 如果未指定 | |
|
获取页面模式。有关setPageMode() 有效模式的说明,请参见。 |
当前使用的页面模式。 | str, None 如果未指定 | |
height=None , index=0 ) |
在此 PDF 文件中插入一个空白页并将其返回。如果未指定页面大小,则使用最后一页的大小。 | width ( float ) – 以默认用户空间单位表示的新页面的宽度。 height ( float ) – 以默认用户空间单位表示的新页面的高度。 index ( int ) – 添加页面的位置。 |
新添加的页面 | PageObject |
|
在此 PDF 文件中插入页面。该页面通常是从PdfFileReader 实例中获取的 。 |
page ( PageObject ) – 要添加到文档的页面。这个参数应该是 的一个实例 index ( int ) – 页面将被插入的位置。 |
||
|
从此输出中删除图像。 | ignoreByteStringObject ( bool ) – 忽略 ByteString 对象的可选参数。 | ||
|
从此输出中删除链接和注释。 | |||
|
从此输出中删除图像。 | ignoreByteStringObject ( bool ) – 忽略 ByteString 对象的可选参数。 | ||
|
设置页面布局 | layout ( str ) – 要使用的页面布局 | ||
|
设置页面模式。 | mode ( str ) – 要使用的页面模式。 | ||
|
从字段字典更新给定页面的表单字段值。将字段文本和值从字段复制到页面。 | page – PDF writer 的页面参考,其中注释和字段数据将被更新。 fields – 字段名称 (/T) 和文本值 (/V) 的 Python 字典 |
||
|
将添加到此对象的页面集合作为 PDF 文件写出。 | stream -- 要写入文件的对象。该对象必须支持 write 方法和 tell 方法,类似于文件对象。 |
以上介绍了PyPDF2的四个主要类以及其中的方法名和具体用法。
现在网上的学习资料非常多,pdf也是如此,很多pdf都是书籍,一份pdf可能有上百页甚至上千页,这使得我们查具体资料的时候非常困难。
例:你现在有一本关于爬虫的书,有430页,当然,你基础知识是有的,只是你在写爬虫时经常忘记html解析的具体写法,如正则表达式、xpath语法的使用,这时如果你翻pdf,会发现步骤非常繁琐,首先你要找目录,根据目录来找到html解析的具体页数,最终通过滑动找到相应内容。而且如果你接着阅读pdf,等到下次要用到正则表达式、xpath语法时,你又得重新以上步骤,导致过程十分繁琐。
这时,你就可以运用以上知识,写一个代码,将你所需要的pdf从原pdf中"抠"出来。
看到这记得查看一下上面标红(平时用到比较多)的方法哦!!
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开头或者结尾会有不是相关内容的出现,如下:
但是这还是可以接受的,毕竟下一次阅读相关文档方便多了。
使用该代码可以大幅度提高你查阅相关资料的速度,非常适用于对于我这样的懒人(记不住还不拿笔记在本子上)。
这篇万字文章就此完结,如果觉得写的不错的,希望点赞,这会是我接下来创作的动力!!