合并多PDF并保留嵌套书签:仅最后一个PDF书签保留的问题求助
问题分析与解决方案
你的代码存在几个关键问题,导致合并后仅保留最后一个PDF的书签:
- 第一个循环错误遍历了
source_dir字符串(而非文件列表),根本没正确获取每个PDF的书签 - 每次追加PDF时直接覆盖
merger.bookmarks,导致之前的书签被清空 - 没有统一处理所有PDF的子书签到同一个"content"父节点下
以下是修正后的代码,实现保留所有子书签并共用一个"content"父书签:
from PyPDF2 import PdfFileMerger, PdfFileReader import os # 设置你的PDF文件夹路径 source_dir = 'filepath' os.chdir(source_dir) # 初始化合并器 merger = PdfFileMerger(strict=False) # 创建唯一的"content"父书签 root_content = merger.addBookmark("content", 0) # 初始页码设为0,后续会自动适配实际位置 # 遍历文件夹中的所有PDF文件 for filename in os.listdir(source_dir): if filename.endswith('.pdf'): # 读取当前PDF文件 with open(filename, 'rb') as f: pdf_reader = PdfFileReader(f) outlines = pdf_reader.getOutlines() # 定位当前PDF中的"content"父书签,提取其子书签 for outline in outlines: if isinstance(outline, dict) and outline.get('/Title') == 'content': # 获取当前PDF在合并文档中的起始页码(用于偏移计算) start_page = merger.getNumPages() # 将子书签添加到统一的"content"父节点下 for child in outline.get('/Kids', []): target_page = start_page + child.get('/Page') merger.addBookmark(child.get('/Title'), target_page, parent=root_content) # 将当前PDF追加到合并文档 merger.append(filename) # 保存并关闭合并器 merger.write('merged.pdf') merger.close()
关键修改说明:
- 统一父书签:通过
merger.addBookmark创建唯一的"content"根节点,所有子书签都挂载到这个节点下 - 正确遍历文件:循环遍历文件夹内的PDF文件,替代原代码中错误的路径字符串遍历
- 页码偏移处理:每个PDF追加前获取合并文档的当前总页数,作为子书签页码的偏移量,确保跳转位置正确
- 提取子书签:从每个PDF的"content"节点下提取子书签,避免重复创建父节点
- 避免书签覆盖:不再直接赋值
merger.bookmarks,而是逐个添加子书签到统一父节点
内容的提问来源于stack exchange,提问作者user20242302
相关产品推荐
相关产品推荐

