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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:31:17