递归遍历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
相关产品推荐
相关产品推荐

