辽源市网站建设_网站建设公司_Oracle_seo优化
2026/1/5 17:56:21 网站建设 项目流程

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版本以上

安装第三方库:

pip install pymupdf

参考代码

importosimportfitz# PyMuPDFimporttime# === 💎 超清重制配置 (影院级) ===# 1. 清晰度 (缩放倍数)# 2.5 = 180 DPI (还有点糊)# 3.0 = 216 DPI (非常清晰,类似 iPad 阅读体验)# 如果还觉得糊,可以极端点设为 4.0 (300 DPI 打印级),但体积会翻倍ZOOM_FACTOR=3.0# 2. 图片质量 (1-100)# 85 是高保真分界线,文字边缘会很干净JPG_QUALITY=85defrasterize_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}(超清渲染中...)")forpage_num,pageinenumerate(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()returnTrueexceptExceptionase:print(f" ❌ 出错:{e}")returnFalsedefrun_rasterize_batch(input_folder,output_folder):ifnotos.path.exists(output_folder):os.makedirs(output_folder)files=[fforfinos.listdir(input_folder)iff.lower().endswith('.pdf')]print(f"📸 启动【超清重制】模式")print(f"⚙️ 参数: 倍数={ZOOM_FACTOR}x (~{int(72*ZOOM_FACTOR)}DPI) | 画质 Q={JPG_QUALITY}")print("-"*50)fori,finenumerate(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}")ifrasterize_pdf(input_file,output_file):ifos.path.exists(output_file):file_size_new=os.path.getsize(output_file)ratio=(1-(file_size_new/file_size_org))*100duration=time.time()-start_timeprint(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 ,然后创建一个输出的文件夹。注意更改路径和名称,名称不要用中文
input_dir = r"E:\Aliencell_User_Manual\all_user_manual"output_dir = r"E:\Aliencell_User_Manual\output_cinema_quality"
  • 运行效果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询