
Onyx PPTX Skill 实战基于模板的演示文稿编辑工作流与源码级解析【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer本文围绕 Onyx 内置的 PPTX 技能backend/onyx/skills/builtin/pptx/展开完整讲解解包 → 操纵幻灯片 → 编辑内容 → 清理 → 重新打包的模板编辑流水线。你将掌握如何在不破坏模板设计的前提下填充用户内容、如何安全地增删与重排幻灯片、如何使用内置脚本与 QA 工具保证产出可用并了解每个关键脚本的底层实现原理。内容覆盖 editing.md 的全部要点并辅以源码级佐证。适用场景与核心约定该技能面向所有涉及.pptx的任务读取解析、基于模板编辑、从零创建、合并拆分等。当用户提及deckslidespresentation或某个.pptx文件名时都应触发本技能见 SKILL.md。使用前必须遵守三条路径约定所有命令都从session workspace工作目录运行永远不要cd进入技能目录所有技能脚本统一以.opencode/skills/pptx/前缀调用所有生成文件解包目录、输出演示文稿、缩略图、PDF、图片统一放在outputs/下。此外还有一条构建顺序铁律在开始任何素材增强图表、图标之前outputs/里必须已存在一份文字可读、结构完整的 pptx。最坏的结果不是缺少图表而是整个回合结束时连一份可看的 deck 都没有。因此模板编辑路径要求尽早完成第一次 clean pack——滞留在outputs/unpacked/里的编辑等于什么都没交付。模板编辑工作流7 步当用户提供了既有演示文稿作为模板时按以下 7 步执行。第 1 步分析既有幻灯片python .opencode/skills/pptx/scripts/thumbnail.py template.pptx outputs/thumbnails python -m markitdown template.pptxthumbnail.py生成缩略图网格outputs/thumbnails.jpg用于快速查看版式markitdownpip install markitdown[pptx]输出纯文本内容用于查看占位文本。从源码看thumbnail.pybackend/onyx/skills/builtin/pptx/scripts/thumbnail.py内部通过soffice --headless --convert-to pdf将 pptx 转 PDF再用pdftoppm -jpeg -r 100逐页转图最后用 Pillow 拼成带文件名的网格默认 3 列、单网格最多cols * (cols 1)张3 列即 12 张超过则自动生成thumbnails-1.jpg、thumbnails-2.jpg。隐藏幻灯片presentation.xml中p:sldId show0会以灰色对角线占位图标注(hidden)避免遗漏。第 2 步规划幻灯片映射为每个内容板块选择一张模板幻灯片。文档明确警告必须使用多样化的版式单调的标题 项目符号是常见的失败模式。应主动寻找多栏版式2 栏、3 栏图片 文字组合通栏大图叠加文字引用 / 强调块quote/callout章节分隔页数据大数字stat/number callout图标网格或图标 文字行避免所有幻灯片重复同一种重文字版式并让内容类型与版式匹配要点 → 项目符号页团队信息 → 多栏客户评价 → 引用页。第 3 步解包unpackpython .opencode/skills/pptx/scripts/office/unpack.py template.pptx outputs/unpacked/unpack.pybackend/onyx/skills/builtin/pptx/scripts/office/unpack.py做的事情包括解压 ZIP、用defusedxml.minidom对所有.xml/.rels做 pretty-print 缩进、将智能引号转义为 XML 实体“→#x201C;等。它同时支持.docx/.pptx/.xlsx其中 DOCX 额外提供--merge-runs合并格式相同的相邻 run默认 true和--simplify-redlines合并同一作者的相邻修订默认 true两个开关对 PPTX 默认直接解包 美化 引号转义。第 4 步构建演示文稿结构先行这一步必须由你自己完成不要交给子代理因为结构操作是后续一切编辑的前提删除不需要的幻灯片从p:sldIdLst移除对应p:sldId复制要复用的幻灯片使用add_slide.py重排幻灯片调整p:sldIdLst中p:sldId的顺序在进入第 5 步之前完成所有结构变更。幻灯片顺序定义在outputs/unpacked/ppt/presentation.xml的p:sldIdLst中可用版式列表通过ls outputs/unpacked/ppt/slideLayouts/查看。第 5 步首次打包尽早执行结构定型、第一版内容就位后立刻清理并打包让可预览的 deck 先存在python .opencode/skills/pptx/scripts/clean.py outputs/unpacked/ python .opencode/skills/pptx/scripts/office/pack.py outputs/unpacked/ outputs/output.pptx --original template.pptx这背后的逻辑在 SKILL.md 的 Build Order 一节先保证完整可用的 deck再逐轮增强。在首次 pack 之前不要做细粒度美化。第 6 步精炼内容逐页更新slide{N}.xml中的文本。建议在此步骤使用子代理每张幻灯片是独立的 XML 文件天然适合并行编辑。给子代理的提示词必须包含要编辑的幻灯片文件路径、明确要求Use the Edit tool for all changes、以及本文下面列出的格式规则与常见陷阱。第 7 步每批编辑后重新 clean pack每完成一批编辑就重新执行第 5 步的命令确保outputs/中的打包产物始终反映最新良好状态。内置脚本速查脚本用途unpack.py解包并美化打印 PPTXadd_slide.py复制幻灯片或从版式新建clean.py清理孤儿文件pack.py校验后重新打包thumbnail.py生成幻灯片视觉网格unpack.pypython .opencode/skills/pptx/scripts/office/unpack.py input.pptx outputs/unpacked/解压 PPTX、美化 XML、转义智能引号。注意实现中使用defusedxml.minidom而非标准库xml.etree.ElementTree——后者会破坏命名空间详见文末其他陷阱。add_slide.pypython .opencode/skills/pptx/scripts/add_slide.py outputs/unpacked/ slide2.xml # 复制幻灯片 python .opencode/skills/pptx/scripts/add_slide.py outputs/unpacked/ slideLayout2.xml # 从版式新建脚本会打印一个p:sldId元素供你插入p:sldIdLst的期望位置。从源码backend/onyx/skills/builtin/pptx/scripts/add_slide.py看它自动处理了手工复制极易遗漏的四件事自动编号扫描ppt/slides/slide*.xml取最大编号 1 作为新幻灯片名复制幻灯片时同步复制.rels并删除其中的notesSlide关系避免复制的备注引用指向错误的备注页注册[Content_Types].xml新增Override PartName/ppt/slides/slideN.xml .../注册ppt/_rels/presentation.xml.rels新增Relationship并分配下一个rId。因此文档强调永远不要手工复制幻灯片文件。同时create_slide_from_layout路径会从slideLayout*.xml生成一个最小骨架幻灯片空spTree 指向该版式的关系版式自身的占位符会由渲染时继承。clean.pypython .opencode/skills/pptx/scripts/clean.py outputs/unpacked/移除所有不在p:sldIdLst中的幻灯片及其关系、未引用的媒体/嵌入/图表/图表关系/绘图/墨迹文件、未引用的主题文件、未引用的备注页以及已删除文件的 Content-Type override。源码backend/onyx/skills/builtin/pptx/scripts/clean.py采用引用可达性算法先解析presentation.xml.rels与p:sldIdLst得到被引用的幻灯片集合再递归扫描全部.rels收集所有被引用资源随后以迭代清理方式删除孤儿资源删除会暴露新的孤儿while True循环直到无可删最后同步清理[Content_Types].xml中失效的 Override。pack.pypython .opencode/skills/pptx/scripts/office/pack.py outputs/unpacked/ outputs/output.pptx --original input.pptx校验、自动修复、压缩 XML、重新编码智能引号。源码backend/onyx/skills/builtin/pptx/scripts/office/pack.py要点提供--original时PPTX 会走PPTXSchemaValidator见 validators/pptx.py基于schemas/下的 ISO-IEC29500-4 2016 与 OPC XSD 校验支持自动修复DOCX 还会附加RedliningValidator修订作者推断。校验失败则打包中止打包在临时目录中对副本执行不改动解包目录_condense_xml会移除 XML 中的空白文本节点与注释保留a:t文本节点内容使产物紧凑用ZIP_DEFLATED压缩写入输出文件。可用--validate false跳过校验。thumbnail.pypython .opencode/skills/pptx/scripts/thumbnail.py input.pptx outputs/thumbnails [--cols N]生成outputs/thumbnails.jpg以幻灯片文件名作为标签。默认 3 列、单网格最多 12 张--cols最大 6。文档特别提醒thumbnail 仅用于模板版式分析选择版式视觉 QA 应改用sofficepdftoppm生成全分辨率单页图片见 SKILL.md 的 Converting to Images 一节python .opencode/skills/pptx/scripts/office/soffice.py --headless --convert-to pdf outputs/output.pptx pdftoppm -jpeg -r 150 outputs/output.pdf outputs/slide修复后可只重渲特定页pdftoppm -jpeg -r 150 -f N -l N outputs/output.pdf outputs/slide-fixed顺带一提soffice.pybackend/onyx/skills/builtin/pptx/scripts/office/soffice.py是一个贴心的沙箱适配层运行时探测 AF_UNIX socket 是否被禁用沙箱 VM 常见若禁用则自动编译一个LD_PRELOADshim用socketpair模拟被拦截的 socket 调用保证 LibreOffice 在受限环境中也能无头转换。幻灯片级操作重排调整outputs/unpacked/ppt/presentation.xml中p:sldIdLst内p:sldId的先后顺序即可删除移除对应的p:sldId然后运行clean.py清掉孤儿文件查看可用版式ls outputs/unpacked/ppt/slideLayouts/新增使用add_slide.py见上。内容编辑子代理策略若可用在第 4 步完成后使用子代理并行编辑各slide{N}.xml。给子代理的提示词需包含幻灯片文件路径、Use the Edit tool for all changes、以及下述格式规则与常见陷阱。对每张幻灯片读取该幻灯片 XML识别所有占位内容——文本、图片、图表、图标、题注将每个占位替换为最终内容图表占位按 charts.md 生成 deck 风格的 PNG图标占位用.opencode/skills/pptx/scripts/icon.js渲染 PNG见 pptxgenjs.md 的 Icons 一节以占位符原始尺寸作为幻灯片媒体插入。必须使用 Edit tool而不是 sed 或 Python 脚本——Edit tool 强制你精确指定替换位置与内容可靠性更高。格式规则标题、副标题、行内标签一律加粗在a:rPr上设置b1。包括幻灯片标题、页内小节标题以及行首的行内标签如 Status:、Description:绝不使用 Unicode 项目符号•改用a:buChar或a:buAutoNum列表格式项目符号一致性让项目符号继承自版式只在需要时指定a:buChar或a:buNone。常见陷阱模板适配当源内容比模板项数少时整组移除多余元素图片、形状、文本框不要只清空文字清空文本后检查是否有残留的孤立视觉元素用视觉 QA 捕捉数量不匹配。示例模板有 4 个团队成员但源数据只有 3 人应删除第 4 人的整个组图片 文本框而不是只删文本。当替换内容的长度与原文不同时更短的内容通常安全更长的内容可能溢出或意外换行改后必须视觉 QA必要时截断或拆分内容以适配模板的设计约束。多项目内容若源数据有多个条目编号列表、多个小节必须为每条创建独立的a:p段落绝不要拼接成一个字符串❌ 错误——所有条目塞进一个段落a:p a:ra:rPr .../a:tStep 1: Do the first thing. Step 2: Do the second thing./a:t/a:r /a:p✅ 正确——独立段落 加粗标题a:p a:pPr algnla:lnSpca:spcPts val3919//a:lnSpc/a:pPr a:ra:rPr langen-US sz2799 b1 .../a:tStep 1/a:t/a:r /a:p a:p a:pPr algnla:lnSpca:spcPts val3919//a:lnSpc/a:pPr a:ra:rPr langen-US sz2799 .../a:tDo the first thing./a:t/a:r /a:p a:p a:pPr algnla:lnSpca:spcPts val3919//a:lnSpc/a:pPr a:ra:rPr langen-US sz2799 b1 .../a:tStep 2/a:t/a:r /a:p !-- 依此类推 --复制原段落的a:pPr以保留行距标题使用b1。智能引号解包/打包会自动处理引号转义见unpack.py的SMART_QUOTE_REPLACEMENTS与pack.py的重新编码。但 Edit tool 会把智能引号转回 ASCII。新增含引号的文本时必须使用 XML 实体a:tthe #x201C;Agreement#x201D;/a:t字符名称UnicodeXML 实体“左双引号U201C#x201C;”右双引号U201D#x201D;‘左单引号U2018#x2018;’右单引号U2019#x2019;其他空白a:t含首尾空格时使用xml:spacepreserveXML 解析使用defusedxml.minidom不要用xml.etree.ElementTree会破坏命名空间。模板保真设计不可破坏文档与 SKILL.md 反复强调一条原则模板编辑的职责是填充内容不是重新设计。保持模板的字体、配色、版式语言原样不动不要替换字体模板常嵌入系统未安装的字体检查ppt/fonts/它们按原样即可正确渲染换成已安装字体反而破坏观感。clean.py/pack.py会保留嵌入字体ppt/fonts/使其在编辑周期中存活见 SKILL.md 的 Typography 一节新添加的文本应复用该幻灯片已有的字体。注意SKILL.md 中从零构建时的字体白名单Inter、Montserrat、Lato、EB Garamond、Fira Code 等不适用于模板编辑路径——编辑模板时继续使用模板自带字体即可。质量保障打包之前先 QA完整的 QA 流程详见 SKILL.md分三层其中前两层与模板编辑强相关1. 布局 lint先跑python .opencode/skills/pptx/scripts/lint.py outputs/output.pptxlint.py 用确定性规则静态检查机械性缺陷越界形状BOUNDS、边距不足MARGIN标准 0.5、文本溢出OVERFLOW、文本框重叠OVERLAP、低对比度显式颜色CONTRAST、未知字体FONT。退出码非 0 表示存在 ERRORLINT_CLEAN表示无发现。每个 ERROR 都必须修复WARN 除非确属有意设计也要处理。内容密集的分析型 deck 可用--profile dense边距阈值从 0.5 放宽到 0.25减少误报。2. 内容 QApython -m markitdown output.pptx检查缺内容、错别字、顺序错误模板场景下还要 grep 残留占位文本python -m markitdown output.pptx | grep -iE xxxx|lorem|ipsum|this.*(page|slide).*layout3. 视觉 QA可用子代理用sofficepdftoppm渲染后逐页检查与验证循环改一处往往引入新问题必须 lint → 修 → 再 lint → 渲染检查直到 lint 干净且视觉通过。未完成至少一轮修复并验证前不要宣布成功。扩展阅读完整技能说明与构建顺序SKILL.md从零创建演示文稿的布局库components.md 与 pptxgenjs.md含icon.js图标渲染node .opencode/skills/pptx/scripts/icon.js name --color hex支持 lucide/tabler 两套图标集真实数据图表deck 风格 matplotlib PNGcharts.md配套脚本 chart.py文档编辑技能DOCX 路径共享同一套 unpack/pack 基建backend/onyx/skills/builtin/docx/editing.md若存在依赖清单pip install markitdown[pptx]、Pillow、pptxgenjs、LibreOfficesoffice、Popplerpdftoppm详见 SKILL.md 的 Dependencies 一节。【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考