2026-03-21 21:18:22 +08:00
---
name: pptx-generator
2026-03-21 23:31:04 +08:00
description: "Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. Triggers: PPT, PPTX, PowerPoint, presentation, slide, deck, slides."
license: MIT
metadata:
version: "1.0"
category: productivity
sources:
- https://gitbrent.github.io/PptxGenJS/
- https://github.com/microsoft/markitdown
2026-03-21 21:18:22 +08:00
---
# PPTX Generator & Editor
## Overview
This skill handles all PowerPoint tasks: reading/analyzing existing presentations, editing template-based decks via XML manipulation, and creating presentations from scratch using PptxGenJS. It includes a complete design system (color palettes, fonts, style recipes) and detailed guidance for every slide type.
## Quick Reference
| Task | Approach |
|------|----------|
| Read/analyze content | `python -m markitdown presentation.pptx` |
2026-03-21 23:31:04 +08:00
| Edit or create from template | See [Editing Presentations ](references/editing.md ) |
2026-03-21 21:18:22 +08:00
| Create from scratch | See [Creating from Scratch ](#creating-from-scratch-workflow ) below |
| Item | Value |
|------|-------|
| **Dimensions ** | 10" x 5.625" (LAYOUT_16x9) |
| **Colors ** | 6-char hex without # (e.g., `"FF0000"` ) |
| **English font ** | Arial (default), or approved alternatives |
| **Chinese font ** | Microsoft YaHei |
| **Page badge position ** | x: 9.3", y: 5.1" |
| **Theme keys ** | `primary` , `secondary` , `accent` , `light` , `bg` |
| **Shapes ** | RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE |
| **Charts ** | BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR |
## Reference Files
| File | Contents |
|------|----------|
2026-03-21 23:31:04 +08:00
| [slide-types.md ](references/slide-types.md ) | 5 slide page types (Cover, TOC, Section Divider, Content, Summary) + additional layout patterns |
| [design-system.md ](references/design-system.md ) | Color palettes, font reference, style recipes (Sharp/Soft/Rounded/Pill), typography & spacing |
| [editing.md ](references/editing.md ) | Template-based editing workflow, XML manipulation, formatting rules, common pitfalls |
| [pitfalls.md ](references/pitfalls.md ) | QA process, common mistakes, critical PptxGenJS pitfalls |
| [pptxgenjs.md ](references/pptxgenjs.md ) | Complete PptxGenJS API reference |
2026-03-21 21:18:22 +08:00
---
## Reading Content
```bash
# Text extraction
python -m markitdown presentation.pptx
```
---
## Creating from Scratch — Workflow
**Use when no template or reference presentation is available.**
### Step 1: Research & Requirements
Search to understand user requirements — topic, audience, purpose, tone, content depth.
### Step 2: Select Color Palette & Fonts
2026-03-21 23:31:04 +08:00
Use the [Color Palette Reference ](references/design-system.md#color-palette-reference ) to select a palette matching the topic and audience. Use the [Font Reference ](references/design-system.md#font-reference ) to choose a font pairing.
2026-03-21 21:18:22 +08:00
### Step 3: Select Design Style
2026-03-21 23:31:04 +08:00
Use the [Style Recipes ](references/design-system.md#style-recipes ) to choose a visual style (Sharp, Soft, Rounded, or Pill) matching the presentation tone.
2026-03-21 21:18:22 +08:00
### Step 4: Plan Slide Outline
2026-03-21 23:31:04 +08:00
Classify **every slide ** as exactly one of the [5 page types ](references/slide-types.md ). Plan the content and layout for each slide. Ensure visual variety — do NOT repeat the same layout across slides.
2026-03-21 21:18:22 +08:00
### Step 5: Generate Slide JS Files
2026-03-21 23:31:04 +08:00
Create one JS file per slide in `slides/` directory. Each file must export a synchronous `createSlide(pres, theme)` function. Follow the [Slide Output Format ](#slide-output-format ) and the type-specific guidance in [slide-types.md ](references/slide-types.md ). Generate up to 5 slides concurrently using subagents if available.
2026-03-21 21:18:22 +08:00
**Tell each subagent:**
1. File naming: `slides/slide-01.js` , `slides/slide-02.js` , etc.
2. Images go in: `slides/imgs/`
3. Final PPTX goes in: `slides/output/`
4. Dimensions: 10" x 5.625" (LAYOUT_16x9)
5. Fonts: Chinese = Microsoft YaHei, English = Arial (or approved alternative)
6. Colors: 6-char hex without # (e.g. `"FF0000"` )
7. Must use the theme object contract (see [Theme Object Contract ](#theme-object-contract ))
2026-03-21 23:31:04 +08:00
8. Must follow the [PptxGenJS API reference ](references/pptxgenjs.md )
2026-03-21 21:18:22 +08:00
### Step 6: Compile into Final PPTX
Create `slides/compile.js` to combine all slide modules:
```javascript
// slides/compile.js
const pptxgen = require('pptxgenjs');
const pres = new pptxgen();
pres.layout = 'LAYOUT_16x9';
const theme = {
primary: "22223b", // dark color for backgrounds/text
secondary: "4a4e69", // secondary accent
accent: "9a8c98", // highlight color
light: "c9ada7", // light accent
bg: "f2e9e4" // background color
};
for (let i = 1; i <= 12; i++) { // adjust count as needed
const num = String(i).padStart(2, '0');
const slideModule = require(`./slide-${num}.js` );
slideModule.createSlide(pres, theme);
}
pres.writeFile({ fileName: './output/presentation.pptx' });
```
Run with: `cd slides && node compile.js`
### Step 7: QA (Required)
2026-03-21 23:31:04 +08:00
See [QA Process ](references/pitfalls.md#qa-process ).
2026-03-21 21:18:22 +08:00
### Output Structure
```
slides/
├── slide-01.js # Slide modules
├── slide-02.js
├── ...
├── imgs/ # Images used in slides
└── output/ # Final artifacts
└── presentation.pptx
```
---
## Slide Output Format
Each slide is a **complete, runnable JS file ** :
```javascript
// slide-01.js
const pptxgen = require("pptxgenjs");
const slideConfig = {
type: 'cover',
index: 1,
title: 'Presentation Title'
};
// MUST be synchronous (not async)
function createSlide(pres, theme) {
const slide = pres.addSlide();
slide.background = { color: theme.bg };
slide.addText(slideConfig.title, {
x: 0.5, y: 2, w: 9, h: 1.2,
fontSize: 48, fontFace: "Arial",
color: theme.primary, bold: true, align: "center"
});
return slide;
}
// Standalone preview - use slide-specific filename
if (require.main === module) {
const pres = new pptxgen();
pres.layout = 'LAYOUT_16x9';
const theme = {
primary: "22223b",
secondary: "4a4e69",
accent: "9a8c98",
light: "c9ada7",
bg: "f2e9e4"
};
createSlide(pres, theme);
pres.writeFile({ fileName: "slide-01-preview.pptx" });
}
module.exports = { createSlide, slideConfig };
```
---
## Theme Object Contract (MANDATORY)
The compile script passes a theme object with these **exact keys ** :
| Key | Purpose | Example |
|-----|---------|---------|
| `theme.primary` | Darkest color, titles | `"22223b"` |
| `theme.secondary` | Dark accent, body text | `"4a4e69"` |
| `theme.accent` | Mid-tone accent | `"9a8c98"` |
| `theme.light` | Light accent | `"c9ada7"` |
| `theme.bg` | Background color | `"f2e9e4"` |
**NEVER use other key names** like `background` , `text` , `muted` , `darkest` , `lightest` .
---
## Page Number Badge (REQUIRED)
All slides **except Cover Page ** MUST include a page number badge in the bottom-right corner.
- **Position**: x: 9.3", y: 5.1"
- Show current number only (e.g. `3` or `03` ), NOT "3/12"
- Use palette colors, keep subtle
### Circle Badge (Default)
```javascript
slide.addShape(pres.shapes.OVAL, {
x: 9.3, y: 5.1, w: 0.4, h: 0.4,
fill: { color: theme.accent }
});
slide.addText("3", {
x: 9.3, y: 5.1, w: 0.4, h: 0.4,
fontSize: 12, fontFace: "Arial",
color: "FFFFFF", bold: true,
align: "center", valign: "middle"
});
```
### Pill Badge
```javascript
slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {
x: 9.1, y: 5.15, w: 0.6, h: 0.35,
fill: { color: theme.accent },
rectRadius: 0.15
});
slide.addText("03", {
x: 9.1, y: 5.15, w: 0.6, h: 0.35,
fontSize: 11, fontFace: "Arial",
color: "FFFFFF", bold: true,
align: "center", valign: "middle"
});
```
---
## Dependencies
- `pip install "markitdown[pptx]"` — text extraction
- `npm install -g pptxgenjs` — creating from scratch
- `npm install -g react-icons react react-dom sharp` — icons (optional)