如何用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
相关产品推荐
相关产品推荐

