前言
由于要看的PDF页数很多,它刚好又没有导航书签,这给我的阅读造成了很大的麻烦,因此决定自己给它做一个书签
大致步骤是先从PDF本身获取目录信息,再通过与PDF内容比对,将目录与页码对应起来,最后通过下载的工具生成导航书签
一、复制PDF的目录
我这里是把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,可以在左侧导航栏看到导航书签了