Home
cd ../playbooks
Creative & DesignAdvanced

PowerPoint Manipulation Tool

Programmatically create and edit PowerPoint presentations with text, shapes, charts, and tables.

10 minutes
By communitySource
#pptx#powerpoint#manipulation#editing

You need to generate 20 personalized pitch decks for different clients, each with their logo, name, and custom data. Doing this manually in PowerPoint means 20 hours of copy-paste. Doing it programmatically means writing it once and running it 20 times.

Who it's for: sales teams generating personalized client presentations at scale, consultants producing templated deliverables for multiple clients, marketing teams batch-creating event or campaign presentations, data teams building automated report decks from databases, anyone who needs to create or modify many PowerPoint files programmatically

Example

"Generate 15 customized client pitch decks from our template" → Python script using python-pptx that merges client data from your spreadsheet into the template, swaps logos, updates charts with client-specific metrics, and exports 15 individually named PPTX files

CLAUDE.md Template

New here? 3-minute setup guide → | Already set up? Copy the template below.

# PPTX Manipulation

## Overview

This workflow enables programmatic creation, editing, and manipulation of Microsoft PowerPoint (.pptx) presentations using the **python-pptx** library. Create professional slides with text, shapes, images, charts, and tables without manual editing.

## How to Use

1. Describe the presentation you want to create or modify
2. Provide content, data, or images to include
3. I'll generate python-pptx code and execute it

**Example prompts:**
- "Create a 10-slide pitch deck from this outline"
- "Add a chart to slide 3 with this data"
- "Extract all text from this presentation"
- "Generate slides from this markdown content"

## Domain Knowledge

### python-pptx Fundamentals

```python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import PP_ALIGN

# Create new presentation
prs = Presentation()

# Or open existing
prs = Presentation('existing.pptx')
```

### Presentation Structure
```
Presentation
├── slide_layouts (predefined layouts)
├── slides (individual slides)
│   ├── shapes (text, images, charts)
│   │   ├── text_frame (paragraphs)
│   │   └── table (rows, cells)
│   └── placeholders (title, content)
└── slide_masters (templates)
```

### Slide Layouts
```python
# Common layout indices (may vary by template)
TITLE_SLIDE = 0
TITLE_CONTENT = 1
SECTION_HEADER = 2
TWO_CONTENT = 3
COMPARISON = 4
TITLE_ONLY = 5
BLANK = 6

# Add slide with layout
slide_layout = prs.slide_layouts[TITLE_CONTENT]
slide = prs.slides.add_slide(slide_layout)
```

### Adding Content

#### Title Slide
```python
slide_layout = prs.slide_layouts[0]  # Title slide
slide = prs.slides.add_slide(slide_layout)

title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Quarterly Report"
subtitle.text = "Q4 2024 Performance Review"
```

#### Text Content
```python
# Using placeholder
body = slide.placeholders[1]
tf = body.text_frame
tf.text = "First bullet point"

# Add more paragraphs
p = tf.add_paragraph()
p.text = "Second bullet point"
p.level = 0

p = tf.add_paragraph()
p.text = "Sub-bullet"
p.level = 1
```

#### Text Box
```python
from pptx.util import Inches, Pt

left = Inches(1)
top = Inches(2)
width = Inches(4)
height = Inches(1)

txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame

p = tf.paragraphs[0]
p.text = "Custom text box"
p.font.bold = True
p.font.size = Pt(18)
```

#### Shapes
```python
from pptx.enum.shapes import MSO_SHAPE

# Rectangle
shape = slide.shapes.add_shape(
    MSO_SHAPE.RECTANGLE,
    Inches(1), Inches(2),  # left, top
    Inches(3), Inches(1.5) # width, height
)
shape.text = "Rectangle with text"

# Common shapes:
# MSO_SHAPE.RECTANGLE, ROUNDED_RECTANGLE
# MSO_SHAPE.OVAL, CHEVRON, ARROW_RIGHT
# MSO_SHAPE.CALLOUT_ROUNDED_RECTANGLE
```

#### Images
```python
# Add image
slide.shapes.add_picture(
    'image.png',
    Inches(1), Inches(2),  # position
    width=Inches(4)        # auto height
)

# Or specify both dimensions
slide.shapes.add_picture(
    'logo.png',
    Inches(8), Inches(0.5),
    Inches(1.5), Inches(0.75)
)
```

### Tables
```python
# Create table
rows, cols = 4, 3
left = Inches(1)
top = Inches(2)
width = Inches(8)
height = Inches(2)

table = slide.shapes.add_table(rows, cols, left, top, width, height).table

# Set column widths
table.columns[0].width = Inches(2)
table.columns[1].width = Inches(3)
table.columns[2].width = Inches(3)

# Add headers
headers = ['Product', 'Q3 Sales', 'Q4 Sales']
for i, header in enumerate(headers):
    cell = table.cell(0, i)
    cell.text = header
    cell.text_frame.paragraphs[0].font.bold = True

# Add data
data = [
    ['Widget A', '$10,000', '$12,500'],
    ['Widget B', '$8,000', '$9,200'],
    ['Widget C', '$15,000', '$18,000'],
]
for row_idx, row_data in enumerate(data, 1):
    for col_idx, value in enumerate(row_data):
        table.cell(row_idx, col_idx).text = value
```

