如何用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) | uint8 | RGB |
| 修改后PyMuPDF | (height, width,3) | uint8 | RGB |
内容的提问来源于stack exchange,提问作者carousallie
相关产品推荐
相关产品推荐

