dsh-pptx-anim:为 python-pptx 生成的 PPT 批量注入进入动画与切换

前言

在 DSH 工作流里用代码生成演示文稿时,常见路径是 Python 的 python-pptx:排版、占位、导出 .pptx 都能做,但库本身不实现 OOXML 里的 <p:timing>,多数「程序化出片」方案只能得到静态页,放映时没有按元素顺序的进入动画,也没有幻灯片切换。若要在不改手工点 PowerPoint 的前提下补这一层,需要在生成后往文件里写入合法的时间轴树。下面介绍社区插件 dsh-pptx-anim(维护者 ZSX-114514,分类:工作流),它通过 DSH 工具调用 Python 脚本直接写 OOXML,动画数据落在文件内,目标机器不必安装 PowerPoint 或 WPS。

这是什么

dsh-pptx-anim 是给 .pptx 批量注入真正的 PowerPoint 进入动画与幻灯片切换的 DSH 插件,用来补上 python-pptx 没有动画 API 的缺口。Host 半在 Node.js 侧注册工具并探测 Python,实际改包逻辑在 scripts/pptx_anim.py(读 pptx、按预设生成 <p:timing> 树、写出新文件);结构校验在 scripts/validate.py(解 zip 检查 slide XML)。许可证为 MIT(package.json 版本 0.1.0)。

核心功能

插件暴露三个工具,职责如下。

工具 作用
pptx_animate 给 pptx 注入进入动画 + 页面切换(不修改源文件)
pptx_anim_validate 结构校验:元素顺序、空条件列表、动画目标是否指向真实形状
pptx_anim_env 探测哪个 Python 能 import pptx

动画效果限定为较稳的 animEffect 型(淡出、擦除、盒状、圆形、菱形、十字等单节点编码)。不做 Morph、运动路径(animMotion)、触发器链、按段落逐条动画;一页动画节点超过 25 个可能导致放映卡顿,文档建议拆页。

预设 preset 包括 auto(默认,按页构成判定)、title、proposition、image、cards、data、none(只加切换、不加进入动画)等;可配合 transition(例如 fade)使用。生成 deck 时若给形状命名 s01、s02……按阅读顺序,播放顺序按序号;未命名则按 z-order。

README 记载的验证情况(2026-10-29,Windows 11 + DSH 0.2.1):15 页一次性注入 193 个 animEffect 节点与全页切换;修正了 transition 须排在 timing 之前、stCondLst 不能为空等会导致 PowerPoint「需要修复」的问题;注入后文件可在 LibreOffice 正常打开。未验证 PowerPoint / WPS 实机播放(开发环境为 ONLYOFFICE);交付时建议保留无动画版,首次放映前用 F5 预览。

依赖

  • Node.js ≥ 20(DSH 自带即可满足插件 engines)
  • Python 3 且能 import pptx(pip install python-pptx)。工具会在 python / python3 / py 间自动探测;失败时可传工具参数 python 指定绝对路径,或设置环境变量 DSH_PPTX_ANIM_PYTHON。找不到解释器时会明确报错并列出尝试过的解释器,不会静默失败。

安装与启用

插件以当前 DSH 进程权限运行;安装前请自行查看仓库源码与 MIT 许可证。社区目录页:https://www.skillhub.cn/plugins/ZSX-114514/dsh-pptx-anim;源码:https://github.com/ZSX-114514/dsh-pptx-anim。

方式 A:本地挂载(自用 / 开发)

  1. 将本仓库复制到 DSH profile 的 plugins/ 下,例如:
   ~/.dsh/profiles/<profile>/plugins/dsh-pptx-anim/
  1. 在该 profile 的 cordis.patch.yml 末尾追加:
   - insert:
       - id: pptx-anim
         name: ./plugins/dsh-pptx-anim/lib/index.js
  1. 重启 DSH(Host 半改动必须重启),用 pptx_anim_env 或工具列表确认 pptx_animate 已加载。

方式 B:作为 bundle 安装

仓库自带 cordis.patch.yml(dsh.bundle.patch),安装后会自动挂载:

dsh plugin --profile <profile> add dsh-pptx-anim          # 从 npm
dsh plugin --profile <profile> add file:<本地目录或 tgz>   # 从本地

以本地目录安装时,包目录为符号链接;本插件仅 Host 半,符号链接不影响加载。

安装后自检

pptx_anim_env({})                                  → 应返回一个可用的 Python
pptx_animate({ input: "<任一 .pptx 的绝对路径>" })   → 生成 <原名>_anim.pptx
pptx_anim_validate({ input: "<原名>_anim.pptx" })    → 应显示「结构校验通过」

典型用法

基本调用:指定输入路径,输出为同目录下 <原名>_anim.pptx,并返回每页动画节点数。

pptx_animate({ input: "C:/x/deck.pptx" })
  → 生成 C:/x/deck_anim.pptx,返回每页动画节点数

pptx_anim_validate({ input: "C:/x/deck_anim.pptx" })
  → 结构校验通过 / 列出问题

指定预设与切换效果示例:

pptx_animate({ input: "...", preset: "cards", transition: "fade" })

若用 python-pptx 生成内容并希望控制播放顺序,可在写形状时命名:

shape = slide.shapes.add_textbox(...)
shape.name = 's01'

适用场景与注意

适合已经用 python-pptx(或等价流程)产出静态 .pptx、希望在 agent 工作流里一步生成带进入动画与切换的新文件的场景;与 DSH「一切皆插件」的生态一致——能力通过工具暴露,由智能体或脚本编排调用。

使用时注意:源文件不会被原地覆盖;结构上不把手写 p:timing 插在 p:transition 之前(插件已按正确顺序生成)。SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系,安装来源以 README 与仓库为准。

结尾

dsh-pptx-anim 把「静态 programmatic deck」和「文件内嵌的真实 timing/transition」连在一起,并附带校验与环境探测,便于在自动化流水线里复现。目录页:https://www.skillhub.cn/plugins/ZSX-114514/dsh-pptx-anim;GitHub:https://github.com/ZSX-114514/dsh-pptx-anim。

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

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

Xiaoye