![8b6de9d97b4fc4231f026cb581b4c16f.png](https://i-blog.csdnimg.cn/blog_migrate/5ac9979d90b83edd1596fa51f3231720.jpeg)
本期导读 | python处理文本 | Oct.24 2019 |
01 | PyPDF2介绍 | |
02 | 安装PyPDF2 | |
03 | 拆分PDF | |
04 | 程序运行 | |
05 | 合并文档 |
![e48979793d3c898b18e41f517586af5d.gif](https://i-blog.csdnimg.cn/blog_migrate/e6db7d90b9ef0cac253007b0a197d20a.gif)
在我们的日常生活中经常会和PDF文件打交道,包括但不限于读取、合并、拆分、加密。而平时最令我们头疼的一种操作就是拆分PDF了,毕竟小则十几页、大则上千页,太累了!但我最近发现了一个神器——PyPDF2包,用它就可以在Python中处理已先存在的PDF哦。真是“人生苦短,我用python!”。
一、PyPDF2介绍
最初的pyPdf软件包于2005年发布。pyPdf的最后一个正式版本是在2010年。大约一年后,一家名为Phasit的公司赞助了一个名为PyPDF2的pyPdf分支。该代码编写为向后与原始代码兼容,并且用了好多年,效果一直很好,其最后一个版本是在2016年。
虽然PyPDF2已经很久没有维护了,但是它的功能可一点都不落后,它可以支持提取PDF中的文档信息、旋转页面、合并PDF、拆分PDF、添加水印、加密PDF等功能哦。
二、安装PyPDF2
由于我是使用的Pycharm进行的Python编译,所以自带PyPDF2包,只需要在使用的时候导入就ok,不过如果你是用的其他编译器,那么你也可以通过pip进行安装(直接命令运行pip install PyPDF2)。下面我将演示如何用Pycharm导入PyPDF2包。
1 打开Pycharm
![75fe1bbe69e982f84b872baa5960e3c3.png](https://i-blog.csdnimg.cn/blog_migrate/84d797b322e0af4ff068079c36df6f24.jpeg)
2 点击菜单上的File,选择Other Settings里的Preferences for New Pro...
![0fa86422ca787954d510820488307474.png](https://i-blog.csdnimg.cn/blog_migrate/dcea7183cc126eddece80e53d422338d.jpeg)
3 选择对应的python程序
![ffb88edb4f76a424e820fb2db468977c.png](https://i-blog.csdnimg.cn/blog_migrate/ff632240b759e42416b599820b067e7f.jpeg)
4 点击左下角的➕,输入你想要的包,就可以导入啦!
![f711169bb2eb00e50904120e61bd3712.png](https://i-blog.csdnimg.cn/blog_migrate/6618d0d46e979e65eee068551501c70d.jpeg)
三、拆分PDF
那我们现在来思考一下拆分PDF需要哪些步骤?读取PDF,确定有多少页;明确自己的需求,需要拆分成多少页;创建新的空白PDF;提取指定页数的PDF内容写入新建的中PDF文件中;保存并重新命名。
不过以上步骤看起来很简单,但是还是有些地方值得商榷的,比如如果拆分的页码范围(如果不是整倍数怎么办)该如何计数呢?
在这里我选择使用拆分列表的方法来进行计数:将总页码生成一个大列表,再利用切片的方法将这个列表拆分成多个小列表,之后每个拆分的pdf页码范围就是每个小列表第一个数--最后一个数+1。
代码:
#! python# PDFCF.py - pdf文件拆分程序import PyPDF2 # import PyPDF2模块pdfReader = PyPDF2.PdfFileReader('Math.pdf') # 打开一个可读的pdf对象pdfnums = pdfReader.numPages # 获取pdf总页数pagenum_list = list(range(pdfnums)) # 将总页码循环到一个列表中n = 20 # 将总页码按照指定的个数分为多个小列表page_list = [pagenum_list[i:i + n] for i in range(0, len(pagenum_list), n)]for i in range(len(page_list)): pdfWriter = PyPDF2.PdfFileWriter() # 创建一个空白的pdf for pageNum in range(page_list[i][1], page_list[i][-1] + 1): # 提取指定页面 pageObj = pdfReader.getPage(pageNum) pdfWriter.addPage(pageObj) with open('PDFREAD %s' % i + '.pdf', 'wb') as pdfOutputFile: pdfWriter.write(pdfOutputFile)
四、程序运行
将程序和PDF文件放在同一个文件夹内,运行程序,就可以得到你想要的结果啦!下图是动图演示过程:
![de985edad223bfbf77aef70c4b804dda.gif](https://i-blog.csdnimg.cn/blog_migrate/4868d17b60f45c580686b91850a8961e.gif)
五、合并文档
那如果我们想要合并PDF文档,又该怎么办呢?
代码:
#! python# PDFCF.py - pdf文件合并程序from PyPDF2 import PdfFileReader, PdfFileWriterreadFile = 'read.pdf'writeFile = 'write.pdf'# 获取一个 PdfFileReader 工具pdfReader = PdfFileReader(open(readFile, 'rb'))# 获取 PDF 的页数pageCount = pdfReader.getNumPages()print(pageCount)# 返回一个 PageObjectpage = pdfReader.getPage(i)# 获取一个 PdfFileWriter 工具pdfWriter = PdfFileWriter()# 将一个 PageObject 插手到 PdfFileWriter 中pdfWriter.addPage(page)# 输出到文件中pdfWriter.write(open(writeFile, 'wb'))
这是一段合并两个PDF文档的代码,通过和上段代码进行对比,我们可以发现其大体思路是相反的,但也较为简单。
![e48979793d3c898b18e41f517586af5d.gif](https://i-blog.csdnimg.cn/blog_migrate/e6db7d90b9ef0cac253007b0a197d20a.gif)
不过我们该如何合并多个文件呢?难道要一个一个输入文件名吗?希望大家可以思考这个问题(提示:可以考虑列表)。最后温馨提示:大家在写程序的时候应该尽量先想思路、理清思路,磨刀不误砍柴工嘛。
作者有话说:
![3b6abdaeb8c36a88a051b6d4f7fca3f8.png](https://i-blog.csdnimg.cn/blog_migrate/0b187decfdb621e6b420b29099a85a10.jpeg)
![e48979793d3c898b18e41f517586af5d.gif](https://i-blog.csdnimg.cn/blog_migrate/e6db7d90b9ef0cac253007b0a197d20a.gif)
本期作者:王宇茜
本期编辑校对:李嘉楠
关注“ 数据皮皮侠 ”
更多知识等你发现