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

如何用PyMuPDF生成与pdf2image一致的numpy数组格式PDF图片?

解决方案:用PyMuPDF生成与pdf2image一致的(高度,宽度,3)格式numpy数组

核心调整点

PyMuPDF的Pixmap对象直接转numpy会得到一维字节数组,需根据Pixmap尺寸重新reshape,同时确保生成RGB三通道像素数据:

  • 生成Pixmap时显式指定colorspace="rgb",强制输出三通道格式
  • 将Pixmap字节数据转为numpy数组后,reshape为(高度, 宽度, 3)的三维结构

代码实现

原pdf2image参考代码

from pdf2image import convert_from_path
import numpy as np

# 转换单页为numpy数组
pages = convert_from_path("input.pdf", dpi=300)
pdf2image_arr = np.array(pages[0])
# 数组属性:(height, width, 3)

修改后的PyMuPDF代码

import fitz  # PyMuPDF
import numpy as np

def pdf_page_to_numpy(pdf_path, page_num=0, dpi=300):
    doc = fitz.open(pdf_path)
    page = doc[page_num]
    
    # 对齐dpi:PyMuPDF默认单位为点(1点=1/72英寸),计算缩放因子
    zoom = dpi / 72.0
    mat = fitz.Matrix(zoom, zoom)
    
    # 生成RGB格式Pixmap
    pix = page.get_pixmap(matrix=mat, colorspace="rgb")
    
    # 字节流转numpy并reshape为目标结构
    pymupdf_arr = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, 3)
    
    doc.close()
    return pymupdf_arr

# 调用示例
result_arr = pdf_page_to_numpy("input.pdf", dpi=300)
# 数组属性:(height, width, 3),与pdf2image输出一致

关键细节说明

  • 缩放因子对齐:PyMuPDF的Matrix缩放基于72dpi默认分辨率,要和pdf2image的dpi参数匹配,必须用dpi/72.0作为缩放比例
  • 颜色空间强制:不指定colorspace="rgb"时,PyMuPDF可能输出单通道灰度或CMYK四通道数据,导致数组维度不符
  • 字节流结构:pix.samples直接提供RGB顺序的字节流,无需额外通道转换,reshape后结构与pdf2image完全匹配

数组属性对比

工具数组形状数据类型通道顺序
pdf2image(height, width,3)uint8RGB
修改后PyMuPDF(height, width,3)uint8RGB

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:32:06