pptx-generator
npx skills add https://github.com/jwynia/agent-skills --skill pptx-generator
Agent 安装分布
Skill 文档
PPTX Generator
When to Use This Skill
Use this skill when:
- Creating presentations programmatically from data or specifications
- Populating branded templates with dynamic content while preserving corporate styling
- Extracting text and structure from existing PPTX files for analysis
- Combining slides from a library of approved templates
- Automating presentation generation workflows
Do NOT use this skill when:
- User wants to open/view presentations (use native PowerPoint or viewer)
- Complex animations or transitions are required (limited support)
- Working with older .ppt format (PPTX only)
Prerequisites
- Deno installed (https://deno.land/)
- Input PPTX files for template-based operations
- JSON specification for scratch generation
Quick Start
Two Modes of Operation
-
Template Mode: Modify existing branded templates
- Analyze & Replace: Find
{{PLACEHOLDERS}}and replace with content - Slide Library: Select and combine slides from a template library
- Analyze & Replace: Find
-
Scratch Mode: Create presentations from nothing using JSON specifications
Instructions
Mode 1: Template-Based Generation
Step 1a: Analyze the Template
Extract text inventory to understand what can be replaced:
deno run --allow-read scripts/analyze-template.ts corporate-template.pptx > inventory.json
Output (inventory.json):
{
"filename": "corporate-template.pptx",
"slideCount": 10,
"textElements": [
{
"slideNumber": 1,
"shapeId": "shape-2",
"shapeName": "Title 1",
"placeholderType": "ctrTitle",
"position": { "x": 1.5, "y": 2.0, "w": 7.0, "h": 1.2 },
"paragraphs": [
{ "text": "{{TITLE}}", "fontSize": 44, "bold": true }
]
}
]
}
Step 1b: Create Replacement Specification
Create replacements.json:
{
"textReplacements": [
{ "tag": "{{TITLE}}", "value": "Q4 2024 Results" },
{ "tag": "{{SUBTITLE}}", "value": "Financial Overview" },
{ "tag": "{{DATE}}", "value": "December 2024" },
{ "tag": "{{AUTHOR}}", "value": "Finance Team", "slideNumbers": [1] }
]
}
Step 1c: Generate Output
deno run --allow-read --allow-write scripts/generate-from-template.ts \
corporate-template.pptx replacements.json output.pptx
Mode 1 (Alternative): Slide Library
Step 2a: Preview Template Slides
Get information about available slides:
deno run --allow-read scripts/generate-thumbnails.ts slide-library.pptx
For visual preview, extract the thumbnail:
deno run --allow-read --allow-write scripts/generate-thumbnails.ts \
slide-library.pptx --extract-thumb --output-dir ./previews
Step 2b: Select and Combine Slides
Create selections.json:
{
"slideSelections": [
{ "slideNumber": 1 },
{ "slideNumber": 5 },
{ "slideNumber": 12 },
{ "slideNumber": 3 }
],
"textReplacements": [
{ "tag": "{{TITLE}}", "value": "Custom Presentation" }
]
}
Step 2c: Generate Combined Presentation
deno run --allow-read --allow-write scripts/generate-from-template.ts \
slide-library.pptx selections.json custom-deck.pptx
Mode 2: From-Scratch Generation
Step 3a: Create Specification
Create spec.json:
{
"title": "Product Launch 2025",
"author": "Marketing Team",
"slides": [
{
"background": { "color": "003366" },
"elements": [
{
"type": "text",
"x": 1, "y": 2.5, "w": 8, "h": 1.5,
"options": {
"text": "Product Launch 2025",
"fontSize": 44,
"bold": true,
"color": "FFFFFF",
"align": "center"
}
},
{
"type": "text",
"x": 1, "y": 4, "w": 8, "h": 0.5,
"options": {
"text": "Revolutionizing the Industry",
"fontSize": 24,
"color": "CCCCCC",
"align": "center"
}
}
]
},
{
"elements": [
{
"type": "text",
"x": 0.5, "y": 0.5, "w": 9, "h": 0.7,
"options": {
"text": "Key Features",
"fontSize": 32,
"bold": true,
"color": "003366"
}
},
{
"type": "table",
"x": 0.5, "y": 1.5, "w": 9, "h": 3,
"options": {
"rows": [
["Feature", "Description", "Benefit"],
["Speed", "2x faster processing", "Save time"],
["Quality", "HD output", "Better results"],
["Integration", "Works with existing tools", "Easy adoption"]
],
"border": { "pt": 1, "color": "CCCCCC" }
}
}
]
}
]
}
Step 3b: Generate Presentation
deno run --allow-read --allow-write scripts/generate-scratch.ts spec.json output.pptx
Examples
Example 1: Corporate Quarterly Report
Scenario: Generate quarterly report from branded template.
Steps:
# 1. Analyze template for replaceable content
deno run --allow-read scripts/analyze-template.ts quarterly-template.pptx --pretty
# 2. Create replacements.json with Q4 data
# 3. Generate report
deno run --allow-read --allow-write scripts/generate-from-template.ts \
quarterly-template.pptx replacements.json Q4-2024-Report.pptx
Example 2: Custom Pitch Deck from Slide Library
Scenario: Combine approved slides for a specific client pitch.
Steps:
# 1. View available slides
deno run --allow-read scripts/generate-thumbnails.ts pitch-library.pptx
# 2. Create selections.json picking slides 1, 3, 7, 12, 15
# 3. Generate custom deck
deno run --allow-read --allow-write scripts/generate-from-template.ts \
pitch-library.pptx selections.json acme-pitch.pptx
Example 3: Data-Driven Presentation
Scenario: Generate presentation from JSON data (e.g., API response).
Steps:
# 1. Transform your data into spec.json format
# 2. Generate presentation
deno run --allow-read --allow-write scripts/generate-scratch.ts data-spec.json report.pptx
Script Reference
| Script | Purpose | Permissions |
|---|---|---|
analyze-template.ts |
Extract text inventory from PPTX | --allow-read |
generate-thumbnails.ts |
Get slide info and extract previews | --allow-read --allow-write |
generate-from-template.ts |
Modify templates (replace/combine) | --allow-read --allow-write |
generate-scratch.ts |
Create PPTX from JSON specification | --allow-read --allow-write |
Element Types (Scratch Mode)
| Type | Description | Key Options |
|---|---|---|
text |
Text box | text, fontSize, bold, color, align |
image |
Image from file or base64 | path, data, sizing |
table |
Data table | rows, colW, border, fill |
shape |
Geometric shapes | type, fill, line, text |
chart |
Charts and graphs | type, data, title, showLegend |
Common Issues and Solutions
Issue: Text not being replaced
Symptoms: Output PPTX still contains {{PLACEHOLDER}} tags.
Solution:
- Run
analyze-template.tsto verify exact tag text - Tags may be split across XML runs – ensure your template has tags in single text runs
- Check
slideNumbersfilter in replacements
Issue: Slide order incorrect
Symptoms: Slides appear in wrong order after combining.
Solution:
- Slides are added in the order specified in
slideSelections - Verify slide numbers match original template (1-indexed)
Issue: Images not appearing
Symptoms: Image elements are blank in output.
Solution:
- Use absolute paths or paths relative to spec.json location
- Verify image file exists and is readable
- Check supported formats: PNG, JPEG, GIF
OOXML Placeholder Inheritance (Advanced)
Understanding how PowerPoint’s OOXML format handles placeholders is crucial for template development.
The Inheritance Chain
PowerPoint uses a hierarchical inheritance model:
Theme â Slide Master â Slide Layout â Slide
- Theme: Defines colors, fonts, effects
- Slide Master: Defines default placeholder positions and formatting (including bullets)
- Slide Layout: Overrides master settings for specific layout types (e.g., Title Slide, Content)
- Slide: Contains actual content, inherits formatting from layout
Key Principles
-
Text Content Does NOT Inherit: Slides must contain their own text content. The
{{placeholder}}text in a layout does NOT automatically appear on slides using that layout. -
Text Formatting CAN Inherit: When a slide shape has an empty
<a:lstStyle/>, it inherits formatting (color, size, bullets) from the layout’s<a:lstStyle>. -
Placeholder Linking: Slides link to layouts via
<p:ph type="..." idx="..."/>. Thetype(e.g., “title”, “body”, “ctrTitle”) andidxmust match. -
Bullet Suppression: To prevent bullets on a placeholder that would normally inherit them from the master’s bodyStyle, add
<a:buNone/>in the layout’s lstStyle.
Defining Inheritable Formatting
In layout placeholders, define colors in <a:lstStyle> (inheritable), not in <a:rPr> (run-specific):
<!-- Layout: Color in lstStyle (GOOD - inheritable) -->
<p:txBody>
<a:lstStyle>
<a:lvl1pPr algn="ctr">
<a:buNone/> <!-- Suppress bullets -->
<a:defRPr sz="4400" b="1">
<a:solidFill><a:srgbClr val="FFFFFF"/></a:solidFill>
</a:defRPr>
</a:lvl1pPr>
</a:lstStyle>
<a:p>
<a:r><a:rPr lang="en-US"/><a:t>{{placeholder}}</a:t></a:r>
</a:p>
</p:txBody>
Slide Shape Structure
For slides to properly inherit from layouts:
<!-- Slide: Empty lstStyle to inherit from layout -->
<p:sp>
<p:nvSpPr>
<p:cNvPr id="2" name="title 2"/>
<p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr>
<p:nvPr>
<p:ph type="ctrTitle"/> <!-- Links to layout placeholder -->
</p:nvPr>
</p:nvSpPr>
<p:spPr/> <!-- Empty = inherit position from layout -->
<p:txBody>
<a:bodyPr/>
<a:lstStyle/> <!-- Empty = inherit formatting from layout -->
<a:p>
<a:r>
<a:rPr lang="en-US"/> <!-- Empty = inherit character formatting -->
<a:t>{{placeholder}}</a:t> <!-- Content must be here -->
</a:r>
</a:p>
</p:txBody>
</p:sp>
Common Issues
| Issue | Cause | Solution |
|---|---|---|
| Text shows as black instead of white | Color defined in <a:rPr> not <a:lstStyle> |
Move color to layout’s <a:defRPr> in <a:lstStyle> |
| Unwanted bullets appearing | Master’s bodyStyle has bullets, layout doesn’t override | Add <a:buNone/> to layout’s <a:lvl1pPr> |
| Placeholder text not appearing | Text only in layout, not in slide | Include text content in slide’s <p:txBody> |
| Formatting not applying | Slide has explicit formatting | Use empty <a:lstStyle/> and <a:rPr lang="en-US"/> |
Reference: Placeholder Types
| Type | Usage |
|---|---|
ctrTitle |
Centered title (title slides) |
title |
Standard title |
subTitle |
Subtitle |
body |
Content area (use idx for multiple) |
pic |
Picture placeholder |
dt |
Date/time |
ftr |
Footer |
sldNum |
Slide number |
Limitations
- No slide rendering: Cannot render slides to images directly (use LibreOffice for this)
- Limited animation support: Basic animations only in scratch mode
- No master slide editing: Template mode preserves but doesn’t modify masters
- PPTX only: Does not support legacy .ppt format
- Text run splitting: Complex formatting in templates may split tags across XML elements
Related Skills
- pdf-generator: For creating PDF documents instead of presentations
- docx-generator: For creating Word documents
- xlsx-generator: For creating Excel spreadsheets