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

PyMuPDF draw_rect函数绘制异常:PDF 1.5版本矩形镜像缩放问题

问题分析与解决方案

你遇到的问题核心原因是PDF 1.5的页面坐标系与绘制函数的默认坐标系存在变换差异:

  • add_redact_annot严格遵循PDF标准的用户坐标系(原点在页面左下角)
  • draw_rect可能使用了以页面左上角为原点的画布坐标系,且未自动适配PDF 1.5的页面变换规则,导致矩形镜像、缩放异常;而PDF 1.7版本的页面处理逻辑更完善,自动兼容了坐标系差异。

修复代码方案

方案1:利用页面变换矩阵转换坐标(适配多数PDF处理库,如PyMuPDF)

通过获取页面的变换矩阵,将原始矩形坐标转换为draw_rect适配的坐标系:

def hide_text_rects(page, rects):
    # 获取页面的逆变换矩阵,用于转换坐标
    inv_mat = page.get_matrix().invert()
    for rect in rects:
        page.add_redact_annot(rect)
        # 将原始矩形转换为绘制坐标系下的矩形
        adjusted_rect = rect.transform(inv_mat)
        page.draw_rect(adjusted_rect, color=(0,0,0), fill=(0,0,0))

方案2:手动翻转Y坐标(针对坐标系原点差异)

如果库没有提供变换矩阵接口,可手动基于页面高度翻转Y坐标(PDF用户坐标系原点在左下角,绘制坐标系常以左上角为原点):

def hide_text_rects(page, rects):
    # 获取页面高度(基于MediaBox)
    mediabox = page.mediabox
    page_height = mediabox[3] - mediabox[1]
    for rect in rects:
        page.add_redact_annot(rect)
        # 调整矩形的Y坐标:原始y1/y2转换为绘制坐标系的对应值
        adjusted_rect = (rect[0], page_height - rect[3], rect[2], page_height - rect[1])
        page.draw_rect(adjusted_rect, color=(0,0,0), fill=(0,0,0))

验证说明

修改后,PDF 1.5版本中draw_rect绘制的矩形会和add_redact_annot的标注位置完全重合,解决镜像、缩放问题。

内容的提问来源于stack exchange,提问作者Maximiliano Medina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:05:29