前言¶
在 DeepSeek Harness(DSH)里生成演示文稿,有两种典型做法:一种是用纯 JS 的 PPTX 写入器,另一种是调用本机安装的 LibreOffice(Impress)通过 UNO 驱动。前者依赖对方渲染器,后者则走 Impress 自身的导出过滤器。
dsh-lo-office 插件属于后一种:它通过 UNO 打开一份真实的 Impress 文档,在上面画形状,再由 LibreOffice 导出 PPTX / ODP / PDF 或逐页 PNG。最终产物和你在桌面端「另存为」得到的是同一种文件,字体、表格、母版、备注页等细节都由 Impress 处理,不会出现纯 JS 写入器常见的格式偏差。
插件仓库为 pawpress/office-ppt,npm 包名 dsh-lo-office,当前版本 v0.2.0。它包含五个命令行工具和一个设置面板,用于探测、构建、渲染、转换和配置。
插件定位¶
- 名称:dsh-lo-office(插件 id 同)
- 维护者:pawpress
- 分类:模型推理
- 星标:3
- 简介:dsh-plugin libreoffice uno pptx deepseek-harness powerpoint presentation
- 核心价值:通过 UNO 驱动本机 LibreOffice 生成真实 Impress 文档,再用 Impress 自身导出多种格式。
核心能力¶
插件提供五个工具,分别对应不同的阶段:
lo_probe:探测本机 LibreOffice 的可用性。返回 soffice 路径、版本、自带 Python 版本、uno模块是否可用,并真的打开一份无头 Impress 文档进行验证。lo_build:根据标题和结构化 slides,调用 LibreOffice 打开 Impress 文档、绘制形状,并导出为 PPTX(可选 ODP、PDF、逐页 PNG)。lo_render:将已有的 PPTX / PPT / ODP 渲染为 PDF 和/或逐页 PNG,用于快速验收。lo_convert:走 soffice 的转换过滤器,实现任意格式互转(docx / xlsx / pptx / odt / ods / odp / pdf 等)。lo_config:用于临时调整配置项,写入cordis.patch.yml,供斜杠命令与工具共用。
插件还提供常驻进程管理:keepWarm 打开时,会保持一个 Python 桥和一个无头 soffice 进程,通过串行队列处理请求;空闲超过 idleMs 自动回收;进程崩溃下次调用自动重起。
自动排版¶
autoFit(默认 shrink)解决文本框高度不足的问题。它不估算字宽,而是让 LibreOffice 自己排版:将文本框的 TextAutoGrowHeight 打开、宽度固定、高度设成极小值,再读取 shape.Size.Height,得到实际所需高度。放不下则二分法缩小字号,直到塞进或触到 minFontSize。
每次 lo_build 的结果里包含 autoFit / fitAdjusted / fitOverflow 三个字段,会报告调整处数和是否溢出。
安装与启用¶
插件安装不需要发行版(Release),只需 git 仓库 + 可选的 tag。推荐使用插件管理器:
github:pawpress/office-ppt#v0.2.0
装完后可在日志中确认:
Select-String -Path "$env:APPDATA\DSH Desktop\logs\host\dsh-*.log" -Pattern 'dsh-lo-office' | Select-Object -Last 3
期望看到类似「已注册 5 个工具(…)、2 个斜杠命令」的输出。
斜杠命令¶
在 DSH 桌面端输入框敲 / 即可使用两条斜杠命令(不经过模型,不消耗 token):
/ppt-config:查看当前配置/ppt-config theme=swiss:修改一项/ppt-config theme=swiss autoFit=off pngWidth=2000:修改多项/ppt-config formats=pptx,pdf:数组用逗号/ppt-config footer="由 LibreOffice 生成":带空格的值用引号/ppt-config reset:恢复出厂/ppt-status:探测 LibreOffice 是否可用
配置写入 cordis.patch.yml,重启 Desktop 后生效;要当场生效可以用 lo_config 工具。
可配置项(来自 README)¶
| 字段 | 默认 | 说明 |
|---|---|---|
soffice |
空(自动探测) | soffice.exe 完整路径 |
python |
空(用自带的) | 带 uno 模块的 python |
theme |
light |
light / dark / slate / warm / swiss / atelier / noir |
ratio |
16:9 |
16:9 / 4:3 |
formats |
pptx,pdf,png |
默认导出格式,可加 odp |
pngWidth |
1600 |
逐页 PNG 宽度(320–3840) |
footer |
office-ppt · 由本机 LibreOffice 生成 |
页脚文字,空字符串=不画 |
pageNumbers |
true |
是否显示页码 |
autoFit |
shrink |
自动排版:shrink 缩字号 / off 不干预 |
minFontSize |
12 |
自动排版最小字号(6–72) |
timeoutMs |
240000 |
单次调用超时 |
keepWarm |
true |
复用常驻 soffice |
idleMs |
60000 |
常驻进程空闲回收(毫秒) |
任何字段都能被单次工具调用的同名参数覆盖,配置里的值只是默认值。
典型用法¶
- 先探测 LibreOffice 是否可用:
/ppt-status
- 构建一份演示文稿(示例 JSON):
{
"title": "季度回顾",
"theme": "swiss",
"slides": [
{
"layout": "cover",
"kicker": "Q3 REVIEW",
"title": "季度回顾",
"subtitle": "增长、成本与下一步"
},
{
"layout": "bullets",
"title": "三件事",
"bullets": ["留存提升", "成本下降", "新渠道跑通"]
},
{
"layout": "table",
"title": "指标",
"rows": [["指标", "本季"], ["留存", "72%"], ["成本", "-18%"]]
},
{
"layout": "quote",
"text": "把复杂留给自己。",
"subtitle": "设计原则"
}
]
}
- 将结果渲染为 PDF 与逐页 PNG 进行验收:
lo_render source=<输出目录>/季度回顾.pptx formats=pdf,png outputDir=<输出目录> pngWidth=2000
适用场景与注意¶
- 本机需要安装 LibreOffice(Community 版即可),已在 26.8.1.1 上验证;
lo_probe会返回实测结果。 - 插件会自己查找
soffice:Windows 先查注册表HKLM\SOFTWARE\LibreOffice\UNO\InstallPath(含 WOW6432Node),再查常见安装路径,最后看环境变量DSH_LO_SOFFICE/LO_SOFFICE。 - Python 使用 LibreOffice 自带的
<安装目录>/program/python.exe(带uno模块),Linux 上会退回python3,需要python3-uno。 - 插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证。
- 修改配置一律用编辑器或
Set-Content等方式写入,避免 PowerShell 的 UTF-8 BOM 导致 YAML 解析失败。
结尾¶
dsh-lo-office 适合需要在 DSH 里生成「LibreOffice 能直接打开」的演示文稿的场景。它通过 UNO 驱动真实的 Impress,保证格式保真,并利用 Impress 自身的导出过滤器输出多种格式。安装只需一行仓库 tag,即可在 DSH 中使用。
目录页:https://www.skillhub.cn/plugins/pawpress/office-ppt
GitHub:https://github.com/pawpress/office-ppt