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

