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
相关产品推荐
相关产品推荐

