pptx

GitHub

提供使用 python-pptx 库进行 PowerPoint 文件读取、创建及编辑的指南,涵盖文本提取、幻灯片布局选择、格式设置及形状添加等核心操作。

backend/app/data/skills/pptx/SKILL.md openyak/openyak

Trigger Scenarios

用户需要生成或修改 PPTX 演示文稿 需要从 PPTX 文件中提取文本或表格数据

Install

npx skills add openyak/openyak --skill pptx -g -y
More Options

Non-standard path

npx skills add https://github.com/openyak/openyak/tree/main/backend/app/data/skills/pptx -g -y

Use without installing

npx skills use openyak/openyak@pptx

指定 Agent (Claude Code)

npx skills add openyak/openyak --skill pptx -a claude-code -g -y

安装 repo 全部 skill

npx skills add openyak/openyak --all -g -y

预览 repo 内 skill

npx skills add openyak/openyak --list

SKILL.md

Frontmatter
{
    "name": "pptx",
    "description": "PowerPoint presentation processing — reading, creating with python-pptx, slide layouts, text\/images\/charts, editing via XML, design principles."
}

PowerPoint Presentation (PPTX) Processing

When the user needs to read, create, or edit PowerPoint files, follow this guide.

For content design and storytelling guidance, also load the presentation skill.

1. Reading PPTX files

Quick text extraction

Use the read tool directly — it natively extracts slide text:

read(file_path="deck.pptx")

Returns slide-by-slide text content including table data.

Detailed access

from pptx import Presentation

prs = Presentation("deck.pptx")

for i, slide in enumerate(prs.slides, 1):
    print(f"\n=== Slide {i} ===")
    print(f"Layout: {slide.slide_layout.name}")
    for shape in slide.shapes:
        print(f"  Shape: {shape.shape_type}, Name: {shape.name}")
        if shape.has_text_frame:
            for para in shape.text_frame.paragraphs:
                print(f"    Text: {para.text}")
        if shape.has_table:
            for row in shape.table.rows:
                print(f"    Table row: {[cell.text for cell in row.cells]}")

# Slide dimensions
print(f"Width: {prs.slide_width}, Height: {prs.slide_height}")

2. Creating presentations

Basic presentation

from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

prs = Presentation()

# Slide size (16:9 widescreen)
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)

# --- Title slide ---
layout = prs.slide_layouts[0]  # Title Slide
slide = prs.slides.add_slide(layout)
slide.shapes.title.text = "Quarterly Review"
slide.placeholders[1].text = "Q3 2025 Results"

# --- Content slide ---
layout = prs.slide_layouts[1]  # Title and Content
slide = prs.slides.add_slide(layout)
slide.shapes.title.text = "Key Highlights"

body = slide.placeholders[1]
tf = body.text_frame
tf.text = "Revenue grew 15% year-over-year"

p = tf.add_paragraph()
p.text = "Operating margins improved to 22%"
p.level = 0

p = tf.add_paragraph()
p.text = "New customer acquisitions up 30%"
p.level = 0

prs.save("quarterly.pptx")

Slide layouts

Standard slide layouts (by index):

Index Name Use case
0 Title Slide First slide
1 Title and Content Main content
2 Section Header Section divider
3 Two Content Side-by-side
4 Comparison Compare two items
5 Title Only Custom layout
6 Blank Fully custom

Text formatting

from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN

# Paragraph alignment
para.alignment = PP_ALIGN.CENTER

# Run formatting
run = para.add_run()
run.text = "Bold red text"
run.font.bold = True
run.font.size = Pt(24)
run.font.color.rgb = RGBColor(0xFF, 0x00, 0x00)
run.font.name = "Arial"
run.font.italic = True
run.font.underline = True

Adding shapes

from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE

slide = prs.slides.add_slide(prs.slide_layouts[6])  # Blank

# Text box
from pptx.util import Inches
txBox = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(5), Inches(1.5))
tf = txBox.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.text = "This is a text box"
p.font.size = Pt(18)

# Rectangle
shape = slide.shapes.add_shape(
    MSO_SHAPE.RECTANGLE,
    Inches(1), Inches(3), Inches(3), Inches(1.5)
)
shape.text = "Rectangle"
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0x44, 0x72, 0xC4)

# Rounded rectangle
shape = slide.shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE,
    Inches(5), Inches(3), Inches(3), Inches(1.5)
)
shape.text = "Rounded"

Images

slide.shapes.add_picture(
    "chart.png",
    Inches(1), Inches(2),       # left, top
    width=Inches(5),            # auto-height to preserve ratio
)

# Or specify both dimensions
slide.shapes.add_picture(
    "logo.png",
    Inches(0.5), Inches(0.5),
    width=Inches(2), height=Inches(1),
)

Tables

rows, cols = 4, 3
table_shape = slide.shapes.add_table(rows, cols, Inches(1), Inches(2), Inches(8), Inches(3))
table = table_shape.table

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

