使用PyPDF合并PDF时,修改书签页码后添加大纲报错的解决方法
解决PyPDF修改书签页码后添加大纲报错的问题
错误原因
你触发的TypeError是因为PdfWriter.add_outline()方法仅需接收一个参数(修改后的outline对象),但你额外传入了页码参数,导致参数数量不匹配。
修正后的完整代码
from pypdf import PdfReader, PdfWriter from pypdf.generic import NameObject, NumberObject def update_outline_page_numbers(outline, increment_value): # 递归处理所有层级的书签 for item in outline: if isinstance(item, list): # 处理嵌套子书签 update_outline_page_numbers(item, increment_value) else: page_key = NameObject("/Page") if page_key in item: current_page = item[page_key] item[page_key] = NumberObject(current_page + increment_value) # 初始化阅读器与写入器 pdf_reader = PdfReader("example.pdf") pdf_writer = PdfWriter() # 获取原大纲并更新页码 outlines = pdf_reader.outline increment_value = int(total_pages) # total_pages为你实际需要递增的页码数 update_outline_page_numbers(outlines, increment_value) # 追加PDF内容(不导入原大纲) pdf_writer.append("input_file.pdf", import_outline=False) # 添加修改后的大纲 for outline_item in outlines: pdf_writer.add_outline(outline_item) # 保存最终PDF with open("merged_output.pdf", "wb") as output_file: pdf_writer.write(output_file)
关键修改说明
- 补充缺失导入:新增
PdfWriter、NameObject和NumberObject的导入,避免因未导入类导致的运行错误。 - 递归处理嵌套书签:新增递归函数
update_outline_page_numbers,处理PDF中可能存在的多层级嵌套书签,原代码仅能处理一级书签。 - 修正add_outline调用:调用
pdf_writer.add_outline()时仅传入修改后的outline对象即可,无需额外传递页码——outline内部已包含更新后的页码信息。 - 完善全流程:补充
PdfWriter初始化与最终PDF保存代码,确保合并流程完整闭环。
内容的提问来源于stack exchange,提问作者vampirekabir
相关产品推荐
相关产品推荐

