我在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  # PyMuPDF:pip install pymupdf

def copy_bookmarks(source_pdf_path, target_pdf_path, output_pdf_path):
# 打开源PDF和目标PDF文件
source_pdf = fitz.open(source_pdf_path)
target_pdf = fitz.open(target_pdf_path)

# 从源PDF读取书签(大纲)
bookmarks = source_pdf.get_toc(simple=False)

# 将书签(大纲)添加到目标PDF
target_pdf.set_toc(bookmarks)

# 保存更改到新的PDF文件
target_pdf.save(output_pdf_path)

# 关闭PDF文件
source_pdf.close()
target_pdf.close()

# 源PDF路径(书签来源)
source_pdf_path = 'source.pdf'
# 目标PDF路径(需要添加书签的PDF)
target_pdf_path = 'target.pdf'
# 输出的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  # PyMuPDF:pip install pymupdf
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(): # 跳过空行
# 计算行前的空格数来确定层级
# 假设每个层级的缩进是2个空格,可以根据实际情况调整
indent = len(line) - len(line.lstrip())
level = indent // 2 + 1 # 计算层级,假定每2个空格代表一级缩进
# 移除星号和空格,然后分割标题和页码
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], ...]
"""
# 打开PDF文件
doc = fitz.open(pdf_path)

doc.set_toc(bookmarks)
# 保存更改到新的PDF文件中,以防覆盖原文件
doc.save(output_pdf_path)
doc.close()
print(f"书签已添加到新的PDF文件中:{output_pdf_path}")


# 1.将书签从txt文件解析并转换为pymupdf格式
txt_path = 'bookmarks.txt' # 假设书签信息存储在bookmarks.txt文件中
bookmarks = parse_bookmarks_from_txt(txt_path,offset=32)

# 2.添加书签到PDF
pdf_path = r"C:\Users\Achuan-2\Downloads\神经科学:探索脑(第四版)OCR.pdf" # 替换为目标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之后,真的是无脑编程,只要有想法,敢去做!