如何使用PyMuPDF通过尺寸定位文本?
用PyMuPDF根据指定区域尺寸查找对应文本
完全可以实现这个需求,核心思路是先提取页面上所有文本的位置信息,再筛选出落在目标区域内的内容。
实现步骤
- 使用PyMuPDF的
Page.get_text("words")方法,获取页面上所有文本片段的详细信息,每个返回的元组包含文本的坐标范围(x0, y0, x1, y1,对应文本矩形的左下角和右上角坐标)、文本内容等。 - 定义目标区域的矩形尺寸,将每个文本片段的坐标范围与目标区域对比,筛选出符合条件的文本。
代码示例
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
相关产品推荐
相关产品推荐

