使用PyPDF2库给PDF加多级书签

因为PDF是扫描的图片格式,所以加书签会很麻烦

可以先使用OCR软件将目录中的文字识别

这里我将目录处理成两个文件

bookmark.txt存放分级书签信息

page.txt存放对应的页数

注意:页数和实际书籍页数可能会不一致(例如pdf页码是从封面开始算的,而书籍的第一页并不算封面和内容)

我们可以编写如下代码:

# 按行读取两个文件
fbookmark = open('bookmark',encoding='utf8').readlines()
page = open('page').readlines()
# 创建(几级书签,标题,页码)元组
bookmark = [(content.rfind('|') + 1,
             content.strip()[content.rfind('|') + 1:],
             int(p.strip())
             ) for content,p in zip(fbookmark,page)]


from PyPDF2 import PdfFileReader, PdfFileWriter
# 打开文件
input = PdfFileReader(open('input.pdf', 'rb'))
# 复制文件
output = PdfFileWriter()
pages = [input.getPage(i) for i in range(input.getNumPages())]
for page in pages:
    output.addPage(page)
     
parent_set = {}
DELTA = 12 # 偏移量
# 创建分级书签(注1)
for bm in bookmark:
    # 将字典中小一个等级的书签当做父节点
    parent = output.addBookmark(bm[1],
                                bm[2] + DELTA,
        						parent=parent_set.get(bm[0]-1))
    # 向自己作为字典中该等级的节点
    parent_set[bm[0]] = parent

with open('result.pdf','wb+') as f:
    output.write(f)

注1:这里创建分级书签的方式尝试了有一会儿,尝试了栈结构,后来发现字典结构合适、方便。

效果如下:

(用于解析目录,自动添加|分隔符)


with open('bookmark','r',encoding='utf8') as f:
    c = f.readlines()
    with open('bookmark2','w+',encoding='utf8') as output:
         for line in c:
            if line[0].isnumeric():
                if line[1] == '.' and line[2].isnumeric():
                    output.write('|')
                    if line[3] == '.' and line[4].isnumeric():
                        output.write('|')
            output.write(line)
posted @ 2021-03-28 21:52  aminor  阅读(1174)  评论(0)    收藏  举报
/**/ /**/