pptx-manipulation

>

INSTALLATION
npx skills add https://github.com/claude-office-skills/skills --skill pptx-manipulation
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

PPTX Manipulation Skill

Overview

This skill 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

  • Describe the presentation you want to create or modify
  • Provide content, data, or images to include
  • 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

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

# 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

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

# 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

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

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

# 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

# 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

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

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

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

from pptx.enum.text import PP_ALIGN

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

Best Practices

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

Common Patterns

Slide Deck Generator

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

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

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

Resources

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card