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

合并多PDF并保留嵌套书签:仅最后一个PDF书签保留的问题求助

问题分析与解决方案

你的代码存在几个关键问题,导致合并后仅保留最后一个PDF的书签:

  1. 第一个循环错误遍历了source_dir字符串(而非文件列表),根本没正确获取每个PDF的书签
  2. 每次追加PDF时直接覆盖merger.bookmarks,导致之前的书签被清空
  3. 没有统一处理所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:51:02