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

如何设置Fitz draw_rect坐标以遮挡PDF中的姓名字段?

解决PyMuPDF(Fitz)绘制遮挡矩形的坐标问题

核心问题:PyMuPDF的坐标逻辑

PyMuPDF以页面左下角为坐标原点(x向右递增,y向上递增),和常见的左上角原点系统不同,这是你找不到正确坐标的关键原因。另外你的代码存在两个明显错误:

  • 矩形坐标顺序错误:[100,0,5,500]中x0(100) > x1(5),不符合x0 < x1、y0 < y1的要求
  • 参数误用:width=100只会画粗边框,要实现遮挡需要用fill参数填充颜色

步骤1:获取目标字段的准确坐标

方法1:自动提取文本坐标

通过get_text("words")获取页面所有文本的位置,匹配姓名相关文本即可得到精准坐标:

import fitz

doc = fitz.open("ABCZ01S0112_Canon iR-ADV C256_1388_0012.pdf")
page = doc[0]  # 假设姓名在第一页

# 遍历所有文本块,定位姓名字段
for word in page.get_text("words"):
    x0, y0, x1, y1, text = word[:5]
    # 根据PDF内的实际文本关键词调整,比如“姓名”或姓名对应的具体内容
    if "姓名" in text:
        # 绘制遮挡矩形,可适当扩大范围确保完全覆盖
        cover_rect = fitz.Rect(x0-3, y0-3, x1+3, y1+3)
        page.draw_rect(cover_rect, color=(0,0,0), fill=(0,0,0))

doc.save("name_covered.pdf")
doc.close()

方法2:手动调试坐标

如果自动提取不准确,先打印页面尺寸,再用彩色矩形快速调试位置:

import fitz

doc = fitz.open("ABCZ01S0112_Canon iR-ADV C256_1388_0012.pdf")
page = doc[0]

# 打印页面尺寸(A4纸通常是宽595,高842)
print(f"页面尺寸:宽{page.rect.width},高{page.rect.height}")

# 绘制红色调试矩形,调整坐标直到覆盖姓名
page.draw_rect(fitz.Rect(220, 720, 380, 745), color=(1,0,0), fill=(1,0,0))

doc.save("debug.pdf")
doc.close()

打开debug.pdf查看红色矩形位置,微调坐标参数即可。


关键注意事项

  • 矩形参数必须是[x0, y0, x1, y1],其中x0是左边界,y0是下边界,x1是右边界,y1是上边界
  • 用fill=(0,0,0)填充黑色才能实现遮挡,color参数仅控制边框颜色
  • 如果需要批量处理多页,循环遍历所有页面即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:48:21