js2pptx
v0.1.0
Published
Generate .pptx from pptx2js IR or a PptxGenJS-like API, without PptxGenJS runtime
Maintainers
Readme
js2pptx
从 pptx2js 中间表示(IR) 或类 PptxGenJS API 直接生成 .pptx,无需 PptxGenJS 运行时。
HTML 版说明见
README.html· 设计文档见design.md/design.html
- 上游:pptx2js 负责 pptx → IR
- 本仓库:IR → OOXML/ZIP
- 开发前必读:design.md §3.3 IR 限制
快速开始
npm install js2pptx
# 若需 pptx → IR(pptxToIR / --from-pptx):
npm install pptx2js@^0.4.4# 本仓库开发
npm install
npm test从 .pptx 提取 IR 并写回
node bin/js2pptx.js --from-pptx input.pptx -o rebuilt.pptx从 IR JSON 生成
node bin/js2pptx.js ./ir.json -o out.pptx --media ./pptx2js-output编程 API
const { build, writeFile, pptxToIR } = require('js2pptx');
const ir = await pptxToIR('input.pptx');
await writeFile('out.pptx', ir, { mediaBase: '.' });当前进度
| 阶段 | 状态 | |------|------| | Phase 0 脚手架(units、xml-builder、最小 ZIP) | ✅ | | Phase 1 核心写入(background、text、image、shape) | ✅ | | Phase 2 表格与图表 | ✅ | | Phase 3 编程 API(Presentation 类) | ✅ | | Phase 4 超越 PptxGenJS(渐变、custGeom 等) | 待做 |
编程 API
const { Presentation, charts } = require('js2pptx');
const pptx = new Presentation();
pptx.defineLayout({ name: 'CUSTOM', width: 10, height: 7.5 });
const slide = pptx.addSlide();
slide.background = { color: 'FFFFFF', decision: 'FULL' };
slide.addText([{ text: 'Hello', options: { fontSize: 24 } }], { x: 1, y: 1, w: 8, h: 1 });
slide.addTable([[{ text: 'A' }, { text: 'B' }]], { x: 0.5, y: 2, w: 9, h: 1, colW: [4.5, 4.5] });
slide.addChart(charts.BAR, [{ name: 'S1', labels: ['Q1'], values: [10] }], { x: 1, y: 3, w: 8, h: 3 });
await pptx.writeFile('out.pptx');目录结构
lib/
├── index.js # 入口
├── units.js # 英寸 ↔ EMU
├── xml-builder.js # OOXML XML 构建
├── pptx-to-ir.js # pptx2js 联调
├── presentation.js # Presentation API
└── writer/ # OOXML 写入器
design.md / design.html # 设计文档(IR 契约、路线、测试)设计文档
完整 IR 契约、OOXML 映射与实施路线见根目录 design.md(design.html 为 HTML 版)。
本地开发可另备 pptx2js 源码对照 OOXML 读写细节,无需纳入本仓库 git。