### Charts
```python
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE

# Chart data
chart_data = CategoryChartData()
chart_data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
chart_data.add_series('Sales', (19.2, 21.4, 16.7, 23.8))
chart_data.add_series('Expenses', (12.1, 15.3, 14.2, 18.1))

# Add chart
x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(4)
chart = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED,
    x, y, cx, cy, chart_data
).chart

# Customize
chart.has_legend = True
chart.legend.include_in_layout = False
```

### Formatting

#### Text Formatting
```python
from pptx.dml.color import RGBColor

run = p.runs[0]
run.font.name = 'Arial'
run.font.size = Pt(24)
run.font.bold = True
run.font.italic = True
run.font.color.rgb = RGBColor(0x00, 0x66, 0xCC)
```

#### Shape Fill & Line
```python
from pptx.dml.color import RGBColor

shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0x00, 0x80, 0x00)

shape.line.color.rgb = RGBColor(0x00, 0x00, 0x00)
shape.line.width = Pt(2)
```

#### Paragraph Alignment
```python
from pptx.enum.text import PP_ALIGN

p.alignment = PP_ALIGN.CENTER  # LEFT, RIGHT, JUSTIFY
```

## Best Practices

1. **Use Templates**: Start with a .pptx template for consistent branding
2. **Layout First**: Plan slide structure before coding
3. **Reuse Slide Masters**: Maintain consistency across presentations
4. **Optimize Images**: Compress images before adding
5. **Test Output**: Always verify generated presentations

## Common Patterns

### Slide Deck Generator
```python
def create_deck(title, slides_content):
    prs = Presentation()
    
    # Title slide
    slide = prs.slides.add_slide(prs.slide_layouts[0])
    slide.shapes.title.text = title
    
    # Content slides
    for slide_data in slides_content:
        slide = prs.slides.add_slide(prs.slide_layouts[1])
        slide.shapes.title.text = slide_data['title']
        
        body = slide.placeholders[1]
        tf = body.text_frame
        for i, point in enumerate(slide_data['points']):
            if i == 0:
                tf.text = point
            else:
                p = tf.add_paragraph()
                p.text = point
    
    return prs
```

### Data-Driven Charts
```python
def add_bar_chart(slide, title, categories, values):
    from pptx.chart.data import CategoryChartData
    from pptx.enum.chart import XL_CHART_TYPE
    
    chart_data = CategoryChartData()
    chart_data.categories = categories
    chart_data.add_series('Values', values)
    
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.BAR_CLUSTERED,
        Inches(1), Inches(2),
        Inches(8), Inches(4),
        chart_data
    ).chart
    
    chart.chart_title.text_frame.text = title
    return chart
```

## Examples

### Example 1: Create a Pitch Deck
```python
from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# Slide 1: Title
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "StartupX"
slide.placeholders[1].text = "Revolutionizing Document Processing"

# Slide 2: Problem
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "The Problem"
body = slide.placeholders[1].text_frame
body.text = "Manual document processing costs businesses $1T annually"
p = body.add_paragraph()
p.text = "Average worker spends 20% of time on document tasks"
p.level = 1

# Slide 3: Solution
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Our Solution"
body = slide.placeholders[1].text_frame
body.text = "AI-powered document automation"
body.add_paragraph().text = "90% faster processing"
body.add_paragraph().text = "99.5% accuracy"
body.add_paragraph().text = "Works with existing tools"

# Slide 4: Market
slide = prs.slides.add_slide(prs.slide_layouts[5])  # Title only
slide.shapes.title.text = "Market Opportunity: $50B by 2028"

# Add chart
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE

data = CategoryChartData()
data.categories = ['2024', '2025', '2026', '2027', '2028']
data.add_series('Market Size ($B)', [30, 35, 40, 45, 50])

slide.shapes.add_chart(
    XL_CHART_TYPE.LINE,
    Inches(1), Inches(1.5),
    Inches(8), Inches(5),
    data
)

prs.save('pitch_deck.pptx')
```

