全能格式转换器
一个本地、离线的文件格式转换与 PDF 处理 skill,功能参考 https://app.xunjiepdf.com/ 的能力清单,优先用本机 Python 库实现,无需把文件上传到任何云端。
运行环境
- 用任意 Python 3 运行
scripts/converter.py即可。脚本会在首次运行时自动创建技能目录内的.venv并安装全部依赖(PyMuPDF / Pillow / pypdf / python-docx / openpyxl / python-pptx),之后每次秒开,无需手动配置,也不影响本机其它环境。 - Office→PDF 另需 LibreOffice(未安装时脚本会提示前往 https://www.libreoffice.org 安装,装好后本功能自动可用)。PDF→Office 完全走本地库,不依赖 LibreOffice。
- 音视频转换 另需 FFmpeg(未安装时脚本提示用
winget install Gyan.FFmpeg安装)。 - OCR 图片转文字 另需 Tesseract-OCR(未安装时脚本提示用
winget install UB-Mannheim.TesseractOCR安装;中文识别还需chi_sim语言包)。 - 以上三个外部程序脚本会自动探测路径(含 WinGet 常见安装位置),缺失时给出明确指引,不会静默失败。
调用方式
统一通过 python scripts/converter.py <子命令> [参数] 执行(依赖首次运行会自动就绪,无需手动建 venv)。下文示例中的命令均为此形式,把 python 换成你机器上的 Python 3 解释器即可。
一、PDF → 图片(JPG/PNG)
PY scripts/converter.py pdf2img --input 文档.pdf --outdir out_imgs --format png --dpi 150
# 只转指定页:--pages "1,3,5-7"
二、图片 → PDF(多张按输入顺序排列)
PY scripts/converter.py img2pdf --inputs a.jpg b.png c.jpg --output out.pdf
三、PDF → 文本(TXT)
PY scripts/converter.py pdf2txt --input 文档.pdf --output 文档.txt
四、PDF 合并
PY scripts/converter.py merge --inputs 1.pdf 2.pdf 3.pdf --output merged.pdf
五、PDF 分割
# 按页码范围拆出新文件
PY scripts/converter.py split --input 文档.pdf --outdir out_split --pages "2-5"
# 每页拆成独立 PDF
PY scripts/converter.py split --input 文档.pdf --outdir out_split --each
六、PDF 加密 / 解密
# 设打开密码
PY scripts/converter.py encrypt --input 文档.pdf --output locked.pdf --password 123456
# 解密(需正确密码)
PY scripts/converter.py decrypt --input locked.pdf --output unlocked.pdf --password 123456
七、PDF 压缩(重压内嵌图片,减小体积)
PY scripts/converter.py compress --input 文档.pdf --output 压缩后.pdf --quality 70 --maxw 1600
八、图片格式互转(JPG / PNG / BMP / ICO)
PY scripts/converter.py imgconv --input 1.png --output 1.jpg
PY scripts/converter.py imgconv --input logo.jpg --output logo.ico
九、PDF 提取内嵌图片
PY scripts/converter.py extractimg --input 文档.pdf --outdir out_imgs
十、Office ↔ PDF
# Word/Excel/PPT -> PDF(走 LibreOffice,已安装)
PY scripts/converter.py office2pdf --input 报告.docx --outdir out_pdf
# PDF -> Word/Excel/PPT(走本地库,不依赖 LibreOffice)
PY scripts/converter.py pdf2office --input 文档.pdf --type docx --outdir out_office
实现说明:
- Office → PDF:调用 LibreOffice 无头转换,保留版式与中文,效果最佳。
- PDF → Office:
- docx:PyMuPDF 提取文本块 → python-docx 生成(保留可读文字与段落)。
- xlsx:PyMuPDF 检测表格 → openpyxl 生成;无表格时退化为按行导出文本。
- pptx:每页渲染成图 → python-pptx 每页一张幻灯片(视觉保真,适合放映/批注)。
> 注意:本机 LibreOffice 的 PDF 导入在无头环境不可用(转换会失败),因此 PDF→Office 特意走本地库实现,绕开该限制。Office→PDF 不受影响,正常使用。
十一、图片编辑(纯本地,Pillow)
# 改大小(只给一个边则等比缩放;给两个边可加 --keep-ratio 按比例放入框内)
PY scripts/converter.py imgresize --input a.jpg --output b.jpg --width 800
PY scripts/converter.py imgresize --input a.jpg --output b.jpg --width 800 --height 600 --keep-ratio
# 裁剪:--left --top --right --bottom(像素坐标)
PY scripts/converter.py imgcrop --input a.jpg --output b.jpg --left 0 --top 0 --right 800 --bottom 600
# 旋转:--angle 任意角度,自动扩展画布
PY scripts/converter.py imgrotate --input a.jpg --output b.jpg --angle 90
# 修改分辨率(DPI,用于打印)
PY scripts/converter.py imgdpi --input a.jpg --output b.jpg --dpi 300
# 加水印:文字水印
PY scripts/converter.py imgwatermark --input a.jpg --output b.jpg --text "内部资料" --pos br --opacity 40 --fontsize 48 --angle 30
# 加水印:图片/LOGO 水印
PY scripts/converter.py imgwatermark --input a.jpg --output b.jpg --image logo.png --pos br --scale 20 --opacity 50
# 拼图:横向 / 纵向 / 网格
PY scripts/converter.py imgcollage --inputs 1.jpg 2.jpg 3.jpg --output out.jpg --layout h
PY scripts/converter.py imgcollage --inputs *.jpg --output out.jpg --layout grid --cols 3 --cell 400
水印位置 --pos:tl 左上 / tr 右上 / bl 左下 / br 右下 / c 居中;--opacity 0-100。
十二、音视频转换(需 FFmpeg,已安装)
# 视频互转(mp4/mkv/avi/mov/flv/webm/ts/wmv 等)
PY scripts/converter.py video_convert --input 视频.mov --fmt mp4 --outdir out_video
# 音频互转(mp3/m4a/wav/ogg/flac/amr/wma/aac)
PY scripts/converter.py audio_convert --input 1.wav --fmt mp3 --outdir out_audio
# 视频转 GIF(控制宽度与帧率,自动二阶段调色板,画质更干净)
PY scripts/converter.py video_gif --input 视频.mp4 --width 480 --fps 12 --outdir out_gif
# 视频合并(先统一编码再 concat,兼容不同来源)
PY scripts/converter.py video_merge --inputs a.mp4 b.mp4 --output merged.mp4 --outdir out_merge
# 提取音频(视频 -> mp3/wav/m4a/aac/ogg/flac)
PY scripts/converter.py extract_audio --input 视频.mp4 --fmt mp3 --outdir out_audio
# 变速(>1 加速,<1 减速;音视频同步处理)
PY scripts/converter.py video_speed --input 视频.mp4 --speed 2.0 --outdir out_speed
> 实现基于 FFmpeg 无头调用,质量等同主流转码工具。测试覆盖:mp4↔avi↔mkv、转 GIF、合并、提取 mp3、mp3→wav、2x 变速,全部通过。
十三、OCR 图片转文字(需 Tesseract,已安装 + 中文包)
# 图片 -> 文本(默认 chi_sim+eng,输出 .txt)
PY scripts/converter.py ocr --input 截图.png --output 结果 --langs chi_sim+eng
# 图片 -> Word(同时输出 .docx,便于编辑;docx 由本工具用 python-docx 封装生成,保证可用)
PY scripts/converter.py ocr --input 文档.jpg --output 结果 --langs chi_sim+eng --docx
> 实测:对清晰印刷体中文(渲染/扫描高对比文字)识别准确,逐字命中;--docx 生成的 Word 经校验文字正确。
> 质量边界(重要):本地 Tesseract 擅长清晰印刷体文字;对手写、票证(发票/身份证/银行卡/营业执照/驾驶证)、多国语言混排、公式、低分辨率/倾斜扫描图,准确率明显下降。此类高精度需求建议走云 OCR。因此本 skill 的 ocr 仅定位为「清晰印刷体文字识别」,不替代专业票证/手写识别。
能力范围与边界(重要)
纯本地引擎(已验证):
- PDF 转图片 / 文本、图片转 PDF
- PDF 合并、分割、压缩、加密、解密
- 图片格式互转、PDF 提取图片
- PDF → Word/Excel/PPT(本地库实现,已验证中文保留)
- 图片编辑:改大小、裁剪、旋转、加水印(文字/图片)、改分辨率、拼图(横/纵/网格)
需 LibreOffice(已在本机安装):
- Word/Excel/PPT → PDF(版式保真最佳)
需 FFmpeg(已在本机安装):
- 视频互转、音频互转、视频转 GIF、视频合并、提取音频、视频变速(全部实测通过)
需 Tesseract(已在本机安装 + 中文包):
- OCR 图片转文字:限清晰印刷体(已实测中文逐字命中);不覆盖手写/票证/多国语言/公式(质量有限,建议云 OCR)
本 skill 未覆盖(需云端/额外引擎,暂不实现):
- 音视频转文字:需语音识别模型(Whisper 等),未集成
- 票证识别、万能识别(花卉/植物/动物/车牌/VIN)、手写/公式 OCR:本地 Tesseract 质量不达标,按"效果不佳就放弃"原则不纳入
- OFD 文件转换(本地库支持有限)
- 论文查重、AI 写作、翻译(非格式转换,且需联网服务)
使用原则
- 文件处理在本地完成,敏感文档不外传。
- 转换前先确认输入路径与输出路径,避免覆盖原文件(脚本默认输出到新文件/新目录)。
- 涉及系统级软件安装(如 LibreOffice)必须由用户确认后再操作。
反馈与建议入口(每次回答后必须呈现)
本 skill 在回答格式转换相关问题后,都会在结尾提供一个清晰可见、可交互的反馈入口(本地反馈表单)。它专门用于收集用户的意见、建议、问题反馈,不作为格式转换的任务入口 / 对话入口——用户要做文件转换,仍应在对话中直接说明。该入口会持续呈现,并对用户提交的反馈在下一次对话中确认收到,形成持续互动闭环。
工作方式
- 本地反馈后端:
scripts/feedback_server.js(仅 Node 内置模块,无需联网、无需 npm install),把反馈存到~/.workbuddy/feedback/quanneng-format-converter/feedback.json。 - 每次回答后,用
show_widget渲染一个可填写、可提交的反馈表单(HTML,POST 到本地服务);同时给出本地页面http://127.0.0.1:<port>/作为备用入口,并允许直接在对话框留言反馈(三重兜底,保证一定能提交)。
会话首次启动后端
# 设置本 skill 专属数据目录,后台启动反馈服务
FEEDBACK_DATA_DIR="$HOME/.workbuddy/feedback/quanneng-format-converter" node <skill_dir>/scripts/feedback_server.js
以后台方式运行(run_in_background)。启动后读取实际端口(默认 8777,冲突自动 +1):
node <skill_dir>/scripts/feedback_cli.js port
若返回端口即已运行;若连接失败再启动。后续 <port> 一律以此读到的为准。
> <skill_dir> 为本 skill 目录(即本 SKILL.md 同级 scripts/ 的父目录)。
每次回答的固定收尾(闭环)
- 先回执上一轮反馈(闭环回执):查询未确认反馈并确认收到
bash node <skill_dir>/scripts/feedback_cli.js pending # 若有 items,逐条在回复中确认,例如「✅ 收到您上一条反馈(建议):…… 谢谢,已记录。」然后标记已读: node <skill_dir>/scripts/feedback_cli.js ack <id1> <id2> ...
若无 pending 则跳过。 - 回答用户的格式转换问题(主体任务)。
- 呈现反馈入口:用
show_widget渲染反馈表单,把端口填入提交地址http://127.0.0.1:<port>/api/feedback。表单含:类型(意见/建议/问题反馈/其他)、内容框、提交按钮(提交后显示「已收到,感谢您的反馈 (#id)」)、已收集条数提示。文字中明确说明:
- 此入口仅用于反馈 / 建议 / 问题反馈,不是转换任务的对话入口;
- 也可打开本地页面http://127.0.0.1:<port>/填写;
- 也可直接在对话框留言反馈,Agent 同样记录。
对话框直接留言反馈的处理
若用户以文字提交反馈(非表单),识别后写入后端(type 可取 意见/建议/问题反馈/其他):
curl -s -X POST http://127.0.0.1:<port>/api/feedback -H "Content-Type: application/json" -d "{\"type\":\"建议\",\"content\":\"<用户原话>\"}"
并即时确认收到,照常呈现反馈入口。
查看 / 导出反馈(按需)
node <skill_dir>/scripts/feedback_cli.js list 100 # 最近 100 条
node <skill_dir>/scripts/feedback_cli.js stats # 总数 / 未确认数
数据文件:~/.workbuddy/feedback/quanneng-format-converter/feedback.json(标准 JSON 数组,便于导出或分析)。
边界与注意
- 反馈服务只监听
127.0.0.1,数据存于本机,不外传,适合内部意见箱 / 满意度收集。 - 仅依赖 Node 内置模块,无需
npm install;迁移到新机器直接复制scripts/即可。 - 反馈表单明确标注「非对话入口」,避免与格式转换任务混淆。
- 不要删除
~/.workbuddy/feedback/目录,否则历史反馈会丢失。