Pptx
Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.
- Skill ID
- anthropics/skills/pptx
- Publisher
- anthropics
- Repository
- skills
- Installs
- 753
- Files
- 56
- License
- Proprietary
- Synced
- Sep 16, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
anthropics/skills/pptxInstalls these files- LICENSE.txt
- SKILL.md
- scripts/__init__.py
- scripts/add_slide.py
- scripts/clean.py
- scripts/office/helpers/__init__.py
- scripts/office/helpers/pptx_chart.py
- scripts/office/helpers/pptx_slide.py
- scripts/office/helpers/pptx_theme.py
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd
- scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd
- scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd
- scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd
- scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd
- scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd
- scripts/office/schemas/mce/mc.xsd
- scripts/office/schemas/microsoft/wml-2010.xsd
- scripts/office/schemas/microsoft/wml-2012.xsd
- scripts/office/schemas/microsoft/wml-2018.xsd
- scripts/office/schemas/microsoft/wml-cex-2018.xsd
- scripts/office/schemas/microsoft/wml-cid-2016.xsd
- scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd
- scripts/office/schemas/microsoft/wml-symex-2015.xsd
- scripts/office/soffice.py
- scripts/office/validate.py
- scripts/office/validators/__init__.py
- scripts/office/validators/base.py
- scripts/office/validators/docx.py
- scripts/office/validators/pptx.py
- scripts/office/validators/redlining.py
- scripts/thumbnail.py
What this skill tells the agent
PPTX creation, editing, and analysis
A .pptx is a ZIP archive of XML files. Choose your approach by task:
| Task | Approach |
|---|---|
| Create a new deck | Write a pptxgenjs script — see gotchas below |
| Edit an existing deck, or build from a template | unzip → edit ppt/slides/slideN.xml → zip |
| Read content | markitdown deck.pptx (one block per slide under <!-- Slide number: N --> markers); visual grid: python scripts/thumbnail.py deck.pptx |
Scripts
Paths are relative to this skill's directory. Everything else is plain Python, node, or shell.
| Script | What it does |
|---|---|
scripts/thumbnail.py deck.pptx [prefix] | Labeled grid of every slide, for picking template layouts. .pptx only. Pass prefix — it defaults to thumbnails, which overwrites the grids of any other deck done in the same directory |
scripts/add_slide.py unpacked/ slide2.xml [--after slideN.xml] | Duplicate a slide (or a slideLayoutN.xml) with all the package bookkeeping. Also takes a .pptx directly with -o out.pptx |
scripts/clean.py unpacked/ | Delete slides, media, and rels no longer referenced. Run after <p:sldIdLst> is final |
scripts/office/validate.py deck.pptx [--original src.pptx] | Schema, relationship, content-type, chart and slide checks; each failure names its fix. Pass --original for any template-derived deck — it baselines the schema checks against the template, so the template's own XSD errors don't read as yours |
scripts/office/soffice.py --headless --convert-to pdf deck.pptx | LibreOffice wrapper — bare soffice hangs in this sandbox |
Creating with pptxgenjs — gotchas
pptxgenjs is preinstalled — do not run npm install first; write the script and require('pptxgenjs') directly. Only if that require fails: npm install pptxgenjs. The model knows the API; these are the footguns:
- Set `pres.layout` before adding slides. The default canvas is
LAYOUT_16x9= 10" × 5.625", not 13.3" wide. Coordinates past the edge are written, not clamped — the shape just isn't on the slide. (LAYOUT_WIDEis 13.3" × 7.5".) - Hex colors: never `#`, never 8 digits.
color: "FF0000". Both"#FF0000"and alpha baked into the hex ("00000020") corrupt the file. For translucency:transparency: 0-100on fills and images,opacity: 0.0-1.0on shadows — each is silently ignored on the other. - pptxgenjs mutates option objects in place (converts values to EMU on first use). Never share one
shadow/options object across twoadd*calls — build a fresh object each time. - Shadow `offset` must be ≥ 0 — a negative offset corrupts the file. To cast a shadow upward, use
angle: 270with a positive offset. - `letterSpacing` is silently ignored — the real option is
charSpacing. - Lists:
bullet: trueon each item, never a literal•(renders double bullets). SetbreakLine: trueon every array item except the last. Space bulleted paragraphs withparaSpaceAfter, notlineSpacing(huge gaps). - One `new pptxgen()` per output file — never reuse an instance.
- `rectRadius` only works on `ROUNDED_RECTANGLE`, not
RECTANGLE. - Gradient fills aren't supported — use a gradient image as the background instead.
- Text boxes have built-in internal padding — set
margin: 0whenever text must align with a shape, line, or icon at the same x. - Speaker notes go in `slide.addNotes("...")` (plain text, once per slide), never in a text box on the slide.
- Keep charts native. Use
addChart()for everything PowerPoint can chart (pass an array of{type, data, options}for combos). For PowerPoint-native features the library doesn't expose (trendlines, error bars), compute the extra series yourself or post-process the generated OOXML — do not fall back to a rendered image. Only chart types PowerPoint has no native form for (Sankey, network, chord) go in as images. - Default charts render bare — no title, no data labels, dated palette. Set
showTitle+title,showValue: true+dataLabelPosition,chartColors: [...]from your palette, and quiet the frame (catAxisLabelColor/valAxisLabelColor,valGridLine: { color, size },catGridLine: { style: "none" },showLegend: falsefor a single series). - On a stacked bar or column chart, `dataLabelPosition` must be `ctr`, `inEnd`, or `inBase`.
outEndcorrupts the file. - A combo series using `secondaryValAxis`/`secondaryCatAxis` needs both `valAxes` and `catAxes` on the chart options, two entries each. Without them pptxgenjs writes axis ids it never declares, and PowerPoint discards that chart and reports the file as corrupt. Supplying only
valAxesis not enough. - After `writeFile()`, run `python scripts/office/validate.py deck.pptx`. It reports the two chart faults above and the slide-XML defects PowerPoint refuses, and names the fix for each. Fix them in your generator, not by hand-editing the packed XML.
- Never reorder the children of `<p:presentation>`. pptxgenjs writes
<p:notesMasterIdLst>right after<p:sldIdLst>and points both masters at one theme part. PowerPoint reads that happily — move the element and the same deck becomes unopenable. - Icons: render
react-iconsto SVG (ReactDOMServer.renderToStaticMarkup), rasterize withsharpat ≥256px, and insert viaaddImage({ data: "image/png;base64," + buf.toString("base64") })— theimage/png;base64,prefix is required (react-icons,react,react-dom, andsharpare preinstalled —npm install react-icons react react-dom sharponly if a require fails).
Editing existing decks and templates
Pick layouts first: python scripts/thumbnail.py template.pptx template-thumbs writes a labeled grid of every slide and prints the file(s) it created — template-thumbs.jpg, split into template-thumbs-N.jpg past 12 slides. Always pass that second argument, named after the deck. It defaults to thumbnails, so two decks thumbnailed in one directory silently overwrite each other's grids — the first deck's are simply gone (template analysis only — visual QA needs the full-resolution renders from Converting to Images; it only accepts .pptx, so copy a .potx to a .pptx name first). Use it with markitdown to map each content section onto a template slide, and vary the layouts — don't put every section on the same title-and-bullets slide.
python3 -c "import sys,zipfile; zipfile.ZipFile(sys.argv[1]).extractall('unpacked')" deck.pptx
python scripts/add_slide.py unpacked/ slide2.xml --after slide2.xml # duplicate a slide (or slideLayoutN.xml); prints the new slide's path
# reorder / delete slides = edit <p:sldIdLst> in ppt/presentation.xml
python scripts/clean.py unpacked/ # after deletions: removes orphaned slides, media, rels
# edit slide content in ppt/slides/slideN.xml
(cd unpacked && rm -f ../out.pptx && zip -Xr ../out.pptx .) # zip from INSIDE the dir; rm first or deleted parts survive
python scripts/office/validate.py out.pptx --original deck.pptx- Do all structural work — add, delete, reorder — before editing any slide's content.
add_slide.pycopies a slide file verbatim, so duplicating after you edit clones the edited content; andclean.pydeletes any slide missing from<p:sldIdLst>, including one you just wrote. - Never copy a slide file by hand —
add_slide.pydoes every registration a new slide needs and reports what it made (Created ppt/slides/slide17.xml from slide2.xml). It also works directly on a file:add_slide.py deck.pptx slide2.xml -o out.pptx— pass `-o`, or it rewrites the input deck in place. A duplicated slide still references its source's chart/SmartArt/embedded-object parts rather than cloning them, so editing one slide's chart changes the other's.
