You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键说明

  1. 保留原有书签:通过递归函数copy_outline遍历原PDF的所有书签层级,将包括嵌套子书签在内的所有原有大纲完整复制到writer中,避免覆盖问题。
  2. 添加子书签:创建一级书签时,将add_outline_item返回的书签对象存入变量,后续添加子书签时传入该变量作为parent参数,即可实现书签的层级关联。

内容的提问来源于stack exchange,提问作者Spring Harbor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:51:01