PyPDF2 库,顾名思义,就是用来操作PDF文件的,相信网上已经有太多相关的介绍文章了,我这里就不再赘述了。这里只重点一下制作书签的过程,网上好像还没有比较详细实用的文章!
合并 PDF 并添加书签
对于合并PDF,已经有很多成熟的代码了,我们拿来直接使用
from PyPDF2 import PdfFileReader, PdfFileWriter def merge_pdf(infnList, outfn): pdf_mark_list = [] pdf_output = PdfFileWriter() for infn in infnList: pdf_mark = [] pdf_input = PdfFileReader(open(infn, 'rb')) # 获取 pdf 共用多少页 page_count = pdf_input.getNumPages() for i in range(page_count): pdf_output.addPage(pdf_input.getPage(i)) pdf_output.write(open(outfn, 'wb')) if __name__ == '__main__': outfn = 'outfn.pdf' import os pdf_list = [] for i in os.listdir(): if os.path.splitext(i)[-1] == '.pdf': pdf_list.append(i) print(pdf_list) merge_pdf(pdf_list, outfn)
这样就可以方便的把当前目录下的所有PDF文件都合并到一个新的PDF当中,但是却有一个问题,就是没有书签,这对于一个教程类的文档来说,是及其不友好的,下面就来看看如何添加书签
根据 PyPDF2 的官方文档或网上的文章可以知道,添加书签可以使用下面的代码
# 添加书签 pdfWriter.addBookmark(title, pagenum, parent=parent)
但是也就这么一句话,完全没有真实的使用实例
根据我的尝试可以得出,对于 pagenum 参数,是用来指定书签页数的,要注意,PyPDF2 中PDF的页面是从0开始的,即在序列0添加书签时会跳到首页,在n处添加书签时会跳转至n+1页。
清楚上面的机制之后,就可以编码了,先编写一个添加书签的函数
def add_bookmark(pdfmark, outfile): print(pdfmark) pdf_output = PdfFileWriter() pdf_input = PdfFileReader(open(outfile, 'rb')) pdf_output.appendPagesFromReader(pdf_input) for i in pdfmark: pdf_output.addBookmark(i[0], i[1]) pdf_output.write(open('bookmark.pdf', 'wb'))
该函数接收两个参数,一个列表参数 pdfmark,是一个二维列表,存储着书签的名称和所在页数,另一个参数则是当前需要编辑的已经存在的PDF文件
下面开始改写 merge_pdf 函数,把 add_bookmark 函数所需的 pdfmark 列表组装起来
def merge_pdf(infnList, outfn): pdf_mark_list = [] pdf_output = PdfFileWriter() page_count = 1 page_total = 0 for infn in infnList: pdf_mark = [] pdf_input = PdfFileReader(open(infn, 'rb')) page_tmp = page_count page_total += page_tmp # 获取 pdf 共用多少页 page_count = pdf_input.getNumPages() print(page_count) print(page_total) pdf_mark.append(infn.split('.pdf')[0]) pdf_mark.append(page_total - 1) pdf_mark_list.append(pdf_mark) for i in range(page_count): pdf_output.addPage(pdf_input.getPage(i)) pdf_output.write(open(outfn, 'wb')) add_bookmark(pdf_mark_list, outfn) return pdf_mark_list, outfn
这样运行代码,就可以得到一个带有书签的PDF文档啦
电子书介绍
一直关注的朋友应该知道,在2020年我断断续续的更新了两个系列教程,分别是数据分析入门和Python Web 入门,Python Web 入门更新的慢一些,还在难产中。。。而数据分析入门已经完成,感兴趣的朋友可以翻看往期的推文查看
如果你觉得来来回回翻看推文太不方便了,没关系,在公众号后台回复“电子书”,就可以免费获取这本入门教程电子书了,满满的诚意哦!
看到这里,还不给个“在看”或点个“赞”嘛!