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

如何用Python压缩大体积PDF?现有方案效果不佳求优化

PDF自动化压缩方案(目标:≤100MB,最优≤20MB)

一、PyMuPDF压缩效果不佳的核心原因

你当前使用的PyMuPDF参数属于无损压缩范畴,仅清理PDF冗余结构、压缩数据流,但不会对文档内的高分辨率图片做质量或分辨率降级——而228MB的PDF体积大概率由大量高清图像占据,这是无损压缩无法解决的问题。

二、可行的自动化压缩方案

1. 优化PyMuPDF:加入图像有损压缩逻辑

通过对PDF内的图像进行质量压缩、分辨率下采样,可大幅降低体积,修改后的代码如下:

import fitz  # PyMuPDF

def compress_pdf(input_path, output_path, img_quality=40, target_dpi=120):
    doc = fitz.open(input_path)
    # 遍历每一页处理图像
    for page in doc:
        for img in page.get_images(full=True):
            xref = img[0]
            # 提取图像数据并重新压缩
            base_img = doc.extract_image(xref)
            img_obj = fitz.open("png", base_img["image"])
            # 按目标参数保存为压缩后的JPEG
            img_obj.save("temp_compressed.jpg", quality=img_quality, dpi=(target_dpi, target_dpi))
            # 替换PDF中原图像
            doc.update_image(xref, filename="temp_compressed.jpg")
    # 最后执行无损清理+流压缩
    doc.save(
        output_path,
        garbage=4,
        deflate=True,
        clean=True,
        deflate_images=True,
        deflate_fonts=True
    )
    doc.close()

# 使用示例:可根据效果调整img_quality(0-100)和target_dpi
compress_pdf("input.pdf", "output_pymupdf_compressed.pdf", img_quality=35, target_dpi=100)
  • 建议逐步测试img_quality和target_dpi的组合,找到“可阅读质量”与“最小体积”的平衡点。

2. 使用Ghostscript命令行工具(推荐,压缩效率接近ilovepdf)

Ghostscript是专业PDF处理工具,其压缩逻辑和ilovepdf类似,支持通过命令行自动化执行,适合批量处理。

通用命令(Windows/macOS/Linux均可运行):

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output_compressed.pdf input.pdf
  • 参数说明:
    • -dPDFSETTINGS=/ebook:电子书级预设,对应分辨率约150dpi,质量满足日常阅读,压缩比极高;
    • 追求更小体积可替换为/screen(72dpi,屏幕阅读级);需保留打印质量则用/printer(300dpi);
    • 自定义压缩:可添加-dDownsampleColorImages=true -dColorImageResolution=100手动指定彩色图像分辨率,-dGrayImageResolution=100指定灰度图分辨率。

3. Python封装Ghostscript(实现全自动化)

如果需要用Python脚本整合压缩流程,可通过subprocess调用Ghostscript命令:

import subprocess

def compress_with_gs(input_path, output_path, preset="/ebook"):
    cmd = [
        "gs",
        "-sDEVICE=pdfwrite",
        "-dCompatibilityLevel=1.4",
        f"-dPDFSETTINGS={preset}",
        "-dNOPAUSE",
        "-dQUIET",
        "-dBATCH",
        "-sOutputFile=" + output_path,
        input_path
    ]
    subprocess.run(cmd, check=True)

# 使用示例
compress_with_gs("input.pdf", "output_gs_compressed.pdf", preset="/ebook")

注意:需先在系统中安装Ghostscript,确保gs命令可直接调用。

三、额外优化技巧

  • 字体优化:若PDF嵌入了完整字体,可尝试添加Ghostscript参数-dEmbedAllFonts=false(仅嵌入文档用到的字符),但需测试避免其他设备字体缺失;
  • 拆分压缩合并:若部分页面图像占比极高,可拆分PDF后针对性调整压缩参数,再用PyMuPDF或Ghostscript合并;
  • 参数组合测试:Ghostscript的/ebook预设配合手动降低分辨率(如100dpi),通常能达到20MB以内的压缩效果,和ilovepdf中等压缩逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:22:51