# Headers
headers = ["Product", "Revenue", "Growth"]
for i, header in enumerate(headers):
    cell = table.cell(0, i)
    cell.text = header
    for para in cell.text_frame.paragraphs:
        para.font.bold = True
        para.font.size = Pt(14)

# Data
data = [
    ["Widget A", "$1.2M", "+15%"],
    ["Widget B", "$800K", "+8%"],
    ["Widget C", "$2.1M", "+22%"],
]
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 = CategoryChartData()
chart_data.categories = ["Q1", "Q2", "Q3", "Q4"]
chart_data.add_series("Revenue", (1200, 1350, 1100, 1500))
chart_data.add_series("Profit", (300, 400, 280, 450))

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED,
    Inches(1), Inches(2),
    Inches(8), Inches(4),
    chart_data,
).chart

chart.has_legend = True
chart.legend.include_in_layout = False

3. Editing existing presentations

Simple modifications

from pptx import Presentation

prs = Presentation("existing.pptx")

# Modify text
for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            for para in shape.text_frame.paragraphs:
                for run in para.runs:
                    if "OLD" in run.text:
                        run.text = run.text.replace("OLD", "NEW")

# Delete a slide
rId = prs.slides._sldIdLst[2].get("r:id")  # 3rd slide (0-indexed)
prs.part.drop_rel(rId)
del prs.slides._sldIdLst[2]

prs.save("modified.pptx")

XML-level editing (advanced)

PPTX files are ZIP archives. For complex edits, unpack → modify XML → repack:

import zipfile
import os

def unpack_pptx(pptx_path, output_dir):
    with zipfile.ZipFile(pptx_path, "r") as z:
        z.extractall(output_dir)

def pack_pptx(input_dir, pptx_path):
    with zipfile.ZipFile(pptx_path, "w", zipfile.ZIP_DEFLATED) as z:
        for root, dirs, files in os.walk(input_dir):
            for file in files:
                file_path = os.path.join(root, file)
                arcname = os.path.relpath(file_path, input_dir)
                z.write(file_path, arcname)

Key XML files in a PPTX

Path Content
ppt/presentation.xml Main presentation structure
ppt/slides/slide1.xml Individual slide content
ppt/slideLayouts/ Slide layout templates
ppt/slideMasters/ Slide master templates
ppt/theme/theme1.xml Theme (colors, fonts)
ppt/media/ Images and media files

4. Design principles

Slide design best practices

  • One message per slide — each slide should convey a single key point
  • 6x6 rule — max 6 bullet points, max 6 words per bullet
  • Conclusion-driven titles — "Revenue grew 15%" not "Revenue Overview"
  • Consistent spacing — maintain uniform margins (min 0.5 inch)
  • Visual variety — vary layouts to keep audience engaged
  • High contrast — ensure text is readable against backgrounds

Color palette suggestions

Style Colors
Business Navy #003366, Gray #666666, Accent #0066CC
Tech Dark #1A1A2E, Teal #16213E, Accent #0F3460
Creative Coral #FF6B6B, Teal #4ECDC4, Cream #F7FFF7
Minimal Black #000000, White #FFFFFF, Gray #CCCCCC

5. Dependencies

Core (included with Muse):

  • python-pptx — read, create, edit presentations

Optional:

  • Pillow — image processing: pip install Pillow

Version History

  • bd88bff Current 2026-07-25 08:58

Same Skill Collection

backend/app/data/skills/algorithmic-art/SKILL.md
backend/app/data/skills/bootstrap/SKILL.md
backend/app/data/skills/canvas-design/SKILL.md
backend/app/data/skills/charting/SKILL.md
backend/app/data/skills/data-analysis/SKILL.md
backend/app/data/skills/doc-coauthoring/SKILL.md
backend/app/data/skills/document-summary/SKILL.md
backend/app/data/skills/docx/SKILL.md
backend/app/data/skills/email/SKILL.md
backend/app/data/skills/frontend-design/SKILL.md
backend/app/data/skills/github-deep-research/SKILL.md
backend/app/data/skills/mcp-builder/SKILL.md
backend/app/data/skills/meeting-notes/SKILL.md
backend/app/data/skills/pdf/SKILL.md
backend/app/data/skills/presentation/SKILL.md
backend/app/data/skills/project-planning/SKILL.md
backend/app/data/skills/report/SKILL.md
backend/app/data/skills/research/SKILL.md
backend/app/data/skills/skill-creator/SKILL.md
backend/app/data/skills/theme-factory/SKILL.md
backend/app/data/skills/translation/SKILL.md
backend/app/data/skills/web-artifacts-builder/SKILL.md
backend/app/data/skills/webapp-testing/SKILL.md
backend/app/data/skills/xlsx/SKILL.md

Metadata

Files
0
Version
067fd4a
Hash
521e3c4f
Indexed
2026-07-25 08:58

inicio - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-08-25 07:34
浙ICP备14020137号-1 $mapa de visitantes$