如何使用PyMuPDF直接将NumPy数组图像保存到PDF页面?
直接将NumPy数组图像转PDF的优化方案
你完全可以跳过保存PNG临时文件的步骤,直接在内存中处理NumPy数组生成PDF页面,既提升效率又避免磁盘IO操作。下面是优化后的代码:
import fitz import numpy as np from PIL import Image from cv2 import cvtColor, COLOR_RGB2GRAY doc = fitz.open() pdf = fitz.open("in.pdf") for page in pdf: # 从原PDF页面提取图像并转为灰度NumPy数组 pix = page.get_pixmap(matrix=fitz.Matrix(7, 7)) im = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) gray_np = cvtColor(np.array(im), COLOR_RGB2GRAY) # 直接将灰度NumPy数组转为PyMuPixmap(内存操作,无需存盘) gray_pix = fitz.Pixmap( fitz.csGRAY, # 指定灰度色彩空间 gray_np.shape[1], # 图像宽度 gray_np.shape[0], # 图像高度 8, # 每个像素的比特数(灰度图用8位) gray_np.tobytes() # 数组的字节数据 ) # 创建匹配图像尺寸的PDF新页面 new_page = doc.new_page(width=gray_pix.width, height=gray_pix.height) # 将灰度图像直接插入页面 new_page.insert_image(new_page.rect, pixmap=gray_pix) # 保存最终PDF doc.save("out.pdf") pdf.close()
关键优化点:
- 省去了临时PNG文件的保存、读取和删除步骤,所有处理都在内存中完成
- 利用
fitz.Pixmap直接将NumPy数组的字节数据转换为PyMuPDF可识别的像素图对象 - 通过
insert_image方法直接将像素图绘制到PDF页面,无需中转临时PDF流
内容的提问来源于stack exchange,提问作者R.Q Luo
相关产品推荐
相关产品推荐