### Example 2: Report with Data Table
```python
from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# Title slide
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Sales Performance Report"
slide.placeholders[1].text = "Q4 2024"

# Data slide
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.title.text = "Regional Performance"

# Create table
table = slide.shapes.add_table(5, 4, Inches(0.5), Inches(1.5), Inches(9), Inches(4)).table

# Headers
headers = ['Region', 'Revenue', 'Growth', 'Target']
for i, h in enumerate(headers):
    table.cell(0, i).text = h
    table.cell(0, i).text_frame.paragraphs[0].font.bold = True

# Data
data = [
    ['North America', '$5.2M', '+15%', 'Met'],
    ['Europe', '$3.8M', '+12%', 'Met'],
    ['Asia Pacific', '$2.9M', '+28%', 'Exceeded'],
    ['Latin America', '$1.1M', '+8%', 'Below'],
]
for row_idx, row_data in enumerate(data, 1):
    for col_idx, value in enumerate(row_data):
        table.cell(row_idx, col_idx).text = value

prs.save('sales_report.pptx')
```

## Limitations

- Cannot render complex animations
- Limited SmartArt support
- No video embedding via API
- Master slide editing is complex
- Chart types limited to standard Office charts

## Installation

```bash
pip install python-pptx
```

## Resources

- [python-pptx Documentation](https://python-pptx.readthedocs.io/)
- [GitHub Repository](https://github.com/scanny/python-pptx)
- [Slide Layout Guide](https://python-pptx.readthedocs.io/en/latest/user/slides.html)
README.md

What This Does

This workflow enables programmatic creation, editing, and manipulation of Microsoft PowerPoint (.pptx) presentations using the python-pptx library. Create professional slides with text, shapes, images, charts, and tables without manual editing.


Quick Start

Step 1: Create a Project Folder

mkdir -p ~/Documents/PptxManipulation

Step 2: Download the Template

Click Download above, then:

mv ~/Downloads/CLAUDE.md ~/Documents/PptxManipulation/

Step 3: Start Working

cd ~/Documents/PptxManipulation
claude

How to Use

  1. Describe the presentation you want to create or modify
  2. Provide content, data, or images to include
  3. I'll generate python-pptx code and execute it

Example prompts:

  • "Create a 10-slide pitch deck from this outline"
  • "Add a chart to slide 3 with this data"
  • "Extract all text from this presentation"
  • "Generate slides from this markdown content"

Best Practices

  1. Use Templates: Start with a .pptx template for consistent branding
  2. Layout First: Plan slide structure before coding
  3. Reuse Slide Masters: Maintain consistency across presentations
  4. Optimize Images: Compress images before adding
  5. Test Output: Always verify generated presentations

Examples

Example 1: Create a Pitch Deck

from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# Slide 1: Title
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "StartupX"
slide.placeholders[1].text = "Revolutionizing Document Processing"

# Slide 2: Problem
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "The Problem"
body = slide.placeholders[1].text_frame
body.text = "Manual document processing costs businesses $1T annually"
p = body.add_paragraph()
p.text = "Average worker spends 20% of time on document tasks"
p.level = 1

# Slide 3: Solution
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "Our Solution"
body = slide.placeholders[1].text_frame
body.text = "AI-powered document automation"
body.add_paragraph().text = "90% faster processing"
body.add_paragraph().text = "99.5% accuracy"
body.add_paragraph().text = "Works with existing tools"

# Slide 4: Market
slide = prs.slides.add_slide(prs.slide_layouts[5])  # Title only
slide.shapes.title.text = "Market Opportunity: $50B by 2028"

# Add chart
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE

data = CategoryChartData()
data.categories = ['2024', '2025', '2026', '2027', '2028']
data.add_series('Market Size ($B)', [30, 35, 40, 45, 50])

slide.shapes.add_chart(
    XL_CHART_TYPE.LINE,
    Inches(1), Inches(1.5),
    Inches(8), Inches(5),
    data
)

prs.save('pitch_deck.pptx')

Example 2: Report with Data Table

from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# Title slide
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Sales Performance Report"
slide.placeholders[1].text = "Q4 2024"

# Data slide
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.title.text = "Regional Performance"

# Create table
table = slide.shapes.add_table(5, 4, Inches(0.5), Inches(1.5), Inches(9), Inches(4)).table

# Headers
headers = ['Region', 'Revenue', 'Growth', 'Target']
for i, h in enumerate(headers):
    table.cell(0, i).text = h
    table.cell(0, i).text_frame.paragraphs[0].font.bold = True

# Data
data = [
    ['North America', '$5.2M', '+15%', 'Met'],
    ['Europe', '$3.8M', '+12%', 'Met'],
    ['Asia Pacific', '$2.9M', '+28%', 'Exceeded'],
    ['Latin America', '$1.1M', '+8%', 'Below'],
]
for row_idx, row_data in enumerate(data, 1):
    for col_idx, value in enumerate(row_data):
        table.cell(row_idx, col_idx).text = value

prs.save('sales_report.pptx')

Limitations

  • Cannot render complex animations
  • Limited SmartArt support
  • No video embedding via API
  • Master slide editing is complex
  • Chart types limited to standard Office charts

Installation

pip install python-pptx

$Related Playbooks