name: processing-pptx description: Creates, reads, and modifies PowerPoint presentations (.pptx, .potx) with python-pptx — slides, layouts, text, tables, images, charts. Use when the user asks to create, build, read, edit, or fix a presentation, deck, or slides, or mentions .pptx/.potx files or PowerPoint. Do not use for Word documents, PDFs, or Google Slides.
Processing PPTX
When to use / when NOT to use
- Use for: creating, reading, or modifying
.pptxand.potxfiles — slides, text, tables, images, charts, speaker notes. - Do NOT use for: Word documents, PDFs, or Google Slides (different API).
Quick reference
Default library: python-pptx. Visual verification: LibreOffice render to PDF/images when layout correctness matters.
Create:
python
from pptx import Presentation
from pptx.util import Inches, Pt
prs = Presentation() # 4:3 default; set 16:9 explicitly:
prs.slide_width, prs.slide_height = Inches(13.333), Inches(7.5)
slide = prs.slides.add_slide(prs.slide_layouts[0]) # 0 = title slide
slide.shapes.title.text = "Q3 Results"
slide.placeholders[1].text = "Finance Team — 2026"
prs.save("deck.pptx")Read:
python
from pptx import Presentation
for i, slide in enumerate(Presentation("deck.pptx").slides, 1):
for shape in slide.shapes:
if shape.has_text_frame:
print(i, shape.text_frame.text)Modify:
python
prs = Presentation("deck.pptx")
slide = prs.slides[1]
for shape in slide.shapes:
if shape.has_text_frame and "draft" in shape.text_frame.text.lower():
shape.text_frame.text = shape.text_frame.text.replace("Draft", "Final")
prs.save("deck.pptx")Visual check (when layout matters):
bash
soffice --headless --convert-to pdf deck.pptx # then inspect pages for overflow/overlapDesign rules
- Safe fonts only: Arial or Calibri.
- Keep ≥0.5" margins; body text ≥14pt, titles ≥28pt.
- No text-only slides in a finished deck — add an image, chart, or table per slide where content allows.
- Build a new deck from an existing template (
Presentation("template.potx")) when the user has one; reuse its layouts instead of drawing boxes manually.
Workflow
- Classify the task: create / read / modify.
- Creating: start from the user's template if provided, else default template with 16:9 size. Use slide layouts and placeholders, not free-floating text boxes, so themes apply.
- Modifying: read all slides first; edit in place, preserving each shape's position and formatting.
- Validate: re-open with
Presentation(path)— if it raises, fix before delivering. Count slides and confirm expected titles. - If the deck is a final deliverable, render via
soffice --headless --convert-to pdfand check for text overflow, overlap, and contrast. - Report the output path, slide count, and what changed.
Edge cases & failure modes
- python-pptx missing →
pip install python-pptx. LibreOffice missing →brew install --cask libreoffice(only needed for visual checks/conversion). - Corrupt / not a zip →
Presentation()raisesPackageNotFoundError; report invalid pptx, stop. - Password-protected file → python-pptx cannot decrypt; ask for an unprotected copy.
.ppt(legacy binary) → unsupported; convert first:soffice --headless --convert-to pptx file.ppt.- Text overflowing its box → python-pptx cannot measure rendered text; shorten text or reduce font size, then re-render to verify.
References
Deeper recipes (bullets, tables, images, charts, speaker notes, template reuse, per-slide deletion, conversion, gotchas): see references/recipes.md.