如何用Python获取PDF大纲指向页面对象的位置?
获取PDF大纲跳转位置并裁剪页面
你已经通过PyMuPDF拿到了大纲对应的/FitH动作参数,下面直接说明如何将其转换为可用坐标并实现裁剪:
核心概念
/FitH <y>是PDF的视图指令,含义是让页面垂直滚动到y坐标位置,使该位置对齐窗口顶部。这里的y值遵循PDF原生坐标系规则:原点在页面左下角,y轴向上递增。
改进后的代码
import fitz file = 'assets/xxx.pdf' pdf = fitz.open(file) outlines = pdf.get_toc(simple=False) # 选中目标大纲条目 target_outline = outlines[13] xref = target_outline[3]['xref'] # 获取动作对象的xref action_xref = int(pdf.xref_get_key(xref, 'A')[1].split()[0]) # 用内置工具解析动作字典(比手动拆分更可靠) action = fitz.utils.extract_named_action(pdf.xref_object(action_xref)) # 提取目标页面和y坐标 page_xref = action['D'][0] target_y = action['D'][2] page_num = pdf.xref_get_page_number(page_xref) page = pdf[page_num] # 输出关键信息 print(f"跳转目标页面:{page_num + 1}") print(f"目标位置y坐标(PDF坐标系):{target_y}") print(f"页面总高度:{page.rect.height}") # 执行裁剪:保留目标位置到页面底部的内容 crop_rect = fitz.Rect(0, target_y, page.rect.width, page.rect.height) page.set_cropbox(crop_rect) # 保存裁剪后的PDF pdf.save('assets/cropped_xxx.pdf') pdf.close()
关键说明
- 坐标直接复用:
/FitH后面的数值就是跳转位置的顶部y坐标,可直接用于定位。 - 裁剪逻辑:
fitz.Rect参数为(x0, y0, x1, y1),对应页面左下角到右上角的坐标。若要裁剪目标位置以上的内容,将y0设为target_y,y1使用页面最大高度即可。 - 可靠解析:
fitz.utils.extract_named_action能适配不同格式的PDF动作指令,比手动拆分字符串更稳定。
内容的提问来源于stack exchange,提问作者wangtao
相关产品推荐
相关产品推荐

