https://github.com/ahmedessam090/pptx-to-pdf
Pure TypeScript PPTX-to-PDF converter. No LibreOffice. No native dependencies. Just buffer in, PDF out.
https://github.com/ahmedessam090/pptx-to-pdf
converter lambda no-libreoffice nodejs pdf powerpoint pptx pptx-to-pdf presentation pure-javascript typescript
Last synced: 10 days ago
JSON representation
Pure TypeScript PPTX-to-PDF converter. No LibreOffice. No native dependencies. Just buffer in, PDF out.
- Host: GitHub
- URL: https://github.com/ahmedessam090/pptx-to-pdf
- Owner: ahmedessam090
- License: mit
- Created: 2026-02-24T22:33:58.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-02-26T07:34:46.000Z (5 months ago)
- Last Synced: 2026-07-08T13:33:35.856Z (about 1 month ago)
- Topics: converter, lambda, no-libreoffice, nodejs, pdf, powerpoint, pptx, pptx-to-pdf, presentation, pure-javascript, typescript
- Language: TypeScript
- Homepage:
- Size: 2.53 MB
- Stars: 4
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# pptx-to-pdf
Pure TypeScript PPTX-to-PDF converter. No LibreOffice. No native dependencies. Just buffer in, PDF out.
```
npm install pptx-to-pdf
```
## Usage
```typescript
import { convert } from 'pptx-to-pdf';
import fs from 'fs';
const pptx = fs.readFileSync('presentation.pptx');
const pdf = await convert(pptx);
fs.writeFileSync('output.pdf', pdf);
```
## API
### `convert(pptxBuffer, options?): Promise`
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `slides` | `number[]` | all | Slide indices to include (0-based) |
| `fontDirs` | `string[]` | `[]` | Additional directories to search for fonts |
| `fontMap` | `Record` | `{}` | Map font names to file paths or buffers |
| `dpi` | `number` | `96` | Output resolution |
| `onWarning` | `(msg: string) => void` | no-op | Callback for non-fatal warnings |
## Examples
### Specific slides only
```typescript
const pdf = await convert(pptx, {
slides: [0, 2, 4], // first, third, and fifth slides
});
```
### Custom fonts
```typescript
const pdf = await convert(pptx, {
fontDirs: ['/usr/share/fonts/truetype'],
fontMap: {
'Calibri': '/path/to/calibri.ttf',
'Custom Font': fs.readFileSync('/path/to/custom.ttf'),
},
});
```
### Express endpoint
```typescript
app.post('/convert', async (req, res) => {
const pdf = await convert(req.body);
res.type('application/pdf').send(pdf);
});
```
### AWS Lambda
```typescript
export const handler = async (event) => {
const pptx = Buffer.from(event.body, 'base64');
const pdf = await convert(pptx);
return {
statusCode: 200,
headers: { 'Content-Type': 'application/pdf' },
body: pdf.toString('base64'),
isBase64Encoded: true,
};
};
```
## What it handles
- Text with fonts, sizes, colors, bold/italic/underline
- Shapes (rectangles, ellipses, arrows, rounded rects, and more)
- Images (JPEG, PNG) including cropped images
- Tables with cell backgrounds, borders, and text
- Slide backgrounds (solid, gradient, image)
- Theme colors and font schemes
- Placeholder inheritance (slide -> layout -> master)
- Group shapes with nested children
- Connectors
## What it doesn't handle (yet)
- Charts
- SmartArt
- Animations and transitions
- Audio/video
- EMF/WMF vector graphics
- 3D effects and complex text transforms
- Pattern fills
## How it works
The library parses the PPTX file (a ZIP archive of Office Open XML) and renders directly to PDF:
1. **Extract** ZIP archive with `jszip`
2. **Parse** all XML parts with `fast-xml-parser` (presentation, themes, masters, layouts, slides)
3. **Resolve** the full inheritance chain (slide -> layout -> master -> theme) for transforms, fills, and text styles
4. **Measure** text with `opentype.js` for accurate line breaking and layout
5. **Render** to PDF with `pdfkit` (vector paths, embedded images, positioned text)
No intermediate HTML. No headless browser. No subprocess.
## Fonts
The library bundles Liberation Sans, Liberation Serif, and Liberation Mono (~2.5MB) as metric-compatible fallbacks for Arial, Times New Roman, and Courier New. For better fidelity, provide the actual fonts via `fontDirs` or `fontMap`.
## License
MIT