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

如何使用PyMuPDF获取PDF中指定字符范围的文本坐标?

使用PyMuPDF定位指定字符范围的坐标

要解决指定字符范围的坐标提取问题,不能直接用search_for(它会匹配所有相同文本),而是要基于字符级的细节数据来定位,具体步骤如下:

核心思路

通过PyMuPDF的page.get_text("chars")方法获取页面中每个字符的精确坐标和文本内容,这些字符的顺序与页面文本的字符顺序完全一致,直接通过索引范围即可定位目标字符组,再合并它们的坐标得到整体范围。

代码实现

以你的示例场景(目标字符范围对应文本Sprengstoffgesetz,索引21-38,假设索引从1开始)为例:

import fitz  # 导入PyMuPDF

# 打开PDF文档
doc = fitz.open("你的PDF文件路径.pdf")
page = doc[0]  # 假设目标内容在第一页

# 获取页面所有字符的详细数据:每个元素是包含text、bbox等的字典
all_chars = page.get_text("chars")

# 将用户的1-based索引转换为Python的0-based索引
start_idx = 20  # 21-1
end_idx = 37    # 38-1

# 提取目标范围内的字符数据
target_chars = all_chars[start_idx:end_idx+1]  # 闭区间需包含end_idx对应的字符

# 合并目标字符的bbox,得到整个范围的左上角和右下角坐标
min_x = min(char["bbox"][0] for char in target_chars)
min_y = min(char["bbox"][1] for char in target_chars)
max_x = max(char["bbox"][2] for char in target_chars)
max_y = max(char["bbox"][3] for char in target_chars)
target_bbox = (min_x, min_y, max_x, max_y)

print(f"目标字符范围的坐标:{target_bbox}")

# 若需单个字符的坐标,可遍历输出
for char in target_chars:
    print(f"字符'{char['text']}'的坐标:{char['bbox']}")

关键注意事项

  • 索引匹配:确认你的字符范围是基于单页文本还是整个文档文本。如果是整个文档,需要先遍历所有页面累加字符数,定位到目标所在页面后,再计算该页面内的相对索引。
  • 跨页面处理:如果目标字符范围跨多个页面,需拆分范围到对应页面分别处理。
  • PDF排版问题:极少数PDF存在字符顺序与显示顺序不一致的情况,此时需额外验证字符顺序是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:41:20