使用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" 
  • 运行效果
相关推荐
老百姓懂点AI14 小时前
[RAG实战] 向量数据库选型与优化:智能体来了(西南总部)AI agent指挥官的长短期记忆架构设计
python
u01092727115 小时前
C++中的策略模式变体
开发语言·c++·算法
雨季66615 小时前
构建 OpenHarmony 简易文字行数统计器:用字符串分割实现纯文本结构感知
开发语言·前端·javascript·flutter·ui·dart
雨季66615 小时前
Flutter 三端应用实战:OpenHarmony 简易倒序文本查看器开发指南
开发语言·javascript·flutter·ui
进击的小头16 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
天马379816 小时前
Canvas 倾斜矩形绘制波浪效果
开发语言·前端·javascript
Tansmjs16 小时前
C++与GPU计算(CUDA)
开发语言·c++·算法
喵手16 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
qx0916 小时前
esm模块与commonjs模块相互调用的方法
开发语言·前端·javascript
Suchadar16 小时前
if判断语句——Python
开发语言·python