大学生无纸化电子书PDF书签添加器
苦于无纸化学习时的扫描版PDF电子书缺少书签目录而做。
来自我的GitHub:
PDF-Bookmark-Adder
在GitHub中可以直接下载可运行的文件。
一个简单的Python小脚本,可以为PDF快速添加书签作为目录,将生成一个已添加目录的新PDF,用于Goodnotes看书等场景。
快速使用
1.确保已安装Python 3,安装依赖
pip install PyPDF2
2.运行
import osimport refrom PyPDF2 import PdfReader, PdfWriterdef get_valid_pdf_path():"""获取并验证用户输入的PDF路径(自动过滤拖拽产生的引号)"""while True:path = input("请输入PDF文件路径: ").strip()# 自动去除路径首尾的双引号、单引号path = path.strip('"\'')if os.path.isfile(path) and path.lower().endswith('.pdf'):return pathprint("❌ 文件不存在或不是PDF格式,请重新输入。")def parse_bookmarks():"""解析用户输入的书签内容,兼容全格式、多行粘贴"""print("\n请输入书签内容(格式:页码-标题,每行一个,输入空行结束):")bookmarks = []while True:line = input().strip()# 跳过纯空行if not line:break# 兼容-前后任意空格、前导多余符号/空格,精准匹配「数字-标题」格式match = re.match(r'^\D*(\d+)\s*-\s*(.+)$', line)if not match:print(f"⚠️ 跳过格式错误行: {line}")continuepage_part, title = match.groups()try:# 自动处理前导零的页码,比如011→11page_num = int(page_part) - 1 # PyPDF2页码从0开始if page_num < 0:raise ValueErrorbookmarks.append((title.strip(), page_num))except ValueError:print(f"⚠️ 跳过页码错误行: {line}")return bookmarksdef add_bookmarks(pdf_path, bookmarks):"""添加书签并保存新PDF"""# 生成新文件名directory, filename = os.path.split(pdf_path)name, ext = os.path.splitext(filename)new_path = os.path.join(directory, f"{name}-带书签{ext}")reader = PdfReader(pdf_path)writer = PdfWriter()# 复制所有页面到writerfor page in reader.pages:writer.add_page(page)# 添加书签:适配新版APIfor title, page_num in bookmarks:if page_num < len(reader.pages):writer.add_outline_item(title, page_num)else:print(f"⚠️ 跳过超出范围的书签: {title} (页码:{page_num+1})")# 保存文件with open(new_path, 'wb') as f:writer.write(f)print(f"\n✅ 成功!新文件已保存至:\n{new_path}")if __name__ == "__main__":print("=== PDF 书签添加器 ===")print("回车两次结束")pdf_path = get_valid_pdf_path()bookmarks = parse_bookmarks()if bookmarks:add_bookmarks(pdf_path, bookmarks)else:print("❌ 未输入有效书签,程序结束。")
-
拖入PDF或输入PDF路径(路径中的双引号会被过滤) -
粘贴书签内容,格式:页码-标题,每行一个(“-”两侧若有空格将被自动过滤) -
连续输入两个回车结束输入
书签格式要求
“页码-标题” 或 “页码 – 标题” 示例:
001-第一章 概述015-第二章 实践030-附录
此处页码指PDF实际页码,而非PDF内标注的页码。
让AI帮我提取目录
可以将目标书籍目录页截图给AI,使用这样的提示词让AI生成符合要求的书签:
将目录整理为页码-标题(如001-第一节 示例标题,每行换行)的格式。板块、部分、章节、篇章等分节(如有)必须写入目录格式中。尽量压缩目录名,不要太长。示例:001-第一板块001-第一部分001-第一章 第一节 示例1007-第二章 第二节 示例2008-第二部分......严禁出现:“第一板块...”而非“001-第一板块”等不遵守目录格式的行所有页码均+N
自行换算PDF内页码与实际页码之间的页数差距,写入N
效果示例

夜雨聆风