SpringBoot大附件上传的加密传输安全性分析
2026/1/5 19:09:36
编写Python代码,批量压缩pdf文档,压缩率可达到90%
先把pdf转成图片,然后压缩图片,再把压缩好的图片合成pdf(以下描述来自AI)
具体思路:
page.get_pixmap(...)pix.tobytes("jpeg", ...)new_page.insert_image(...)总结:原理就是PDF页 -> 渲染为像素点 -> 压缩成JPEG -> 塞回新PDF。
python版本:
安装第三方库:
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)input_dir = r"E:\Aliencell_User_Manual\all_user_manual"output_dir = r"E:\Aliencell_User_Manual\output_cinema_quality"