dsh-lo-office:用本机 LibreOffice 真实渲染 PPT

前言

在 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 常驻进程空闲回收(毫秒)

任何字段都能被单次工具调用的同名参数覆盖,配置里的值只是默认值。

典型用法

  1. 先探测 LibreOffice 是否可用:
/ppt-status
  1. 构建一份演示文稿(示例 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": "设计原则"
    }
  ]
}
  1. 将结果渲染为 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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