我在Zlibrary下载了《神经科学:探索脑》第四版的中文电子版。
本来这个版本是有书签的,但是我想用ABBYY进行OCR识别,由于书有986页,全部一起OCR到中途会提示内存不足,我拆分为两份,分别进行OCR,然后再进行合并,但是后面就发现一个问题——原来的书签不见了!
那当然不可能再一个个敲!那怎么办?
于是在GPT的帮助下,用python写了一个代码,可以批量把原先pdf的书签导出到另一个pdf去
提问过程:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import fitz
def copy_bookmarks(source_pdf_path, target_pdf_path, output_pdf_path): source_pdf = fitz.open(source_pdf_path) target_pdf = fitz.open(target_pdf_path) bookmarks = source_pdf.get_toc(simple=False) target_pdf.set_toc(bookmarks) target_pdf.save(output_pdf_path) source_pdf.close() target_pdf.close()
source_pdf_path = 'source.pdf'
target_pdf_path = 'target.pdf'
output_pdf_path = 'output_with_bookmarks.pdf'
copy_bookmarks(source_pdf_path, target_pdf_path, output_pdf_path)
print("书签导入完成。")
|
成果展示
事情到这里本来就结束了,但是我又突然有一个idea,如果一个本来没有书签的pdf,我该如何快速的添加书签呢。
我的想法是,大多数书籍都会提供目录,我可以根据书上的目录快速整理出一个目录列表,然后再用程序把这个列表变为书签,导入的pdf里去
比如基于《探索脑》这本书的目录
我整理得到了这样一个列表
-
第 I 篇 基础@3
- 第 1 章 神经科学:过去、现在和未来@3
- 第 2 章 神经元和神经胶质细胞@23
- 第 3 章 静息状态下的神经元膜@57
- 第 4 章 动作电位@83
- 第 5 章 突触传递@111
- 第 6 章 神经递质系统@145
- 第 7 章 神经系统的结构@181
- 第 7 章附录 人体神经解剖学图解指南@221
-
第 II 篇 感觉和运动系统@267
- 第 8 章 化学感觉@267
- 第 9 章 眼睛@295
- 第 10 章 中枢视觉系统@333
- 第 11 章 听觉和前庭系统@371
- 第 12 章 躯体感觉系统@417
- 第 13 章 运动的脊髓控制@455
- 第 14 章 运动的脑控制@487
-
第 III 篇 脑和行为@525
- 第 15 章 脑和行为的化学调控@525
- 第 16 章 动机@555
- 第 17 章 性与脑@585
- 第 18 章 情绪的脑机制@621
- 第 19 章 脑的节律和睡眠@651
- 第 20 章 语言@691
- 第 21 章 静息态的脑、注意及意识@725
- 第 22 章 精神疾病@757
-
第 IV 篇 变化的脑@789
- 第 23 章 脑连接的形成@789
- 第 24 章 记忆系统@827
- 第 25 章 学习和记忆的分子机制@869
-
术语表@905
-
参考文献@927
然后将这个列表放进一个txt文件,运行代码,即可将书签导入到pdf!
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import fitz def parse_bookmarks_from_txt(txt_path,offset): """ 解析txt文件中的书签信息。 txt文件的书签信息格式为markdown多级列表,根据缩进来确定层级。 """ bookmarks = [] with open(txt_path, 'r', encoding='utf-8') as file: for line in file: if line.strip(): indent = len(line) - len(line.lstrip()) level = indent // 2 + 1 title, page = line.strip().removeprefix('*').strip().split('@') bookmarks.append([level, title.strip(), int(page)+offset]) return bookmarks
def add_bookmarks_to_pdf(pdf_path, output_pdf_path,bookmarks): """ 将格式化后的书签信息添加到指定的PDF文件中。 :param pdf_path: PDF文件的路径 :param bookmarks: 要添加的书签列表,格式为[[level, title, page], ...] """ doc = fitz.open(pdf_path) doc.set_toc(bookmarks) doc.save(output_pdf_path) doc.close() print(f"书签已添加到新的PDF文件中:{output_pdf_path}")
txt_path = 'bookmarks.txt' bookmarks = parse_bookmarks_from_txt(txt_path,offset=32)
pdf_path = r"C:\Users\Achuan-2\Downloads\神经科学:探索脑(第四版)OCR.pdf" output_pdf_path = r"C:\Users\Achuan-2\Downloads\神经科学:探索脑(第四版)test.pdf" add_bookmarks_to_pdf(pdf_path, output_pdf_path,bookmarks)
|
注意:因为目录和实际的pdf页码有差别,需要考虑offset,比如这本书目录和实际pdf页码差距为32,需要给目录的页码都加上32.
感慨:编程真的能提高效率!有了GPT之后,真的是无脑编程,只要有想法,敢去做!