@office-open/pptx
Generate and parse .pptx presentations with a declarative TypeScript API. Works in Node.js and browsers.
Features
- Slide Management — Create presentations with multiple slides, slide masters, and slide layouts
- Shapes — Rectangles, ellipses, lines, connectors, and custom geometry shapes
- Text & Rich Formatting — Paragraphs, runs, fonts, colors, alignment, and spacing
- Tables — Full table support with rows, cells, borders, and cell properties
- Charts — Bar, line, pie, area, and scatter charts with customization
- SmartArt — Built-in SmartArt graphic generation with multiple layouts and styles
- Images — Inline pictures with fills, transformations, and effects
- Backgrounds — Solid color, gradient, and picture backgrounds
- Transitions — Slide transitions with various types and durations
- Animations — Entrance, emphasis, exit, and motion path animations
- Media — Video and audio embedding
- Hyperlinks — Clickable hyperlinks on shapes and text
- Headers & Footers — Slide header/footer with date, slide number
- Notes — Speaker notes for each slide
- Group Shapes — Group multiple shapes together
- DrawingML — Shapes with fills, outlines, shadows, glow, reflection, and 3D effects
- Parsing — Parse existing .pptx files with
parsePresentationfor round-trip workflows - Template Patching — Patch existing PPTX templates via placeholder replacement
Installation
# pnpm
pnpm add @office-open/pptx
# npm
npm install @office-open/pptx
# yarn
yarn add @office-open/pptx
# bun
bun add @office-open/pptxQuick Start
import { generatePresentation } from "@office-open/pptx";
import { writeFileSync } from "node:fs";
const buffer = await generatePresentation({
slides: [
{
children: [
{
shape: {
textBody: {
children: [{ paragraph: { children: ["Hello World"] } }],
},
fill: "4472C4",
x: 100,
y: 100,
width: 600,
height: 400,
},
},
],
},
],
});
writeFileSync("presentation.pptx", buffer);Parsing
Read existing .pptx files and re-create them as PresentationOptions:
import { parsePresentation, generatePresentation } from "@office-open/pptx";
import { readFileSync, writeFileSync } from "node:fs";
const opts = parsePresentation(new Uint8Array(readFileSync("input.pptx")));
// Modify parsed data, then re-generate
const buffer = await generatePresentation(opts);
writeFileSync("output.pptx", buffer);Benchmark
Performance vs PptxGenJS (higher ops/s is better, Windows 11 / Node 24).
Default = XML DEFLATE level 1 (SuperFast); media is split by type, matching MS Office PowerPoint — already-compressed formats (PNG/JPEG/GIF) are STOREd, the rest (EMF/WMF/BMP/TIFF/…) use DEFLATE level 1 (verified on a real MS Office file). All STORE = no compression ({ compression: { xml: 0, media: 0 } }). PptxGenJS (async only) defaults to STORE (via JSZip), supports DEFLATE via compression: true (applies to ALL entries including images).
// Default (matches MS Office)
await generatePresentation(options);
// All STORE (no compression)
await generatePresentation(options, { compression: { xml: 0, media: 0 } });Create + toBuffer (end-to-end)
| Scenario | Default sync | Default async | All STORE sync | All STORE async | PptxGenJS DEFLATE | PptxGenJS STORE |
|---|---|---|---|---|---|---|
| Simple (2 shapes) | 1,391 ops/s | 693 ops/s | 4,055 ops/s | 4,148 ops/s | 182 ops/s | 187 ops/s |
| Styled shapes (20) | 1,302 ops/s | 661 ops/s | 4,387 ops/s | 4,030 ops/s | 188 ops/s | 183 ops/s |
| Table (10x5) | 1,694 ops/s | 802 ops/s | 7,787 ops/s | 7,891 ops/s | 857 ops/s | 937 ops/s |
| Full featured | 1,155 ops/s | 627 ops/s | 2,873 ops/s | 2,821 ops/s | 97 ops/s | 98 ops/s |
Large Files — Create + toBuffer
| Scenario | Default sync | Default async | All STORE sync | All STORE async | PptxGenJS DEFLATE | PptxGenJS STORE |
|---|---|---|---|---|---|---|
| 30 slides x 20 shapes | 271 ops/s | 144 ops/s | 571 ops/s | 577 ops/s | 119 ops/s | 120 ops/s |
| 30 slides x 10 images | 130 ops/s | 87.4 ops/s | 173 ops/s | 168 ops/s | 0.32 ops/s | 0.32 ops/s |
| 100x10 table | 618 ops/s | 453 ops/s | 1,082 ops/s | 1,039 ops/s | 128 ops/s | 123 ops/s |
| 50 slides full | 89.2 ops/s | 60.5 ops/s | 131 ops/s | 129 ops/s | 0.95 ops/s | 0.95 ops/s |
Large File (~100MB) — Mixed Content
40 slides x (2 shapes + 2 mixed-size images + 3x3 table).
| Scenario | Default sync | Default async | All STORE sync | All STORE async | PptxGenJS DEFLATE | PptxGenJS STORE |
|---|---|---|---|---|---|---|
| 40 slides mixed | 24.5 ops/s | 22.1 ops/s | 26.3 ops/s | 26.5 ops/s | 0.22 ops/s | 0.23 ops/s |
Examples
Check the demo folder for working examples covering every feature.