拓冰建站拓冰建站
首页 / 资讯中心 / 正文

用 PptxGenJS 从零构建专业 PPTX:Onyx PPTX Skill 实战指南

用 PptxGenJS 从零构建专业 PPTXOnyx PPTX Skill 实战指南【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer导读本文是 danswer 仓库 中 PPTX 生成技能的底层引擎教程围绕 PptxGenJS 这一 JavaScript 库系统讲解如何通过代码从零创建幻灯片——涵盖版式尺寸、文本排版、形状、图片、图标、表格、图表、母版等全部核心能力并完整收录本技能在长期实践中沉淀的坑点清单文件损坏、视觉错乱等高频故障。读完本文你将能独立编写出可运行、可复用、能通过 lint.py 布局质检的演示文稿脚本并理解图标渲染icon.js与图表美化chart.py等配套工具的底层原理。一、定位与前提本教程在技能体系中的角色在 Onyx 的 PPTX Skill 中创建演示文稿有两条路径默认路径使用 components.md 描述的组件库components.js——每个组件是经过测试的版式函数固定 0.5 边距、内置字体规范与防溢出保护原生路径当组件库无法覆盖某个版式时退回本文档讲解的PptxGenJS 原生 API手工排布形状与文本。从 SKILL.md 可以看到技能约定所有命令都在会话工作区执行不要cd进技能目录技能脚本统一以.opencode/skills/pptx/为前缀生成文件一律写入outputs/。在仓库中这些脚本的物理位置是backend/onyx/skills/builtin/pptx/。依赖方面pptxgenjs已作为全局 npm 包预装进沙箱镜像无需也不应自行安装——components.js 中的加载逻辑会从全局 npm 根目录解析它。构建顺序硬性要求必须先产出一份文本完整可用的 PPTX落盘到outputs/再做图表、图标等美化增强最后运行lint.py做 QA。任何一步时间不够都应停止增强、保住已保存的成品。二、环境搭建与基础结构安装依赖并创建第一个演示文稿npm install -g pptxgenjs基础代码骨架const pptxgen require(pptxgenjs); let pres new pptxgen(); pres.layout LAYOUT_16x9; // 或 LAYOUT_16x10、LAYOUT_4x3、LAYOUT_WIDE pres.author Your Name; pres.title Presentation Title; let slide pres.addSlide(); slide.addText(Hello World!, { x: 0.5, y: 0.5, fontSize: 36, color: 363636 }); pres.writeFile({ fileName: Presentation.pptx });要点说明pres.layout在创建任何幻灯片之前设置决定整份画布的物理尺寸见下节pres.author/pres.title写入文档元数据属性pres.writeFile({ fileName })支持同步返回 Promise也可用await等待写出完成在技能体系内输出文件务必写到outputs/名称.pptx例如outputs/deck.pptx。关于实例复用每份演示文稿必须使用全新的pptxgen()实例绝不要跨文件复用同一实例详见「常见陷阱」第 6 条。三、版式尺寸Layout Dimensions坐标系统以英寸为单位四种内置版式如下LAYOUT_WIDE即 16:9 加宽版版式常量宽 × 高英寸适用场景LAYOUT_16x910 × 5.625默认标准 16:9 投屏LAYOUT_16x1010 × 6.25较矮的宽屏LAYOUT_4x310 × 7.5传统 4:3 投影仪LAYOUT_WIDE13.3 × 7.5超宽屏内容密度更高设计建议来自 SKILL.md 的间距规范最小边距 0.5内容块之间留 0.3–0.5 间隙10 × 5.625 画布上半页图表约 4.5 × 3.2三分之二宽约 6 × 3.5见 charts.md。四、文本与排版Text Formatting4.1 基础文本slide.addText(Simple Text, { x: 1, y: 1, w: 8, h: 2, fontSize: 24, fontFace: Arial, color: 363636, bold: true, align: center, valign: middle });常用属性x/y/w/h英寸、fontSize、fontFace、color6 位十六进制、不带#、bold、alignleft/center/right、valigntop/middle/bottom。4.2 字符间距// ✅ 用 charSpacingletterSpacing 会被静默忽略 slide.addText(SPACED TEXT, { x: 1, y: 1, w: 8, h: 1, charSpacing: 6 });这是本技能实测得出的结论letterSpacing参数虽然不报错但不生效字距必须使用charSpacing。4.3 富文本数组Rich Textslide.addText([ { text: Bold , options: { bold: true } }, { text: Italic , options: { italic: true } } ], { x: 1, y: 3, w: 8, h: 1 });数组每个元素是{ text, options }options可携带任意单段文本属性实现同一文本框内不同样式混排。4.4 多行文本必须 breakLineslide.addText([ { text: Line 1, options: { breakLine: true } }, { text: Line 2, options: { breakLine: true } }, { text: Line 3 } // 最后一项无需 breakLine ], { x: 0.5, y: 0.5, w: 8, h: 2 });数组项之间若想换行必须在除最后一项外的每一项上加breakLine: true否则多段文本会被拼在同一行内。4.5 文本框内边距slide.addText(Title, { x: 0.5, y: 0.3, w: 9, h: 0.6, margin: 0 // 与形状/图标对齐时务必设为 0 });关键提示文本框默认有内部边距padding。当需要文本与同一 x 坐标上的形状、线条或图标精确对齐时必须显式设置margin: 0。这也是 SKILL.md 中「常见错误」列表明确提醒的一条——不要忘记文本框 padding对齐线条或形状与文字边缘时设置margin: 0或为形状补偿这段偏移。4.6 字体规范从零构建时SKILL.md 只允许使用沙箱中已安装的字体Inter、Montserrat、Lato、EB Garamond、Fira Code以及 Calibri、Cambria、Arial、Times New Roman 等度量兼容替代字体——其他字体名会被静默回退导致渲染错乱。同时给出了字号层级幻灯片标题 36–44pt 加粗、章节标题 20–24pt 加粗、正文 14–16pt、注释 10–12pt。这些字体白名单在 lint.py 的KNOWN_FONTS集合中有对应实现lint 时会逐一核对文本运行中的字体名并给出FONT警告。五、列表与项目符号Lists Bullets// ✅ 正确多项目符号 slide.addText([ { text: First item, options: { bullet: true, breakLine: true } }, { text: Second item, options: { bullet: true, breakLine: true } }, { text: Third item, options: { bullet: true } } ], { x: 0.5, y: 0.5, w: 8, h: 3 }); // ❌ 错误永远不要用 unicode 圆点符号 slide.addText(• First item, { ... }); // 会产生双重项目符号 // 子项与编号列表 { text: Sub-item, options: { bullet: true, indentLevel: 1 } } { text: First, options: { bullet: { type: number }, breakLine: true } }规则总结项目符号统一使用bullet: true禁止手写 • 等 Unicode 符号——PptxGenJS 会叠加生成自己的符号造成双圆点子级缩进用indentLevel: 1或更大层级编号列表用bullet: { type: number }配合breakLine: true使用见上节。六、形状Shapes6.1 基础形状slide.addShape(pres.shapes.RECTANGLE, { x: 0.5, y: 0.8, w: 1.5, h: 3.0, fill: { color: FF0000 }, line: { color: 000000, width: 2 } }); slide.addShape(pres.shapes.OVAL, { x: 4, y: 1, w: 2, h: 2, fill: { color: 0000FF } }); slide.addShape(pres.shapes.LINE, { x: 1, y: 3, w: 5, h: 0, line: { color: FF0000, width: 3, dashType: dash } });pres.shapes上暴露的形状类型至少包括RECTANGLE、OVAL、LINE、ROUNDED_RECTANGLE完整列表见文末「快速参考」。6.2 透明与圆角// 填充透明0-100 slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 2, fill: { color: 0088CC, transparency: 50 } }); // 圆角矩形rectRadius 只对 ROUNDED_RECTANGLE 生效 // ⚠️ 不要与矩形装饰条搭配使用——矩形条无法覆盖圆角 slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x: 1, y: 1, w: 3, h: 2, fill: { color: FFFFFF }, rectRadius: 0.1 });rectRadius单位为英寸仅对ROUNDED_RECTANGLE生效对普通RECTANGLE无效。若在圆角矩形左侧叠加一条细矩形作强调色带色带的直角会盖不住圆角轮廓——此时应改用普通RECTANGLE详见「常见陷阱」第 8 条。6.3 阴影slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 2, fill: { color: FFFFFF }, shadow: { type: outer, color: 000000, blur: 6, offset: 2, angle: 135, opacity: 0.15 } });阴影选项完整参数表实测自本技能文档属性类型取值范围说明typestringouter、inner外阴影 / 内阴影colorstring6 位十六进制如000000不带#前缀也不接受 8 位 hex否则损坏文件blurnumber0-100 pt模糊半径offsetnumber0-200 pt必须非负——负值会损坏文件anglenumber0-359 度阴影投射方向135 右下270 向上opacitynumber0.0-1.0透明度的唯一正确表达方式向上投影例如页脚横条上方应使用angle: 270 正offset严禁负 offset。渐变填充PptxGenJS 原生不支持渐变需要渐变背景时请用渐变图片代替。七、图片Images7.1 三种图片来源// 从文件路径 slide.addImage({ path: images/chart.png, x: 1, y: 1, w: 5, h: 3 }); // 从 URL slide.addImage({ path: https://example.com/image.jpg, x: 1, y: 1, w: 5, h: 3 }); // 从 base64更快无文件 I/O slide.addImage({ data: image/png;base64,iVBORw0KGgo..., x: 1, y: 1, w: 5, h: 3 });7.2 图片选项slide.addImage({ path: image.png, x: 1, y: 1, w: 5, h: 3, rotate: 45, // 0-359 度 rounding: true, // 圆形裁剪 transparency: 50, // 0-100 flipH: true, // 水平翻转 flipV: false, // 垂直翻转 altText: Description, // 无障碍描述 hyperlink: { url: https://example.com } });7.3 三种尺寸模式sizing// Contain - 等比缩放完整放入可能留白 { sizing: { type: contain, w: 4, h: 3 } } // Cover - 等比缩放填满区域可能裁切 { sizing: { type: cover, w: 4, h: 3 } } // Crop - 裁切特定区域 { sizing: { type: crop, x: 0.5, y: 0.5, w: 2, h: 2 } }7.4 按宽高比计算尺寸核心技巧const origWidth 1978, origHeight 923, maxHeight 3.0; const calcWidth maxHeight * (origWidth / origHeight); const centerX (10 - calcWidth) / 2; // 10 是 LAYOUT_16x9 的宽度 slide.addImage({ path: image.png, x: centerX, y: 1.2, w: calcWidth, h: maxHeight });先用原图宽高比推算目标宽度再以(画布宽 - 图片宽) / 2水平居中即可保证图片不变形且居中。7.5 支持格式标准PNG、JPG、GIF动图在 Microsoft 365 中可播放SVG可在新版 PowerPoint / Microsoft 365 中正常显示。八、图标Icons技能内置了图标渲染脚本 icon.js把 lucide / tabler 图标集的 SVG 栅格化成可着色的 PNG。依赖lucide-static、tabler/icons、sharp已预装进沙箱镜像无需任何安装步骤。8.1 渲染一个图标 PNGnode .opencode/skills/pptx/scripts/icon.js circle-check --color FFFFFF --size 512 -o outputs/icons/check.png参数说明参数说明icon-namekebab-case 图标文件名如circle-check、trending-up、shield-check--colorhex 颜色#可省略默认黑色。注意pptxgenjs 中使用的颜色仍须省略#--size栅格化分辨率 px默认 512——在任何幻灯片尺寸下都足够清晰显示大小由放置时的w/h英寸决定-o输出路径默认outputs/icons/icon-name.png--set lucide\|tabler限定只从一个图标集查找使用原则每个图标, 颜色组合只渲染一次到outputs/icons/之后在多个幻灯片间复用同一个 PNG。一份演示文稿只使用一个图标集默认优先 lucide——混用两套图标会因描边粗细与转角风格不同破坏视觉一致性。8.2 查找图标名先查后画图标名是主要故障点不确定时先搜索再渲染node .opencode/skills/pptx/scripts/icon.js --list shield # 两个图标集一起搜 node .opencode/skills/pptx/scripts/icon.js --list chart --set lucide # 限定某一图标集两个图标集lucide约 2,000 个简洁线性风格作为默认与tabler约 6,000 个线性 填充两种lucide 没有对应概念时使用。从 icon.js 源码看实现细节渲染路径先定位包目录lucide-static/icons、tabler/icons/icons/outline与filled再用sharp渲染。两个包导出的 SVG 原始尺寸均为 24×24脚本通过density (72 * size) / 24提高栅格化密度保证任意目标尺寸下都是矢量级清晰而非从 24px 放大icon.js--color通过把 SVG 中的currentColor替换为实际 hex 实现着色icon.js支持 3 位或 6 位 hex--list子命令在未命中时会基于编辑距离 子串匹配给出最多 8 个相近名称建议icon.js--size合法范围 16–2048 px超出会直接报错退出icon.js。8.3 常用图标速查lucide语义图标语义图标勾选 / 成功circle-check目标 / 靶心target增长 / 上升trending-up风险 / 警告triangle-alert下降 / 减少trending-down全球 / 市场globe团队 / 人群users指标 / 柱状图chart-column个人 / 客户user数据 / 存储database设置 / 流程settings文档 / 报告file-text安全 / 防护shield邮件 / 联系mail时间 / 速度clock创意 / 洞察lightbulb日程 / 日期calendar发布 / 启动rocket成本 / 营收dollar-sign能量 / 性能zap奖项 / 质量award搜索 / 发现search8.4 放到幻灯片上// 彩色圆底 图标图标颜色要与圆底形成对比 slide.addShape(pres.shapes.OVAL, { x: 0.5, y: 1.0, w: 0.6, h: 0.6, fill: { color: 1E2761 } }); slide.addImage({ path: outputs/icons/check.png, x: 0.62, y: 1.12, w: 0.36, h: 0.36 });这是 SKILL.md 推荐的经典图标 彩色圆底版式图标置于圆中时渲染与圆底对比强烈的颜色常用于图标行、特性列表等版式。九、幻灯片背景Slide Backgrounds// 纯色 slide.background { color: F1F1F1 }; // 带透明度的颜色 slide.background { color: FF3399, transparency: 50 }; // URL 图片 slide.background { path: https://example.com/bg.jpg }; // base64 图片 slide.background { data: image/png;base64,iVBORw0KGgo... };SKILL.md 建议采用三明治明暗结构标题页与结论页用深色背景、内容页用浅色或整份统一深色以营造高级感。十、表格Tablesslide.addTable([ [Header 1, Header 2], [Cell 1, Cell 2] ], { x: 1, y: 1, w: 8, h: 2, border: { pt: 1, color: 999999 }, fill: { color: F1F1F1 } }); // 进阶合并单元格 let tableData [ [{ text: Header, options: { fill: { color: 6699CC }, color: FFFFFF, bold: true } }, Cell], [{ text: Merged, options: { colspan: 2 } }] ]; slide.addTable(tableData, { x: 1, y: 3.5, w: 8, colW: [4, 4] });要点表格数据是二维数组单元格既可以是字符串也可以是{ text, options }对象以单独控制填充色、文字色、加粗等colspan实现横向合并colW按列指定宽度数组表格样式规范可参考 components.md 中tableSlide组件加粗表头、细线行分隔不推荐斑马纹约 8 行 × 5 列上限。十一、图表Charts11.1 原生图表// 柱状图 slide.addChart(pres.charts.BAR, [{ name: Sales, labels: [Q1, Q2, Q3, Q4], values: [4500, 5500, 6200, 7100] }], { x: 0.5, y: 0.6, w: 6, h: 3, barDir: col, showTitle: true, title: Quarterly Sales }); // 折线图 slide.addChart(pres.charts.LINE, [{ name: Temp, labels: [Jan, Feb, Mar], values: [32, 35, 42] }], { x: 0.5, y: 4, w: 6, h: 3, lineSize: 3, lineSmooth: true }); // 饼图 slide.addChart(pres.charts.PIE, [{ name: Share, labels: [A, B, Other], values: [35, 45, 20] }], { x: 7, y: 1, w: 5, h: 4, showPercent: true });注意数据真实性红线无论是原生图表还是 PNG 图表charts.md 明确要求只绘制真实数据——数据必须来自用户消息、附件、工作区文件或公司检索结果绝不虚构数字填图。只有一个数字时用大数字 标签的统计调用卡stat callout代替单柱图表。11.2 让图表更好看推荐样式集原生默认样式过时应用以下选项获得现代、干净的外观slide.addChart(pres.charts.BAR, chartData, { x: 0.5, y: 1, w: 9, h: 4, barDir: col, // 自定义配色贴合演示文稿主色板 chartColors: [0D9488, 14B8A6, 5EEAD4], // 干净背景 chartArea: { fill: { color: FFFFFF }, roundedCorners: true }, // 柔和的轴标签 catAxisLabelColor: 64748B, valAxisLabelColor: 64748B, // 极淡网格线仅数值轴 valGridLine: { color: E2E8F0, size: 0.5 }, catGridLine: { style: none }, // 柱顶数据标签 showValue: true, dataLabelPosition: outEnd, dataLabelColor: 1E293B, // 单序列隐藏图例 showLegend: false, });关键样式选项速查chartColors: [...]— 序列/扇区的 hex 颜色chartArea: { fill, border, roundedCorners }— 图表背景catGridLine/valGridLine: { color, style, size }— 网格线style: none隐藏lineSmooth: true— 折线平滑曲线legendPos: r— 图例位置b、t、l、r、tr。11.3 技能内的推荐姿势PNG 图表需要注意charts.md 给出的默认推荐不是原生addChart而是用 chart.py 以 matplotlib 渲染成 PNG 再addImage放置——因为原生图表样式控制力弱只有用户明确要求可编辑图表时才用addChart。chart.py 的核心用法先定英寸区域再按同一尺寸放置 PNGimport sys sys.path.insert(0, .opencode/skills/pptx/scripts) import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt from chart import deck_style, save_for_slide DECK_PALETTE [1E2761, CADCFC, F96167] # 演示文稿主色板主色在前 with deck_style(paletteDECK_PALETTE, fontMontserrat): fig, ax plt.subplots(layoutconstrained) ax.bar([Q1, Q2, Q3, Q4], [4500, 5500, 6200, 7100]) ax.set_title(Quarterly Sales) save_for_slide(fig, outputs/chart-sales.png, width_in6, height_in3.5)// pptxgenjs 放置尺寸与 save_for_slide 的 width_in/height_in 完全一致 slide.addImage({ path: outputs/chart-sales.png, x: 0.5, y: 1.2, w: 6, h: 3.5 });从源码看chart.py 的deck_style会一次性配置axes.prop_cycle按主色板循环上色、去掉上/右脊柱、仅保留 y 轴网格、统一字号与legend.frameon: False等chart.pysave_for_slide以200 DPI2 倍分辨率导出chart.py保证缩放后依然锐利。十二、幻灯片母版Slide Masterspres.defineSlideMaster({ title: TITLE_SLIDE, background: { color: 283A5E }, objects: [{ placeholder: { options: { name: title, type: title, x: 1, y: 2, w: 8, h: 2 } } }] }); let titleSlide pres.addSlide({ masterName: TITLE_SLIDE }); titleSlide.addText(My Title, { placeholder: title });母版机制把版式背景、占位符与内容解耦defineSlideMaster定义具名版式addSlide({ masterName })应用版式placeholder: title把文本填充进对应占位符。适合需要在多张幻灯片间复用的统一版式标题页、章节页、结尾页。十三、常见陷阱Common Pitfalls以下问题会导致文件损坏、视觉错乱或输出无效务必规避。1. 颜色永远不要带#前缀——会导致文件损坏color: FF0000 // ✅ 正确 color: #FF0000 // ❌ 错误2. 不要把透明度编码进 hex 颜色串——8 位 hex 会损坏文件请用opacity属性shadow: { type: outer, blur: 6, offset: 2, color: 00000020 } // ❌ 损坏文件 shadow: { type: outer, blur: 6, offset: 2, color: 000000, opacity: 0.12 } // ✅ 正确3. 用bullet: true——绝不用 • 等 Unicode 符号会产生双项目符号。4. 数组项或文本运行run之间用breakLine: true换行否则会被拼在同一行。5. 项目符号列表避免lineSpacing——会造成段落间距过大改用paraSpaceAfter。6. 每份演示文稿使用全新实例——不要复用pptxgen()对象。7. 绝不在多次调用间复用选项对象——PptxGenJS 会原地修改对象例如把阴影值就地转换为 EMU 单位。多个形状共享同一对象时第二次调用拿到的已是转换后的值导致第二个形状损坏const shadow { type: outer, blur: 6, offset: 2, color: 000000, opacity: 0.15 }; slide.addShape(pres.shapes.RECTANGLE, { shadow, ... }); // ❌ 第二次调用拿到已被转换的值 slide.addShape(pres.shapes.RECTANGLE, { shadow, ... }); const makeShadow () ({ type: outer, blur: 6, offset: 2, color: 000000, opacity: 0.15 }); slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... }); // ✅ 每次调用生成新对象 slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });8. 不要用ROUNDED_RECTANGLE搭配矩形强调条——矩形覆盖不了圆角改用RECTANGLE// ❌ 错误强调条盖不住圆角 slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: FFFFFF } }); slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: 0891B2 } }); // ✅ 正确全部用 RECTANGLE 保证对齐干净 slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: FFFFFF } }); slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: 0891B2 } });十四、质量保障与 lint.py 协同QA原生的 PptxGenJS 排布自由度大出错概率也高因此技能强制在交付前运行确定性布局检查器 lint.pypython .opencode/skills/pptx/scripts/lint.py outputs/output.pptx退出码 0 且输出LINT_CLEAN表示无问题非零表示存在 ERROR 级问题每个 ERROR 都必须修复WARN 逐条评估除非是刻意的设计重叠每修完一批立刻重跑秒级完成直至干净再进入渲染阶段。lint.py 的六类检查与 PptxGenJS 排布直接相关lint.py检查码含义与本文的关联BOUNDS形状部分/整体超出画布与x/y/w/h英寸坐标直接相关MARGIN文本距画布边缘小于 0.5--profile dense放宽到 0.25呼应 SKILL.md 的 0.5 最小边距规范OVERFLOW估计文本高度超出文本框PIL 字体度量对应breakLine/fontSize的合理取值OVERLAP两个文本框架相交或文本溢出容器对应margin: 0对齐与元素间距CONTRAST显式文本色与实色背景对比度不足WCAG 阈值对应颜色值规范6 位 hexFONT字体不在沙箱已知字体集对应「字体规范」小节的可用字体白名单lint.py 在测量文本大小时会把字体按 4 倍字号渲染以获得亚像素级精度MEASURE_SCALE 4并通过fc-match解析系统字体文件lint.py。内容密集的分析型/咨询型幻灯片故意收紧边距可用--profile dense只放宽 MARGIN 告警错误级检查不变。lint 通过后再进入视觉 QAsoffice转 PDF、pdftoppm转逐页 JPEG 交由子代理检查流程见 SKILL.md 的 Converting to Images 与 QA 章节。只有在完成至少一轮修复 → 复检循环后才能宣布交付成功。十五、快速参考Quick Reference形状RECTANGLE、OVAL、LINE、ROUNDED_RECTANGLE图表类型BAR、LINE、PIE、DOUGHNUT、SCATTER、BUBBLE、RADAR版式LAYOUT_16x910×5.625、LAYOUT_16x10、LAYOUT_4x3、LAYOUT_WIDE对齐left、center、right图表数据标签位置outEnd、inEnd、center常用配套脚本均在会话工作区以.opencode/skills/pptx/前缀调用仓库内物理路径见backend/onyx/skills/builtin/pptx/scripts/图标渲染/搜索scripts/icon.js布局 lintscripts/lint.py图表 PNG 渲染scripts/chart.py组件库默认从零构建路径scripts/components.js结语本文以 pptxgenjs.md 为主线完整覆盖了 PptxGenJS 从零构建 PPTX 的全部能力版式常量与坐标体系、富文本与列表、形状与阴影、图片与图标、背景与表格、图表与母版并逐条收录了颜色不带#8 位 hex 损坏文件选项对象原地修改圆角矩形不能叠矩形条等由实战沉淀的坑点。配合 icon.js、chart.py 与 lint.py 的源码级解读你可以在此基础上写出首轮即通过 lint、视觉整洁、可交付的演示文稿脚本——如需更快的版式组装请优先参考 components.md 的组件库处理已有模板则走 editing.md 的模板编辑流程。【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门