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

如何使用PyMuPDF通过尺寸定位文本?

用PyMuPDF根据指定区域尺寸查找对应文本

完全可以实现这个需求,核心思路是先提取页面上所有文本的位置信息,再筛选出落在目标区域内的内容。

实现步骤

  1. 使用PyMuPDF的Page.get_text("words")方法,获取页面上所有文本片段的详细信息,每个返回的元组包含文本的坐标范围(x0, y0, x1, y1,对应文本矩形的左下角和右上角坐标)、文本内容等。
  2. 定义目标区域的矩形尺寸,将每个文本片段的坐标范围与目标区域对比,筛选出符合条件的文本。

代码示例

import fitz

def retrieve_text_by_area(doc_path, target_rect):
    doc = fitz.open(doc_path)
    matched_texts = []
    # 遍历每个页面
    for page_idx, page in enumerate(doc, start=1):
        # 获取页面所有文本片段及其位置数据
        all_words = page.get_text("words")
        for word_info in all_words:
            # 提取文本的坐标和内容
            x0, y0, x1, y1, text = word_info[:5]
            word_rect = fitz.Rect(x0, y0, x1, y1)
            # 按需选择判断逻辑:这里是筛选与目标区域有重叠的文本
            if word_rect.intersects(target_rect):
                matched_texts.append({
                    "page_number": page_idx,
                    "content": text,
                    "text_position": (x0, y0, x1, y1)
                })
    doc.close()
    return matched_texts

# 实际调用示例
if __name__ == "__main__":
    # 定义目标矩形区域(x0, y0为左下角坐标,x1, y1为右上角坐标)
    target_area = fitz.Rect(60, 180, 320, 230)
    results = retrieve_text_by_area("your_file.pdf", target_area)
    for res in results:
        print(f"页码:{res['page_number']},文本:{res['content']},位置:{res['text_position']}")

细节调整

  • 判断逻辑可选:
    • 如果要筛选完全包含在目标区域内的文本,把intersects换成target_rect.contains(word_rect)或者word_rect in target_rect。
    • 如果只需要目标区域内的文本片段(不管是否超出),可以基于交集范围进一步提取对应文本。
  • 坐标转换:PyMuPDF的坐标原点在页面左下角,若你拿到的目标区域坐标是以上左上角为原点的,需要用页面高度 - y值转换y坐标,比如page_rect = page.rect; converted_y0 = page_rect.height - original_y1; converted_y1 = page_rect.height - original_y0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:15