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。

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

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

小夜