npm.io
0.10.7 • Published 19h ago

@office-open/pptx

Licence
MIT
Version
0.10.7
Deps
2
Size
978 kB
Vulns
0
Weekly
533
Stars
4

@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 parsePresentation for 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/pptx

Quick 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.

License

Keywords