PyMuPDF提取指定Rect区域文本失败,Rect.is_empty返回True的原因
问题:PyMuPDF获取PDF指定区域文本失败,Rect显示为空
我尝试了Stack Overflow上《读取PDF特定区域》帖子里的解决方案,但用户Zach Young提供的示例代码没法正常运行。设置合理的Rect参数后,执行print(rect.is_empty)输出True,画不出矩形,page.get_textbox(rect)没有输出,不过page.get_text()能正常获取全文本,想问问这是什么原因。
相关代码如下:
import os.path import fitz from fitz import Document, Page, Rect # 可视化PyMuPDF的Rect和你在PDF里看到的区域对比 VISUALIZE = True input_path = "test.pdf" doc: Document = fitz.open(input_path) for i in range(len(doc)): page: Page = doc[i] page.clean_contents() # 参考PyMuPDF文档:解决PDF页面元素错位问题 # 硬编码你需要的区域 rect = Rect(0, 0, 100, 100) if VISUALIZE: # 画红色方框可视化Rect区域 page.draw_rect(rect, width=1.5, color=(1, 0, 0)) text = page.get_textbox(rect) print(text) if VISUALIZE: head, tail = os.path.split(input_path) viz_name = os.path.join(head, "viz_" + tail) doc.save(viz_name)
可能的原因及排查方向
- Rect参数顺序错误:PyMuPDF的
Rect构造要求x0 < x1且y0 < y1,如果把坐标写反(比如Rect(100,100,0,0)),Rect会被判定为空。检查你设置的四个坐标值是否满足这个规则。 - 页面坐标系搞反:PyMuPDF的坐标系原点在页面左下角,但多数PDF阅读器显示的原点在左上角。如果你是按阅读器的左上角坐标设置Rect,实际可能落在页面外,导致Rect无效或没有文本。可以先打印
page.rect查看页面实际尺寸,确认坐标范围。 - clean_contents影响:虽然
page.clean_contents()是用来修复页面内容的,但部分PDF执行后可能导致文本坐标异常。可以尝试注释掉这一行再测试。 - Rect范围太精准:如果Rect的边界刚好卡着文本块边缘,可能无法捕获到文本。可以适当扩大Rect范围,比如把坐标调整为
(x0-2, y0-2, x1+2, y1+2)再试。
内容的提问来源于stack exchange,提问作者von spotz
相关产品推荐
相关产品推荐

