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

如何将fitz.get_text('block')返回的坐标转换为图像像素坐标

fitz文本块坐标转图像像素坐标解决方法

坐标不匹配主要来自两个底层差异:

  • fitz返回的坐标单位是PDF标准点(1点=1/72英寸),不是图像像素
  • PDF页面坐标原点在左下角,y轴向上递增;图像像素坐标原点在左上角,y轴向下递增

转换步骤

1. 确定缩放系数

你渲染PDF页面为图像时的缩放系数zoom可以通过两种方式获取:

  • 渲染时主动指定:比如要生成200DPI的图像,缩放系数为zoom = 200 / 72,对应渲染矩阵为fitz.Matrix(zoom, zoom)
  • 从已有的渲染结果计算:如果已经生成了pixmap对象,可通过zoom = pix.width / page.rect.width得到

2. 坐标转换计算

fitz.get_text('blocks')返回的每个文本块前四个值为(x0, y0, x1, y1),对应PDF坐标下文本块的左边界、下边界、右边界、上边界,转换为像素坐标的公式如下:

# 先获取PDF页面的总高度(单位:点)
page_height = page.rect.height

# 转换为图像像素坐标
pixel_left = x0 * zoom
pixel_top = (page_height - y1) * zoom
pixel_right = x1 * zoom
pixel_bottom = (page_height - y0) * zoom

转换后得到的四个值就是图像上对应文本块的左上角、右下角像素坐标,可直接用于高亮绘制。

示例代码

import fitz

# 打开PDF并取第一页
doc = fitz.open("your_file.pdf")
page = doc[0]

# 按2倍缩放渲染页面为图像
zoom = 2
pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom))
page_height = page.rect.height

# 遍历所有文本块转换坐标
for block in page.get_text("blocks"):
    x0, y0, x1, y1, text, block_id, block_type = block
    # 跳过非文本块
    if block_type != 0:
        continue
    # 坐标转换
    px0 = round(x0 * zoom)
    py0 = round((page_height - y1) * zoom)
    px1 = round(x1 * zoom)
    py1 = round((page_height - y0) * zoom)
    # 此处可插入你自己的高亮绘制逻辑

注意事项

  • 坐标反转必须基于PDF页面的点高度page.rect.height,不能直接用渲染后图像的像素高度计算,避免缩放导致的偏差
  • 如果没有指定缩放直接调用page.get_pixmap(),默认缩放系数为1,直接代入公式即可
  • 绘制时如果需要整数坐标,对计算结果做四舍五入即可,不建议直接截断,避免小尺寸文本的坐标偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:57:01