NAS私有部署图片与PDF批量压缩转换服务

NAS私有|图片与PDF批量压缩转换服务:超轻量工作流 + Docker一键部署
这是一套面向 NAS/私有化部署场景的本地 Web 服务,用于批量处理 PDF/图片文件:解压上传、保留目录结构、按目标体积智能压缩、打包下载,并提供证件照换底色与尺寸调整等便捷工具。后端基于 Flask,前端用原生 Vue 3,镜像体积小、依赖清晰,适合局域网内协作与家庭使用。
核心优势
私有化部署与本地运行:全流程在 NAS/本机内完成,数据不出网,保护隐私。
处理速度非常快:轻量架构与任务并行,I/O 与压缩流程优化,数百张图片、几十页 PDF 通常在分钟级完成。
为什么需要它
家庭与小团队常见需求:大量照片、文档需要按规则压缩、转格式,并保留原有目录结构。
NAS 场景下偏好本地化与隐私:不上传云端,不依赖外网即可完成批处理(隐私友好)。
统一入口与批处理:一次上传,多格式支持、自动解压、批量输出,减少重复劳动。
速度优先的工程实践:尽量减少不必要的重渲染与重复 I/O,充分利用并行任务与本地硬件性能。
功能一览
多格式上传:支持 PDF/JPG/JPEG/PNG/ZIP/7Z/RAR。
自动解压:ZIP/7Z/RAR 自动展开到任务工作区并扫描处理。
输出格式:可选 jpg/jpeg/png/pdf。
目标大小(KB):逐步降采样与压缩,尽量满足设定体积。
保留目录结构:输出到 result/ 并同时打包为 result.zip。
状态轮询:前端每 800ms 轮询,实时显示“排队/处理/完成/失败”阶段与当前文件名。
证件照换底色:支持蓝/红/白,优先使用人像分割模型,避免误改面部或头发。
证件照尺寸调整:常见一寸/两寸/护照等预设,支持自定义毫米尺寸、DPI与填充策略。
纯前端交互优化:拖拽高亮、文件列表与大小徽章、移除文件、禁用态与 Spinner、Toast 提示、带时间戳日志。
架构与目录
pic_converter.py # 核心处理逻辑(PDF渲染、图片压缩、体积控制、目录结构保留) web_app.py # Flask Web 服务(上传、解压、处理、状态、下载、换底色、尺寸调整) static/ # 前端依赖(内置 Vue 全局构建以应对无外网场景) user/u_p.py # 登录用户配置(JSON结构) web_jobs/ # 任务工作区(每次上传一个作业目录,输出result与result.zip)
后端:Flask + gunicorn
前端:Vue 3(尽量不依赖外网;若本地静态文件缺失,会尝试国内 CDN 或注入占位)
依赖:Pillow、PyMuPDF、rembg(可选)、onnxruntime(可选)、py7zr、rarfile
部署与运行
Docker(推荐)官方镜像:
registry.cn-hangzhou.aliyuncs.com/public-cc/dashu:pic_convertor
拉取镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/public-cc/dashu:pic_convertor
运行容器:
# Linux/macOS docker run --rm -p 5000:5000 -v $(pwd)/web_jobs:/app/web_jobs registry.cn-hangzhou.aliyuncs.com/public-cc/dashu:pic_convertor # Windows PowerShell docker run --rm -p 5000:5000 -v ${PWD}/web_jobs:/app/web_jobs registry.cn-hangzhou.aliyuncs.com/public-cc/dashu:pic_convertor
访问地址:http://localhost:5000/
数据卷:将容器内的 web_jobs 映射到宿主机,方便查看结果与排查状态。
说明:镜像内含 p7zip-full 与 unar 以更好兼容 RAR5/中文文件名;默认使用 HTTP 与 gunicorn 监听 0.0.0.0:5000。
完全本地化运行:无需外网即可完成上传、处理与下载,敏感文件不离开你的设备。
源码运行(本地)
安装依赖:
pip install -r requirements.txt # 或 pip install flask pillow pymupdf py7zr rarfile
启动服务:
python web_app.py
访问:http://127.0.0.1:5000/
自行构建镜像(可选)
docker build -t pic-converter:latest .
随后将运行命令中的镜像名替换为 pic-converter:latest。
使用指南
打开首页,左侧设置“目标大小(KB)”与“输出格式”。
拖拽或选择文件(支持多文件与压缩包)。
点击“上传并转换”,右侧日志显示排队与处理进度。
完成后出现下载链接,点击直接下载 result.zip。
证件照换底色:
在页面下方选择底色,上传证件照,点击“更换底色”,完成后提供预览与下载链接。
证件照尺寸调整:
选择预设或自定义毫米尺寸与 DPI,上传证件照,点击“调整尺寸”,完成后提供预览与下载链接。
API 简述(便于集成)
POST /upload
FormData:file(多个)、target_kb(数字)、output_format(jpg/jpeg/png/pdf)
返回:{"job_id": "...", "status_url": "/status/"} 或 {"error": "..."}
GET /status/
阶段:queued / processing{filename} / completed{pdf_count,img_count,out_count,download_url} / error{message}
GET /download/
直接下载 result.zip
POST /recolor
FormData:photo(单张)、bg_color(blue/red/white)
返回:{"job_id": "...", "preview_url": "/recolor/", "download_url": "/recolor/?download=1"}
POST /resize
FormData:photo、preset(如“一寸证件照”/“自定义”)、w_mm/h_mm(自定义时)、dpi、fit(cover/contain)、bg_color
常见问题与建议
RAR 解压失败:在宿主机预解压后再上传,或确认容器/系统已安装 unrar/7z 且路径可用。
首次使用换底色较慢:分割模型首次加载耗时,后续调用会更快。
本地网络不可达 CDN:项目内置 static/vue.global.prod.js,若未命中将尝试国内 CDN,再不行则注入占位,确保页面可预览。
性能建议:优先在具备多核 CPU 与 SSD 的设备上运行;批量上传大文件时可分批次以获得更稳定的分钟级处理速度。
面向 NAS 的小技巧
定时清理作业目录:历史任务位于 web_jobs/,可用 NAS 计划任务按时间规则清理。
局域网用户管理:user/u_p.py 支持指定登录用户与密码;默认会生成一个 admin 用户与随机密码。
反向代理与 HTTPS:容器默认 HTTP;如需 HTTPS,建议在 NAS 入口处(如 Nginx/Caddy)做统一 TLS 代理与鉴权。
路线图
更细致的进度反馈(百分比/剩余时间估算)
任务清理与配额限制
更多质量参数(DPI、色彩空间)
前端细节(主题切换、快捷键、无障碍优化)
结语
这是一套务实、轻量、易部署的“批量压缩与转换”工具,适合 NAS 与本地化场景。如果你正在为大量文档与图片的整理、归档、传输而苦恼,它能够把繁琐工作统一到一个简单的流程里,节省时间,也守住隐私。欢迎试用与二次开发。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
