使用pypdf 3.7.0提取文本时text matrix(tm)的y坐标错误
解决PyPDF 3.7.0中文本Y坐标提取错误的问题
问题根源
你遇到的Y坐标错误,本质是没结合**变换矩阵(cm)和文本矩阵(tm)**做坐标转换——PDF里的文本最终位置是这两个矩阵组合运算的结果,不能直接用tm的原始值。当cm不是单位矩阵时(比如带平移偏移),直接取tm的Y值必然出错。
具体修复方案
1. 搞懂PDF的坐标变换公式
PDF用6元素齐次矩阵做坐标变换,cm矩阵[a, b, c, d, e, f]和tm矩阵的前两个元素(文本的原始x、y)计算最终坐标的公式是:
最终X = a * tm_x + c * tm_y + e 最终Y = b * tm_x + d * tm_y + f
另外要注意:PDF默认坐标系原点在页面左下角,如果你的后续操作需要左上角为原点(比如常见的图像/UI坐标系),需要用页面高度(792)减去计算出的Y值。
2. 代码实现修正
用PyPDF的layout提取模式获取文本块的cm和tm,然后代入公式计算:
from pypdf import PdfReader reader = PdfReader("目标文件.pdf") page = reader.pages[0] page_height = 792 # 你确认的页面高度 # 以layout模式提取文本,返回带位置信息的TextItem对象 for text_item in page.extract_text(extraction_mode="layout", return_type="text_items"): cm = text_item.cm # 变换矩阵 tm = text_item.tm # 文本矩阵 tm_x, tm_y = tm[0], tm[1] # 计算最终坐标 final_x = cm[0] * tm_x + cm[2] * tm_y + cm[4] final_y = cm[1] * tm_x + cm[3] * tm_y + cm[5] # 转换为左上角为原点的坐标系(可选,视你的需求而定) final_y_top_origin = page_height - final_y print(f"文本: {text_item.text}, 修正后X: {final_x:.2f}, 修正后Y(左下角原点): {final_y:.2f}, Y(左上角原点): {final_y_top_origin:.2f}")
3. 验证兼容性
当cm是单位矩阵[1,0,0,1,0,0]时,代入公式后最终坐标就是tm的原始值,完全兼容你之前处理正常文件的场景。
内容的提问来源于stack exchange,提问作者Huy Pham
相关产品推荐
相关产品推荐

