|
本期导读 |
python处理文本 |
Oct.24 2019 |
|
01 |
PyPDF2介绍 |
|
|
02 |
安装PyPDF2 |
|
|
03 |
拆分PDF |
|
|
04 |
程序运行 |
|
|
05 |
合并文档 |
在我们的日常生活中经常会和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
2 点击菜单上的File,选择Other Settings里的Preferences for New Pro...
3 选择对应的python程序
4 点击左下角的➕,输入你想要的包,就可以导入啦!
三、拆分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() # 创建一个空白的pdffor 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文件放在同一个文件夹内,运行程序,就可以得到你想要的结果啦!下图是动图演示过程:
五、合并文档
那如果我们想要合并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文档的代码,通过和上段代码进行对比,我们可以发现其大体思路是相反的,但也较为简单。
不过我们该如何合并多个文件呢?难道要一个一个输入文件名吗?希望大家可以思考这个问题(提示:可以考虑列表)。最后温馨提示:大家在写程序的时候应该尽量先想思路、理清思路,磨刀不误砍柴工嘛。
作者有话说:
本期作者:王宇茜
本期编辑校对:李嘉楠
关注“ 数据皮皮侠 ”
更多知识等你发现

