使用Python整体高效压缩PDF文件

1.功能

编写Python代码,批量压缩pdf文档,压缩率可达到90%

2.处理思路

先把pdf转成图片,然后压缩图片,再把压缩好的图片合成pdf(以下描述来自AI)
具体思路:

  1. 栅格化(PDF转图片)
    代码读取 PDF 的每一页,强制把页面上的所有内容(文字、矢量图、遮罩)渲染成一张 位图数据(Pixmap)
    • 代码对应: page.get_pixmap(...)
  2. 重编码(图片转JPEG)
    把这张位图数据,使用 JPEG 算法 进行有损压缩。这一步通过丢弃颜色细节来减小体积。
    • 代码对应: pix.tobytes("jpeg", ...)
  3. 重组装(图片转PDF)
    新建一个空白 PDF 页面,把压缩后的 JPEG 数据流直接填进去,最后保存。
    • 代码对应: new_page.insert_image(...)

总结: 原理就是 PDF页 -> 渲染为像素点 -> 压缩成JPEG -> 塞回新PDF

3.准备工作

python版本:

  • python3.8版本以上

安装第三方库:

powershell 复制代码
pip install pymupdf

参考代码

python 复制代码
import os
import fitz  # PyMuPDF
import time

# === 💎 超清重制配置 (影院级) ===

# 1. 清晰度 (缩放倍数)
# 2.5 = 180 DPI (还有点糊)
# 3.0 = 216 DPI (非常清晰,类似 iPad 阅读体验)
# 如果还觉得糊,可以极端点设为 4.0 (300 DPI 打印级),但体积会翻倍
ZOOM_FACTOR = 3.0

# 2. 图片质量 (1-100)
# 85 是高保真分界线,文字边缘会很干净
JPG_QUALITY = 85

def rasterize_pdf(input_path, output_path):
    try:
        doc_src = fitz.open(input_path)
        doc_out = fitz.open()
        
        total_pages = len(doc_src)
        print(f"   📄 总页数: {total_pages} (超清渲染中...)")

        for page_num, page in enumerate(doc_src):
            # 1. 超清渲染 (3倍分辨率)
            # alpha=False 强制白底,防止透明变黑
            mat = fitz.Matrix(ZOOM_FACTOR, ZOOM_FACTOR)
            pix = page.get_pixmap(matrix=mat, alpha=False)
            
            # 2. 高保真压缩
            img_data = pix.tobytes("jpeg", jpg_quality=JPG_QUALITY)
            
            # 3. 创建页面
            new_page = doc_out.new_page(width=page.rect.width, height=page.rect.height)
            
            # 4. 插入图片
            new_page.insert_image(page.rect, stream=img_data)
            
            # 释放内存 (大图很吃内存,必须及时释放)
            pix = None
            
            # 进度条
            print(f"      [{(page_num+1)/total_pages*100:.0f}%] 第 {page_num + 1}/{total_pages} 页", end="\r")

        print("") 
        
        # 保存
        doc_out.save(output_path, garbage=4, deflate=True)
        doc_out.close()
        doc_src.close()
        return True

    except Exception as e:
        print(f"   ❌ 出错: {e}")
        return False

def run_rasterize_batch(input_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    files = [f for f in os.listdir(input_folder) if f.lower().endswith('.pdf')]
    
    print(f"📸 启动【超清重制】模式")
    print(f"⚙️ 参数: 倍数={ZOOM_FACTOR}x (~{int(72*ZOOM_FACTOR)} DPI) | 画质 Q={JPG_QUALITY}")
    print("-" * 50)

    for i, f in enumerate(files):
        input_file = os.path.join(input_folder, f)
        output_file = os.path.join(output_folder, f)
        
        start_time = time.time()
        file_size_org = os.path.getsize(input_file)
        
        print(f"({i+1}/{len(files)}) 正在重制: {f}")
        
        if rasterize_pdf(input_file, output_file):
            if os.path.exists(output_file):
                file_size_new = os.path.getsize(output_file)
                ratio = (1 - (file_size_new / file_size_org)) * 100
                duration = time.time() - start_time
                
                print(f"   ✅ 完成! 耗时 {duration:.1f}s")
                print(f"   📉 体积: {file_size_org/1024/1024:.1f}MB -> {file_size_new/1024/1024:.1f}MB (节省 {ratio:.1f}%)")
        else:
            print(f"   ❌ 失败")
        print("-" * 50)

if __name__ == "__main__":
    # 路径
    input_dir = r"E:\Aliencell_User_Manual\all_user_manual"
    output_dir = r"E:\Aliencell_User_Manual\output_cinema_quality" 
    
    run_rasterize_batch(input_dir, output_dir)
    
  • 如果想要提高图片质量或者更改清晰度修改参数JPG_QUALITY或者ZOOM_FACTOR
  • 将所有pdf文件放在input_dir ,然后创建一个输出的文件夹。注意更改路径和名称,名称不要用中文
powershell 复制代码
   input_dir = r"E:\Aliencell_User_Manual\all_user_manual"
   output_dir = r"E:\Aliencell_User_Manual\output_cinema_quality" 
  • 运行效果
相关推荐
向阳蒲公英8 小时前
Pycharm2025版本配置Anaconda步骤
python
每天吃饭的羊8 小时前
媒体查询
开发语言·前端·javascript
Darkershadow8 小时前
蓝牙学习之uuid与mac
python·学习·ble
北海有初拥8 小时前
Python基础语法万字详解
java·开发语言·python
阿里嘎多学长8 小时前
2026-01-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
天远云服8 小时前
Go语言高并发实战:集成天远手机号码归属地核验API打造高性能风控中台
大数据·开发语言·后端·golang
Mqh1807629 小时前
day61 经典时序模型3
python
我想吃烤肉肉9 小时前
logger比print优秀之处
python
2501_941877139 小时前
在法兰克福企业级场景中落地零信任安全架构的系统设计与工程实践分享
开发语言·php
Cosmoshhhyyy9 小时前
《Effective Java》解读第32条:谨慎并用泛型和可变参数
java·python