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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:33:19