给PDF生成导航书签(附代码与所使用工具下载链接)


前言

由于要看的PDF页数很多,它刚好又没有导航书签,这给我的阅读造成了很大的麻烦,因此决定自己给它做一个书签

大致步骤是先从PDF本身获取目录信息,再通过与PDF内容比对,将目录与页码对应起来,最后通过下载的工具生成导航书签

一、复制PDF的目录

我这里是把PDF的目录复制出来保存成txt文件,保存在找得到的路径下
左图pdf右图txt

二、使用代码比对目录中的项目与页码的对应关系

代码如下(示例):

from PyPDF2 import PdfReader
import pdb
import numpy as np


reader = PdfReader("example.pdf")#替换成你的PDF
number_of_pages = len(reader.pages)
print(f'there are >{number_of_pages}< pages')
multi_match = []
line_count = 0

# 打开文本文件
with open('example.txt', 'r', encoding='utf-8', errors='ignore') as file:#替换成第一步保存的txt
    line_count = sum(1 for line in file)
    print(f'there are >{line_count}< content')
with open('example.txt', 'r', encoding='utf-8', errors='ignore') as file:#替换成第一步保存的txt
    with open('example_output.txt', 'a', encoding='utf-8') as out_file:#输出内容,后续会用
        # 逐行读取文件内容
        start_page, last_page= 20,20
        for x, line in enumerate(file):
            line_content = line.split('.')[0].replace('\n','')
            # 处理每一行的内容,例如打印或其他操作
            # print(f'cotent "{line_content}"')  # 使用end=''以避免在每行之间添加额外的换行符
            match_flag = 0
            for y in range(start_page, number_of_pages):
                page = reader.pages[y]
                text = page.extract_text()
                # print(f'Page {y}\n {text}')
                # pdb.set_trace()
                if line_content in text and match_flag == 0:#目录内容与当前页码内容匹配
                    print(f'>{x}/{line_count}<  content "{line_content}" match Page {y+1}')
                    last_page = start_page#记录上一次匹配的页码,以防止当前目录未匹配而影响下一个目录的搜寻范围
                    start_page = y#更新下一个搜寻范围
                    print(f'start page changed to {y+1}')
                    match_flag += 1
            if match_flag == 0:
                start_page = last_page
                print(f'>{x}/{line_count}< "{line_content}" no matching! start page return to {start_page+1}')
            if match_flag > 1:
                multi_match.append(line_content+'\n')
            out_file.write(line_content + ' ' + str(last_page+1) + '\n')
    
with open('multi_match_error.txt', 'a', encoding='utf-8') as error_file:
    error_file.write(str(multi_match))

这一步之后,你会得到一个包含有目录与页码对应关系的txt文件,下一步会用到

三、使用工具生成导航书签

工具名称为“PdgCntEditor”,开发者为“老马的原创空间”,作者的博客地址是https://www.cnblogs.com/stronghorse/p/14594337.html
工具的下载地址是:https://pan.baidu.com/s/1PnpZ3Bk-lTArrajva7EVzQ
提取码:4hie
在这里插入图片描述
1使用该工具打开PDF
在这里插入图片描述
2复制第二步生成的txt中的内容粘贴在工具的编辑框内
在这里插入图片描述
3点击自动切分页码。这一步是将每一个内容背后的数字与PDF的实际页码形成映射。先点击全选,再点击自动切分页码
在这里插入图片描述

4手动选择次级目录缩进(选中需要缩进的行,按TAB键)
在这里插入图片描述
5保存
在这里插入图片描述
保存好后重新用PDF阅读器打开该PDF,可以在左侧导航栏看到导航书签了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值