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

递归遍历PDF嵌套书签数组时如何获取对应父级书签对象

修复思路

你现有代码的问题是没有匹配PyPDF返回的书签结构规则:如果单个书签对象后面跟着一个嵌套列表,该列表就是这个书签的子书签集合。你之前的逻辑把列表和同级书签的父级都设为同一个上层parent,自然没办法绑定正确的父子关系。


完整实现代码

首先定义存储书签信息的类:

class Bookmark:
    def __init__(self, title, page_num, parent=None):
        self.title = title
        self.page_num = page_num
        self.parent = parent
    
    # 仅用于调试打印,可根据需求删除
    def __repr__(self):
        parent_title = self.parent.title if self.parent else "无父级"
        return f"Bookmark(标题={self.title}, 父级={parent_title}, 页码={self.page_num})"

调整后的递归遍历函数:

def iterate_through_bookmarks(outlines, bookmarks=None, parent=None):
    if bookmarks is None:
        bookmarks = []
    index = 0
    while index < len(outlines):
        item = outlines[index]
        # 跳过列表,列表的父级是前一个书签对象,上一轮已经处理过
        if isinstance(item, list):
            index += 1
            continue
        # 实例化当前书签,存入结果
        current_bm = Bookmark(
            title=item.title,
            page_num=item.page,
            parent=parent
        )
        bookmarks.append(current_bm)
        # 判断下一个元素是不是子书签列表,如果是就递归处理,父级设为当前书签
        if index + 1 < len(outlines) and isinstance(outlines[index+1], list):
            iterate_through_bookmarks(outlines[index+1], bookmarks, current_bm)
        index += 1
    return bookmarks

使用示例

from PyPDF4 import PdfFileReader

pdf_reader = PdfFileReader(open("你的PDF文件路径.pdf", "rb"))
raw_outlines = pdf_reader.getOutlines()
result_bookmarks = iterate_through_bookmarks(raw_outlines)

# 打印验证结果
for bm in result_bookmarks:
    print(bm)

如果需要适配你原本的类私有方法写法,把函数名改成__iterate_through_bookmarks,参数里保留你原本的bookmarks传入即可,核心逻辑不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:54:02