如何用PyPDF提取内部链接并获取dest对应的页码
解决PyPDF提取内部链接目标页码的问题
PDF的内部链接目标(/Dest)存在多种格式,直接打印dest无法直接获取到页码,需要针对不同格式解析,或者利用PyPDF内置方法处理。以下是修改后的可用代码:
import pypdf internal_links = [] with open("<pdf_path>", 'rb') as pdf_file: reader = pypdf.PdfReader(pdf_file) for page_num in range(len(reader.pages)): page = reader.pages[page_num] if "/Annots" in page: for annot in page["/Annots"]: annot_obj = annot.get_object() if annot_obj["/Subtype"] == "/Link": if "/Dest" in annot_obj: dest = annot_obj["/Dest"] # 解析目标获取页码 resolved_dest = reader.resolve_destination(dest) if resolved_dest: # resolved_dest[0]为从0开始计数的目标页码 target_page_num = resolved_dest[0] print(f"当前页码: {page_num} 目标页码: {target_page_num}") internal_links.append({ "from_page": page_num, "to_page": target_page_num })
关键说明:
reader.resolve_destination(dest)是PyPDF内置的解析方法,能自动处理两种常见目标格式:- 当
dest为数组时,直接提取页面对应的页码 - 当
dest为命名目标(NameObject)时,自动查找PDF的/Dests字典解析对应目标
- 当
- 返回的
resolved_dest是元组,第一个元素为从0开始计数的目标页码,后续元素包含缩放、位置等附加参数 - 若目标无效导致解析失败,
resolve_destination会返回None,需添加判断避免报错
如果需要兼容旧版本PyPDF(如PyPDF2),可以手动解析dest结构:
# 手动解析dest示例 if isinstance(dest, list): # 数组格式:[页面对象, /XYZ, left, top, zoom] page_ref = dest[0] target_page_num = reader.get_page_number(page_ref.get_object()) elif isinstance(dest, pypdf.generic.NameObject): # 命名目标,从Dests字典查找 dest_dict = reader.trailer["/Root"].get("/Dests", {}) if dest in dest_dict: named_dest = dest_dict[dest].get_object() target_page_num = reader.get_page_number(named_dest[0].get_object())
内容的提问来源于stack exchange,提问作者sw101
相关产品推荐
相关产品推荐

