使用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" 
  • 运行效果
相关推荐
oem1102 分钟前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
CSDN_Colinw11 分钟前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
沉沙丶16 分钟前
关于matlab分析电流THD的一些探究和记录
开发语言·matlab·电机控制·foc·永磁同步电机·模型预测·预测控制
chase。18 分钟前
Python包构建工具完全指南:python -m build 使用详解
开发语言·chrome·python
SuperEugene22 分钟前
前端 utils 工具函数规范:拆分 / 命名 / 复用全指南,避开全局污染等高频坑|编码语法规范篇
开发语言·前端·javascript
xin_yao_xin22 分钟前
PaddleOCR系列——《文本检测、文本识别》模型训练
人工智能·python·paddlepaddle·ppocr
2401_8331977322 分钟前
用Python制作一个文字冒险游戏
jvm·数据库·python
古城小栈30 分钟前
Go 底层代码的完整分类
开发语言·后端·golang
耳冉鹅35 分钟前
Go无锁共享内存环形缓冲区设计
开发语言·golang
万粉变现经纪人40 分钟前
如何解决 pip install cx_Oracle 报错 未找到 Oracle Instant Client 问题
数据库·python·mysql·oracle·pycharm·bug·pip