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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:10:11