Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files) for: (1) Creating new presentations, (2) Modifying or editing content, (3) Working with layouts, (4) Adding comments or speaker notes, or any other presentation tasks
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
css.mdhtml2pptx.mdhtml2pptx.tgzooxml.mdooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsdooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsdooxml/schemas/ISO-IEC29500-4_2016/pml.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsdooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsdCreate, edit, or analyze the contents of .pptx files when requested. A .pptx file is essentially a ZIP archive containing XML files and other resources. Different tools and workflows are available for different tasks.
Before starting any presentation task, read ALL relevant documentation files completely to understand the full workflow:
html2pptx.md and css.md in their entiretyooxml.md in its entiretycss.mdNEVER set any range limits when reading these files. Understanding the complete workflow, constraints, and best practices before starting is essential for producing high-quality presentations. Partial knowledge leads to errors, inconsistent styling, and visual defects that require rework.
To read just the text content of a presentation, convert the document to markdown:
# Convert document to markdown
python -m markitdown path-to-file.pptx
Use raw XML access for: comments, speaker notes, slide layouts, animations, design elements, and complex formatting. To access these features, unpack a presentation and read its raw XML contents.
python ooxml/scripts/unpack.py <office_file> <output_dir>
Note: The unpack.py script is located at skills/public/pptx/ooxml/scripts/unpack.py relative to the project root. If the script doesn't exist at this path, use find . -name "unpack.py" to locate it.
ppt/presentation.xml - Main presentation metadata and slide referencesppt/slides/slide{N}.xml - Individual slide contents (slide1.xml, slide2.xml, etc.)ppt/notesSlides/notesSlide{N}.xml - Speaker notes for each slideppt/comments/modernComment_*.xml - Comments for specific slidesppt/slideLayouts/ - Layout templates for slidesppt/slideMasters/ - Master slide templatesppt/theme/ - Theme and styling informationppt/media/ - Images and other media filesTo emulate example designs, analyze the presentation's typography and colors first using the methods below:
ppt/theme/theme1.xml for colors (<a:clrScheme>) and fonts (<a:fontScheme>)ppt/slides/slide1.xml for actual font usage (<a:rPr>) and colors<a:solidFill>, <a:srgbClr>) and font references across all XML filesWhen creating a new PowerPoint presentation from scratch, use the html2pptx workflow to convert HTML slides to PowerPoint with accurate positioning.
Read documentation: Read html2pptx.md and css.md completely (see "CRITICAL: Read All Documentation First" section above)
PREREQUISITE - Extract html2pptx library:
mkdir -p html2pptx && tar -xzf skills/public/pptx/html2pptx.tgz -C html2pptxhtml2pptx/ directory with the library files and CLI binariesPlan the presentation: Follow html2pptx.md "Design Philosophy" section for:
Set CSS variables: Override CSS variables in a shared .css file for colors, typography, and spacing (see css.md "Design System Variables")
Create HTML slides (960px × 540px for 16:9): Follow html2pptx.md for:
Create and run a JavaScript file using the html2pptx library to convert HTML slides to PowerPoint and save the presentation
Run with: NODE_PATH="$(npm root -g)" node your-script.js 2>&1
Use the html2pptx function to process each HTML file
Add charts and tables to placeholder areas using PptxGenJS API
Save the presentation using pptx.writeFile()
⚠️ CRITICAL: Your script MUST follow this example structure. Think aloud before writing the script to make sure that you correctly use the APIs. Do NOT call pptx.addSlide.
const pptxgen = require("pptxgenjs");
const { html2pptx } = require("./html2pptx");
// Create a new pptx presentation
const pptx = new pptxgen();
pptx.layout = "LAYOUT_16x9"; // Must match HTML body dimensions
// Add an HTML-only slide
await html2pptx("slide1.html", pptx);
// Add a HTML slide with chart placeholders
const { slide: slide2, placeholders } = await html2pptx("slide2.html", pptx);
slide.addChart(pptx.charts.LINE, chartData, placeholders[0]);
// Save the presentation
await pptx.writeFile("output.pptx");
Visual validation: Convert to images and inspect for layout issues
soffice --headless --convert-to pdf output.pptxpdftoppm -jpeg -r 150 output.pdf slide
slide-1.jpg, slide-2.jpg, etc.To edit slides in an existing PowerPoint presentation, work with the raw Office Open XML (OOXML) format. This involves unpacking the .pptx file, editing the XML content, and repacking it.
ooxml.md completely (see "CRITICAL: Read All Documentation First" section above)python ooxml/scripts/unpack.py <office_file> <output_dir>ppt/slides/slide{N}.xml and related files)python ooxml/scripts/validate.py <dir> --original <file>python ooxml/scripts/pack.py <input_directory> <office_file>To create a presentation that follows an existing template's design, duplicate and re-arrange template slides before replacing placeholder content.
Extract template text AND create visual thumbnail grid:
python -m markitdown template.pptx > template-content.mdtemplate-content.md completely to understand the template contentspython scripts/thumbnail.py template.pptxAnalyze template and save inventory to a file:
Visual Analysis: Review thumbnail grid(s) to understand slide layouts, design patterns, and visual structure
Create and save a template inventory file at template-inventory.md containing:
# Template Inventory Analysis
**Total Slides: [count]**
**IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)**
## [Category Name]
- Slide 0: [Layout code if available] - Description/purpose
- Slide 1: [Layout code] - Description/purpose
- Slide 2: [Layout code] - Description/purpose
[... EVERY slide must be listed individually with its index ...]
Using the thumbnail grid: Reference the visual thumbnails to identify:
This inventory file is REQUIRED for selecting appropriate templates in the next step
Create presentation outline based on template inventory:
outline.md with content AND template mapping that leverages available designs# Template slides to use (0-based indexing)
# WARNING: Verify indices are within range! Template with 73 slides has indices 0-72
# Mapping: slide numbers from outline -> template slide indices
template_mapping = [
0, # Use slide 0 (Title/Cover)
34, # Use slide 34 (B1: Title and body)
34, # Use slide 34 again (duplicate for second B1)
50, # Use slide 50 (E1: Quote)
54, # Use slide 54 (F2: Closing + Text)
]
Duplicate, reorder, and delete slides using rearrange.py:
scripts/rearrange.py script to create a new presentation with slides in the desired order:
python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
Extract ALL text using the inventory.py script:
Run inventory extraction:
python scripts/inventory.py working.pptx text-inventory.json
Read text-inventory.json completely to understand all shapes and their properties
The inventory JSON structure:
{
"slide-0": {
"shape-0": {
"placeholder_type": "TITLE", // or null for non-placeholders
"left": 1.5, // position in inches
"top": 2.0,
"width": 7.5,
"height": 1.2,
"paragraphs": [
{
"text": "Paragraph text",
// Optional properties (only included when non-default):
"bullet": true, // explicit bullet detected
"level": 0, // only included when bullet is true
"alignment": "CENTER", // CENTER, RIGHT (not LEFT)
"space_before": 10.0, // space before paragraph in points
"space_after": 6.0, // space after paragraph in points
"line_spacing": 22.4, // line spacing in points
"font_name": "Arial", // from first run
"font_size": 14.0, // in points
"bold": true,
"italic": false,
"underline": false,
"color": "FF0000" // RGB color
}
]
}
}
}
Key features:
default_font_size in points extracted from layout placeholders (when available)bullet: true, level is always included (even if 0)space_before, space_after, and line_spacing in points (only included when set)color for RGB (e.g., "FF0000"), theme_color for theme colors (e.g., "DARK_1")Generate replacement text and save the data to a JSON file Based on the text inventory from the previous step:
alignment property when "bullet": true"bold": true"bullet": true, "level": 0 (level is required when bullet is true)"alignment": "CENTER" for centered text)"font_size": 14.0, "font_name": "Lora")"color": "FF0000" for RGB or "theme_color": "DARK_1" for theme colorsreplacement-text.jsonExample paragraphs field showing proper formatting:
"paragraphs": [
{
"text": "New presentation title text",
"alignment": "CENTER",
"bold": true
},
{
"text": "Section Header",
"bold": true
},
{
"text": "First bullet point without bullet symbol",
"bullet": true,
"level": 0
},
{
"text": "Red colored text",
"color": "FF0000"
},
{
"text": "Theme colored text",
"theme_color": "DARK_1"
},
{
"text": "Regular paragraph text without special formatting"
}
]
Shapes not listed in the replacement JSON are automatically cleared:
{
"slide-0": {
"shape-0": {
"paragraphs": [...] // This shape gets new text
}
// shape-1 and shape-2 from inventory will be cleared automatically
}
}
Common formatting patterns for presentations:
"bullet": true, "level": 0Apply replacements using the replace.py script
python scripts/replace.py working.pptx replacement-text.json output.pptx
The script will:
Example validation errors:
ERROR: Invalid shapes in replacement JSON:
- Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4
- Slide 'slide-999' not found in inventory
ERROR: Replacement text made overflow worse in these shapes:
- slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")
To create visual thumbnail grids of PowerPoint slides for quick analysis and reference:
python scripts/thumbnail.py template.pptx [output_prefix]
Features:
thumbnails.jpg (or thumbnails-1.jpg, thumbnails-2.jpg, etc. for large decks)python scripts/thumbnail.py template.pptx my-grid
workspace/my-grid)--cols 4 (range: 3-6, affects slides per grid)Use cases:
Examples:
# Basic usage
python scripts/thumbnail.py presentation.pptx
# Combine options: custom name, columns
python scripts/thumbnail.py template.pptx analysis --cols 4
To visually analyze PowerPoint slides, convert them to images using a two-step process:
Convert PPTX to PDF:
soffice --headless --convert-to pdf template.pptx
Convert PDF pages to JPEG images:
pdftoppm -jpeg -r 150 template.pdf slide
This creates files like slide-1.jpg, slide-2.jpg, etc.
Options:
-r 150: Sets resolution to 150 DPI (adjust for quality/size balance)-jpeg: Output JPEG format (use -png for PNG if preferred)-f N: First page to convert (e.g., -f 2 starts from page 2)-l N: Last page to convert (e.g., -l 5 stops at page 5)slide: Prefix for output filesExample for specific range:
pdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide # Converts only pages 2-5
IMPORTANT: When generating code for PPTX operations:
Required dependencies (should already be installed):
pip install "markitdown[pptx]" (for text extraction from presentations)npm install -g pptxgenjs (for creating presentations via html2pptx)npm install -g playwright (for HTML rendering in html2pptx)npm install -g react-icons react react-dom (for icons in SVG format)brew install --cask libreofficesudo apt-get install libreofficesudo apt-get install poppler-utils (for pdftoppm to convert PDF to images)pip install defusedxml (for secure XML parsing)