High-fidelity PPTX to PNG converter for Node.js
npm install node-pptx-pngHigh-fidelity PPTX to PNG converter for Node.js.
node-pptx-png is a pure JavaScript/TypeScript library for converting PowerPoint (PPTX) presentations to high-quality PNG images. It uses native canvas rendering (via skia-canvas) for accurate slide reproduction without relying on LibreOffice, Puppeteer, or other external dependencies.
- Pure Node.js - No external dependencies like LibreOffice or headless browsers
- High fidelity - Skia-based rendering for accurate slide reproduction
- TypeScript - Full type definitions included
- Configurable - Control output size, format, and quality
- PNG optimization - Optional Sharp integration for 60-70% smaller files
- Theme support - Proper resolution of PowerPoint theme colors and fonts
- Rich content support:
- Shapes with preset geometries (rectangles, chevrons, arrows, etc.)
- Text with full styling (fonts, colors, bullets, alignment)
- Images (embedded and linked)
- Tables with cell formatting
- Charts (bar, line, pie)
- Backgrounds (solid, gradient, image)
- Master/layout inheritance
``bash`
npm install node-pptx-png
This library uses skia-canvas for rendering. It should work out of the box on most systems, but you may need:
On macOS:
`bash`
brew install pkg-config
On Ubuntu/Debian:
`bash`
sudo apt-get install build-essential libfontconfig1-dev
`typescript
import { PptxImageRenderer } from 'node-pptx-png';
import * as fs from 'fs';
const renderer = new PptxImageRenderer();
// Render all slides
const result = await renderer.renderPresentation('./presentation.pptx', {
format: 'png',
scale: 1.0
});
for (const slide of result.slides) {
if (slide.imageData) {
fs.writeFileSync(slide-${slide.slideNumber}.png, slide.imageData);`
}
}
`typescript
import { PptxImageRenderer } from 'node-pptx-png';
const renderer = new PptxImageRenderer({ logLevel: 'info' });
const result = await renderer.renderPresentation('./presentation.pptx', {
scale: 0.5, // Scale factor (0.5 = half size)
format: 'png', // Output format
slideNumbers: [1, 2, 3], // Optional: render only specific slides
});
`
For smaller file sizes, enable PNG optimization (requires sharp to be installed):
`bash`
npm install sharp
`typescript
import { PptxImageRenderer } from 'node-pptx-png';
const renderer = new PptxImageRenderer();
// Use the 'web' preset for maximum compression (60-70% smaller)
const result = await renderer.renderPresentation('./presentation.pptx', {
pngOptimization: 'web'
});
// Or use other presets
const result2 = await renderer.renderPresentation('./presentation.pptx', {
pngOptimization: 'balanced' // ~2-3% smaller, lossless
});
// Or use custom options
const result3 = await renderer.renderPresentation('./presentation.pptx', {
pngOptimization: {
compressionLevel: 9,
adaptiveFiltering: true,
palette: true,
colors: 128,
quality: 80
}
});
`
`typescript
import { PptxImageRenderer } from 'node-pptx-png';
import * as fs from 'fs';
const pptxBuffer = fs.readFileSync('./presentation.pptx');
const renderer = new PptxImageRenderer();
const result = await renderer.renderPresentation(pptxBuffer);
`
Main class for rendering presentations.
#### Constructor
`typescript`
new PptxImageRenderer(options?: { logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'silent' })
#### Methods
##### renderPresentation(input, options?)
Renders all slides (or specified slides) in a presentation.
- input: Buffer | string - File path or buffer containing PPTX dataoptions
- : RenderOptions - Optional rendering optionsPromise
- Returns:
##### getSlideCount(input)
Gets the number of slides in a presentation.
- input: Buffer | string - File path or buffer containing PPTX dataPromise
- Returns:
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| scale | number | 1.0 | Scale factor for output size |format
| | 'png' | 'png' | Output format |slideNumbers
| | number[] | all | Specific slides to render (1-based) |pngOptimization
| | string \| object | 'none' | PNG optimization preset or custom options |
| Preset | Size Reduction | Description |
|--------|----------------|-------------|
| 'none' | 0% | No optimization (fastest) |'fast'
| | ~1-2% | Quick lossless compression |'balanced'
| | ~2-3% | Lossless with adaptive filtering |'maximum'
| | ~2-3% | Best lossless compression |'web'
| | 60-70% | Palette quantization (may affect photo quality) |
For custom PNG optimization:
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| compressionLevel | number | 6 | Compression level (0-9, higher = smaller) |adaptiveFiltering
| | boolean | true | Use adaptive row filtering |palette
| | boolean | false | Convert to indexed PNG (max 256 colors) |colors
| | number | 256 | Max colors for palette mode (2-256) |quality
| | number | 90 | Palette quantization quality (1-100) |dither
| | number | 1.0 | Dithering strength for palette mode (0-1) |
| Property | Type | Description |
|----------|------|-------------|
| slideIndex | number | Zero-based slide index |slideNumber
| | number | One-based slide number |imageData
| | Buffer | Rendered image data |width
| | number | Image width in pixels |height
| | number | Image height in pixels |success
| | boolean | Whether rendering succeeded |errorMessage
| | string? | Error message if failed |
| Property | Type | Description |
|----------|------|-------------|
| slides | SlideRenderResult[] | Results for each slide |totalSlides
| | number | Total number of slides |successfulSlides
| | number | Number of successfully rendered slides |allSuccessful
| | boolean | Whether all slides rendered successfully |
`bashInstall dependencies
npm install
MIT