Python中图片列表生成PDF速度过慢的优化求助
优化图片转PDF的性能方案
一、换用高性能库:PyMuPDF(fitz)
PyMuPDF基于MuPDF引擎,底层由C实现,处理PDF与图片的速度远优于PIL/FPDF,是这类场景的首选方案,单份PDF生成耗时可控制在1-3秒内,完全满足你的目标。
示例代码:
import fitz # 需先安装:pip install pymupdf import os def fitz_pdf(): downloads = r"C:\Users\USER\Downloads" file_nmbr = 3 imagelist = [os.path.join(downloads, f"{i}.png") for i in range(1, file_nmbr + 1)] # 创建PDF文档 pdf = fitz.open() for img_path in imagelist: # 按A4尺寸创建页面并插入图片 rect = fitz.Rect(0, 0, 210, 297) pdf.new_page(width=rect.width, height=rect.height) page = pdf[-1] page.insert_image(rect, filename=img_path) pdf.save(os.path.join(downloads, "out_vFitz.pdf")) pdf.close()
二、PIL现有代码的针对性优化
如果必须保留PIL方案,可通过以下调整小幅降低耗时:
- 用生成器替代列表存储图片,减少内存占用与预加载开销
- 启用
optimize参数,优化PDF存储 - 控制压缩级别平衡速度与文件大小
优化后的PIL代码:
from PIL import Image import os def optimized_pil_pdf(): downloads = r"C:\Users\USER\Downloads" file_nmbr = 3 first_img_path = os.path.join(downloads, "1.png") with Image.open(first_img_path).convert("RGB") as first_img: out_path = os.path.join(downloads, "out_vPIL_opt.pdf") # 生成器按需加载后续图片,避免一次性占用内存 imgs_to_append = ( Image.open(os.path.join(downloads, f"{i}.png")).convert("RGB") for i in range(2, file_nmbr + 1) ) first_img.save( out_path, save_all=True, append_images=imgs_to_append, optimize=True, compression_level=6 )
三、通用性能优化建议
- IO优化:确保图片文件与PDF输出路径在同一磁盘分区,减少跨分区IO开销;使用SSD存储可大幅提升读写速度
- 图片预处理:若图片尺寸远大于A4规格,先按比例缩小图片,减少处理的数据量
- 批量并行处理:若需生成多份PDF,采用多进程(而非多线程)并行执行,充分利用CPU多核资源
内容的提问来源于stack exchange,提问作者h311p0w5
相关产品推荐
相关产品推荐

