如何用pypdf给PDF添加子书签并保留原有书签
解决pypdf添加子书签与保留原有书签的问题
一、保留原有书签
你的代码每次运行会覆盖原有书签,是因为PdfWriter默认不会自动复制原PDF的大纲(书签),需要手动将原PDF的outline复制到writer中。可以通过遍历PdfReader的outlines属性,逐个将原有书签添加到writer里。
二、添加子书签
add_outline_item方法支持parent参数,只需先创建一级书签并保存其返回的对象,再添加子书签时指定该对象为parent即可实现层级嵌套。
完整示例代码
from pypdf import PdfReader, PdfWriter # 读取原PDF reader = PdfReader("updated_examplefile.pdf") writer = PdfWriter() # 复制所有页面到writer for page in reader.pages: writer.add_page(page) # 递归复制原有书签(包含嵌套子书签) def copy_outline(item, parent=None): new_item = writer.add_outline_item( title=item.title, page_number=reader.get_page_number(item.page), parent=parent ) # 处理当前书签的子节点 for child in item.children: copy_outline(child, new_item) for outline_item in reader.outlines: copy_outline(outline_item) # 添加新的一级书签并保存书签对象 chapter1 = writer.add_outline_item(title="新章节1", page_number=2) chapter2 = writer.add_outline_item(title="新章节2", page_number=60) # 为一级书签添加子书签 writer.add_outline_item(title="新章节1-小节1", page_number=3, parent=chapter1) writer.add_outline_item(title="新章节1-小节2", page_number=10, parent=chapter1) writer.add_outline_item(title="新章节2-小节1", page_number=65, parent=chapter2) # 写入更新后的PDF with open("updated_examplefile.pdf", "wb") as f: writer.write(f)
关键说明
- 保留原有书签:通过递归函数
copy_outline遍历原PDF的所有书签层级,将包括嵌套子书签在内的所有原有大纲完整复制到writer中,避免覆盖问题。 - 添加子书签:创建一级书签时,将
add_outline_item返回的书签对象存入变量,后续添加子书签时传入该变量作为parent参数,即可实现书签的层级关联。
内容的提问来源于stack exchange,提问作者Spring Harbor
相关产品推荐
相关产品推荐

