pptx

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

PPTX Skill

PPTX 技能

Read, modify, and create Microsoft PowerPoint presentations with support for templates, charts, tables, and professional formatting.
读取、修改和创建Microsoft PowerPoint演示文稿,支持模板、图表、表格和专业格式设置。

Capabilities

功能特性

  • Read Presentations: Extract text, images, and notes from PPTX files
  • Create Presentations: Generate new presentations from scratch or templates
  • Modify Presentations: Edit existing slides, add or remove content
  • Charts & Tables: Add data visualizations and formatted tables
  • Template-Based Generation: Use corporate templates for consistency
  • Markdown Conversion: Convert markdown content to presentation slides
  • 读取演示文稿:从PPTX文件中提取文本、图片和备注
  • 创建演示文稿:从零开始或基于模板生成新演示文稿
  • 修改演示文稿:编辑现有幻灯片、添加或删除内容
  • 图表与表格:添加数据可视化和格式化表格
  • 基于模板生成:使用企业模板确保格式一致性
  • Markdown转换:将Markdown内容转换为演示文稿幻灯片

Quick Start

快速开始

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

Create a presentation

Create a presentation

prs = Presentation()
prs = Presentation()

Add a title slide

Add a title slide

title_slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(title_slide_layout) title = slide.shapes.title subtitle = slide.placeholders[1]
title.text = "Security Assessment" subtitle.text = "Q1 2024 Executive Summary"
prs.save('presentation.pptx')
undefined
title_slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(title_slide_layout) title = slide.shapes.title subtitle = slide.placeholders[1]
title.text = "Security Assessment" subtitle.text = "Q1 2024 Executive Summary"
prs.save('presentation.pptx')
undefined

Usage

使用方法

Reading Presentations

读取演示文稿

Extract content from existing PowerPoint files.
Input: Path to a PPTX file
Process:
  1. Open presentation with python-pptx
  2. Iterate through slides
  3. Extract text, shapes, and notes
Example:
python
from pptx import Presentation
from pathlib import Path

def extract_presentation_content(file_path: Path) -> dict:
    """Extract all content from a PowerPoint presentation."""
    prs = Presentation(file_path)
    content = {
        'slide_count': len(prs.slides),
        'slides': []
    }

    for slide_num, slide in enumerate(prs.slides, 1):
        slide_content = {
            'number': slide_num,
            'text': [],
            'notes': ''
        }

        # Extract text from shapes
        for shape in slide.shapes:
            if hasattr(shape, 'text') and shape.text:
                slide_content['text'].append(shape.text)

        # Extract notes
        if slide.has_notes_slide:
            notes_slide = slide.notes_slide
            if notes_slide.notes_text_frame:
                slide_content['notes'] = notes_slide.notes_text_frame.text

        content['slides'].append(slide_content)

    return content
从现有PowerPoint文件中提取内容。
输入:PPTX文件路径
流程:
  1. 使用python-pptx打开演示文稿
  2. 遍历所有幻灯片
  3. 提取文本、形状和备注
示例:
python
from pptx import Presentation
from pathlib import Path

def extract_presentation_content(file_path: Path) -> dict:
    """Extract all content from a PowerPoint presentation."""
    prs = Presentation(file_path)
    content = {
        'slide_count': len(prs.slides),
        'slides': []
    }

    for slide_num, slide in enumerate(prs.slides, 1):
        slide_content = {
            'number': slide_num,
            'text': [],
            'notes': ''
        }

        # Extract text from shapes
        for shape in slide.shapes:
            if hasattr(shape, 'text') and shape.text:
                slide_content['text'].append(shape.text)

        # Extract notes
        if slide.has_notes_slide:
            notes_slide = slide.notes_slide
            if notes_slide.notes_text_frame:
                slide_content['notes'] = notes_slide.notes_text_frame.text

        content['slides'].append(slide_content)

    return content

Usage

Usage

content = extract_presentation_content(Path('briefing.pptx')) for slide in content['slides']: print(f"\n--- Slide {slide['number']} ---") for text in slide['text']: print(text)
undefined
content = extract_presentation_content(Path('briefing.pptx')) for slide in content['slides']: print(f"\n--- Slide {slide['number']} ---") for text in slide['text']: print(text)
undefined

Creating Presentations

创建演示文稿

Generate PowerPoint files from scratch.
Input: Content to include in slides
Process:
  1. Create Presentation object
  2. Add slides using layouts
  3. Populate content
  4. Save to file
Example:
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN

def create_presentation(title: str, slides_content: list, output_path: str):
    """Create a presentation with multiple slides."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = title
    title_slide.placeholders[1].text = "Prepared by Security Team"

    # Content slides
    for slide_info in slides_content:
        slide_type = slide_info.get('type', 'bullet')

        if slide_type == 'bullet':
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = slide_info['title']

            body = slide.placeholders[1]
            tf = body.text_frame

            for i, point in enumerate(slide_info.get('points', [])):
                if i == 0:
                    tf.paragraphs[0].text = point
                else:
                    p = tf.add_paragraph()
                    p.text = point
                    p.level = slide_info.get('level', 0)

        elif slide_type == 'blank':
            slide = prs.slides.add_slide(prs.slide_layouts[6])
            # Add custom content

    prs.save(output_path)
从零开始生成PowerPoint文件。
输入: 要包含在幻灯片中的内容
流程:
  1. 创建Presentation对象
  2. 使用布局添加幻灯片
  3. 填充内容
  4. 保存到文件
示例:
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN

def create_presentation(title: str, slides_content: list, output_path: str):
    """Create a presentation with multiple slides."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = title
    title_slide.placeholders[1].text = "Prepared by Security Team"

    # Content slides
    for slide_info in slides_content:
        slide_type = slide_info.get('type', 'bullet')

        if slide_type == 'bullet':
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = slide_info['title']

            body = slide.placeholders[1]
            tf = body.text_frame

            for i, point in enumerate(slide_info.get('points', [])):
                if i == 0:
                    tf.paragraphs[0].text = point
                else:
                    p = tf.add_paragraph()
                    p.text = point
                    p.level = slide_info.get('level', 0)

        elif slide_type == 'blank':
            slide = prs.slides.add_slide(prs.slide_layouts[6])
            # Add custom content

    prs.save(output_path)

Usage

Usage

slides = [ { 'type': 'bullet', 'title': 'Executive Summary', 'points': [ 'Assessment completed on schedule', '15 vulnerabilities identified', '3 critical findings require immediate attention', 'Overall security posture: Moderate' ] }, { 'type': 'bullet', 'title': 'Critical Findings', 'points': [ 'SQL Injection in login form', 'Exposed admin credentials', 'Unpatched server vulnerabilities' ] } ] create_presentation('Security Assessment Report', slides, 'report.pptx')
undefined
slides = [ { 'type': 'bullet', 'title': 'Executive Summary', 'points': [ 'Assessment completed on schedule', '15 vulnerabilities identified', '3 critical findings require immediate attention', 'Overall security posture: Moderate' ] }, { 'type': 'bullet', 'title': 'Critical Findings', 'points': [ 'SQL Injection in login form', 'Exposed admin credentials', 'Unpatched server vulnerabilities' ] } ] create_presentation('Security Assessment Report', slides, 'report.pptx')
undefined

Adding Tables

添加表格

Include formatted tables in slides.
Example:
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

def add_table_slide(prs, title: str, headers: list, rows: list):
    """Add a slide with a formatted table."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])  # Title only layout
    slide.shapes.title.text = title

    # Define table dimensions
    x, y = Inches(0.5), Inches(1.5)
    cx, cy = Inches(9), Inches(0.8 * (len(rows) + 1))

    table = slide.shapes.add_table(
        len(rows) + 1, len(headers), x, y, cx, cy
    ).table

    # Style header row
    for col_idx, header in enumerate(headers):
        cell = table.cell(0, col_idx)
        cell.text = header
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(44, 62, 80)
        paragraph = cell.text_frame.paragraphs[0]
        paragraph.font.bold = True
        paragraph.font.color.rgb = RGBColor(255, 255, 255)
        paragraph.font.size = Pt(12)

    # Add data rows
    for row_idx, row_data in enumerate(rows, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = str(value)
            paragraph = cell.text_frame.paragraphs[0]
            paragraph.font.size = Pt(11)

    return slide
在幻灯片中包含格式化表格。
示例:
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

def add_table_slide(prs, title: str, headers: list, rows: list):
    """Add a slide with a formatted table."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])  # Title only layout
    slide.shapes.title.text = title

    # Define table dimensions
    x, y = Inches(0.5), Inches(1.5)
    cx, cy = Inches(9), Inches(0.8 * (len(rows) + 1))

    table = slide.shapes.add_table(
        len(rows) + 1, len(headers), x, y, cx, cy
    ).table

    # Style header row
    for col_idx, header in enumerate(headers):
        cell = table.cell(0, col_idx)
        cell.text = header
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(44, 62, 80)
        paragraph = cell.text_frame.paragraphs[0]
        paragraph.font.bold = True
        paragraph.font.color.rgb = RGBColor(255, 255, 255)
        paragraph.font.size = Pt(12)

    # Add data rows
    for row_idx, row_data in enumerate(rows, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = str(value)
            paragraph = cell.text_frame.paragraphs[0]
            paragraph.font.size = Pt(11)

    return slide

Usage

Usage

prs = Presentation() headers = ['Finding', 'Severity', 'Status', 'Due Date'] rows = [ ['SQL Injection', 'Critical', 'Open', '2024-02-01'], ['XSS Vulnerability', 'High', 'In Progress', '2024-02-15'], ['Weak Passwords', 'Medium', 'Fixed', '2024-01-20'] ] add_table_slide(prs, 'Findings Summary', headers, rows) prs.save('findings.pptx')
undefined
prs = Presentation() headers = ['Finding', 'Severity', 'Status', 'Due Date'] rows = [ ['SQL Injection', 'Critical', 'Open', '2024-02-01'], ['XSS Vulnerability', 'High', 'In Progress', '2024-02-15'], ['Weak Passwords', 'Medium', 'Fixed', '2024-01-20'] ] add_table_slide(prs, 'Findings Summary', headers, rows) prs.save('findings.pptx')
undefined

Adding Charts

添加图表

Create data visualizations in slides.
Example:
python
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

def add_chart_slide(prs, title: str, chart_type: str, categories: list, series: dict):
    """Add a slide with a chart."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = title

    # Create chart data
    chart_data = CategoryChartData()
    chart_data.categories = categories

    for series_name, values in series.items():
        chart_data.add_series(series_name, values)

    # Determine chart type
    chart_types = {
        'bar': XL_CHART_TYPE.BAR_CLUSTERED,
        'column': XL_CHART_TYPE.COLUMN_CLUSTERED,
        'pie': XL_CHART_TYPE.PIE,
        'line': XL_CHART_TYPE.LINE
    }
    xl_chart_type = chart_types.get(chart_type, XL_CHART_TYPE.COLUMN_CLUSTERED)

    # Add chart to slide
    x, y, cx, cy = Inches(1), Inches(1.5), Inches(8), Inches(5)
    chart = slide.shapes.add_chart(xl_chart_type, x, y, cx, cy, chart_data).chart

    return slide
在幻灯片中创建数据可视化图表。
示例:
python
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

def add_chart_slide(prs, title: str, chart_type: str, categories: list, series: dict):
    """Add a slide with a chart."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = title

    # Create chart data
    chart_data = CategoryChartData()
    chart_data.categories = categories

    for series_name, values in series.items():
        chart_data.add_series(series_name, values)

    # Determine chart type
    chart_types = {
        'bar': XL_CHART_TYPE.BAR_CLUSTERED,
        'column': XL_CHART_TYPE.COLUMN_CLUSTERED,
        'pie': XL_CHART_TYPE.PIE,
        'line': XL_CHART_TYPE.LINE
    }
    xl_chart_type = chart_types.get(chart_type, XL_CHART_TYPE.COLUMN_CLUSTERED)

    # Add chart to slide
    x, y, cx, cy = Inches(1), Inches(1.5), Inches(8), Inches(5)
    chart = slide.shapes.add_chart(xl_chart_type, x, y, cx, cy, chart_data).chart

    return slide

Usage

Usage

prs = Presentation()
prs = Presentation()

Add title slide

Add title slide

title_slide = prs.slides.add_slide(prs.slide_layouts[0]) title_slide.shapes.title.text = 'Security Metrics Dashboard'
title_slide = prs.slides.add_slide(prs.slide_layouts[0]) title_slide.shapes.title.text = 'Security Metrics Dashboard'

Add bar chart

Add bar chart

categories = ['Critical', 'High', 'Medium', 'Low'] series = {'Findings': [3, 8, 15, 22]} add_chart_slide(prs, 'Findings by Severity', 'column', categories, series)
categories = ['Critical', 'High', 'Medium', 'Low'] series = {'Findings': [3, 8, 15, 22]} add_chart_slide(prs, 'Findings by Severity', 'column', categories, series)

Add pie chart

Add pie chart

add_chart_slide(prs, 'Severity Distribution', 'pie', categories, series)
prs.save('metrics.pptx')
undefined
add_chart_slide(prs, 'Severity Distribution', 'pie', categories, series)
prs.save('metrics.pptx')
undefined

Using Templates

使用模板

Apply corporate templates for consistent branding.
Example:
python
from pptx import Presentation
from pptx.util import Inches, Pt

def create_from_template(template_path: str, output_path: str, content: list):
    """Create presentation from a template."""
    prs = Presentation(template_path)

    for slide_content in content:
        # Use template's slide layouts
        layout_index = slide_content.get('layout', 1)
        slide = prs.slides.add_slide(prs.slide_layouts[layout_index])

        # Fill in placeholders
        if slide.shapes.title:
            slide.shapes.title.text = slide_content.get('title', '')

        # Fill body placeholder if available
        for placeholder in slide.placeholders:
            if placeholder.placeholder_format.idx == 1:  # Body placeholder
                tf = placeholder.text_frame
                points = slide_content.get('points', [])
                for i, point in enumerate(points):
                    if i == 0:
                        tf.paragraphs[0].text = point
                    else:
                        p = tf.add_paragraph()
                        p.text = point

    prs.save(output_path)
应用企业模板以确保品牌一致性。
示例:
python
from pptx import Presentation
from pptx.util import Inches, Pt

def create_from_template(template_path: str, output_path: str, content: list):
    """Create presentation from a template."""
    prs = Presentation(template_path)

    for slide_content in content:
        # Use template's slide layouts
        layout_index = slide_content.get('layout', 1)
        slide = prs.slides.add_slide(prs.slide_layouts[layout_index])

        # Fill in placeholders
        if slide.shapes.title:
            slide.shapes.title.text = slide_content.get('title', '')

        # Fill body placeholder if available
        for placeholder in slide.placeholders:
            if placeholder.placeholder_format.idx == 1:  # Body placeholder
                tf = placeholder.text_frame
                points = slide_content.get('points', [])
                for i, point in enumerate(points):
                    if i == 0:
                        tf.paragraphs[0].text = point
                    else:
                        p = tf.add_paragraph()
                        p.text = point

    prs.save(output_path)

Usage

Usage

content = [ { 'layout': 1, 'title': 'Assessment Overview', 'points': ['Scope: Web Application', 'Duration: 2 weeks', 'Methodology: OWASP'] }, { 'layout': 1, 'title': 'Key Findings', 'points': ['3 Critical vulnerabilities', '5 High severity issues', '12 Medium findings'] } ] create_from_template('corporate_template.pptx', 'assessment.pptx', content)
undefined
content = [ { 'layout': 1, 'title': 'Assessment Overview', 'points': ['Scope: Web Application', 'Duration: 2 weeks', 'Methodology: OWASP'] }, { 'layout': 1, 'title': 'Key Findings', 'points': ['3 Critical vulnerabilities', '5 High severity issues', '12 Medium findings'] } ] create_from_template('corporate_template.pptx', 'assessment.pptx', content)
undefined

Markdown to Slides

Markdown转幻灯片

Convert markdown content to presentation slides.
Example:
python
from pptx import Presentation
from pptx.util import Inches, Pt
import re

def markdown_to_slides(markdown_content: str, output_path: str):
    """Convert markdown to PowerPoint slides."""
    prs = Presentation()

    # Split by headers (slides)
    sections = re.split(r'\n(?=# )', markdown_content.strip())

    for section in sections:
        lines = section.strip().split('\n')
        if not lines:
            continue

        # Get title (# heading)
        title_match = re.match(r'^#\s+(.+)$', lines[0])
        if not title_match:
            continue

        title = title_match.group(1)

        # Get bullet points
        points = []
        for line in lines[1:]:
            bullet_match = re.match(r'^[-*]\s+(.+)$', line.strip())
            if bullet_match:
                points.append(bullet_match.group(1))

        # Create slide
        if points:
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = title

            body = slide.placeholders[1]
            tf = body.text_frame

            for i, point in enumerate(points):
                if i == 0:
                    tf.paragraphs[0].text = point
                else:
                    p = tf.add_paragraph()
                    p.text = point
        else:
            # Title only slide
            slide = prs.slides.add_slide(prs.slide_layouts[5])
            slide.shapes.title.text = title

    prs.save(output_path)
将Markdown内容转换为演示文稿幻灯片。
示例:
python
from pptx import Presentation
from pptx.util import Inches, Pt
import re

def markdown_to_slides(markdown_content: str, output_path: str):
    """Convert markdown to PowerPoint slides."""
    prs = Presentation()

    # Split by headers (slides)
    sections = re.split(r'\n(?=# )', markdown_content.strip())

    for section in sections:
        lines = section.strip().split('\n')
        if not lines:
            continue

        # Get title (# heading)
        title_match = re.match(r'^#\s+(.+)$', lines[0])
        if not title_match:
            continue

        title = title_match.group(1)

        # Get bullet points
        points = []
        for line in lines[1:]:
            bullet_match = re.match(r'^[-*]\s+(.+)$', line.strip())
            if bullet_match:
                points.append(bullet_match.group(1))

        # Create slide
        if points:
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = title

            body = slide.placeholders[1]
            tf = body.text_frame

            for i, point in enumerate(points):
                if i == 0:
                    tf.paragraphs[0].text = point
                else:
                    p = tf.add_paragraph()
                    p.text = point
        else:
            # Title only slide
            slide = prs.slides.add_slide(prs.slide_layouts[5])
            slide.shapes.title.text = title

    prs.save(output_path)

Usage

Usage

markdown = """
markdown = """

Security Assessment Report

Security Assessment Report

  • Conducted comprehensive penetration test
  • Identified 15 vulnerabilities
  • Prioritized remediation roadmap
  • Conducted comprehensive penetration test
  • Identified 15 vulnerabilities
  • Prioritized remediation roadmap

Critical Findings

Critical Findings

  • SQL Injection in authentication module
  • Remote code execution via file upload
  • Exposed API credentials in source code
  • SQL Injection in authentication module
  • Remote code execution via file upload
  • Exposed API credentials in source code

Recommendations

Recommendations

  • Implement input validation
  • Deploy WAF protection
  • Rotate all exposed credentials """ markdown_to_slides(markdown, 'assessment.pptx')
undefined
  • Implement input validation
  • Deploy WAF protection
  • Rotate all exposed credentials """ markdown_to_slides(markdown, 'assessment.pptx')
undefined

Adding Speaker Notes

添加演讲者备注

Include speaker notes for presentations.
Example:
python
from pptx import Presentation

def add_slide_with_notes(prs, title: str, points: list, notes: str):
    """Add a slide with speaker notes."""
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    slide.shapes.title.text = title

    body = slide.placeholders[1]
    tf = body.text_frame

    for i, point in enumerate(points):
        if i == 0:
            tf.paragraphs[0].text = point
        else:
            p = tf.add_paragraph()
            p.text = point

    # Add speaker notes
    notes_slide = slide.notes_slide
    notes_slide.notes_text_frame.text = notes

    return slide
在演示文稿中包含演讲者备注。
示例:
python
from pptx import Presentation

def add_slide_with_notes(prs, title: str, points: list, notes: str):
    """Add a slide with speaker notes."""
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    slide.shapes.title.text = title

    body = slide.placeholders[1]
    tf = body.text_frame

    for i, point in enumerate(points):
        if i == 0:
            tf.paragraphs[0].text = point
        else:
            p = tf.add_paragraph()
            p.text = point

    # Add speaker notes
    notes_slide = slide.notes_slide
    notes_slide.notes_text_frame.text = notes

    return slide

Usage

Usage

prs = Presentation()
add_slide_with_notes( prs, 'Executive Summary', ['15 findings identified', '3 critical issues', 'Immediate action required'], 'Key talking points:\n- Emphasize urgency of critical findings\n- Discuss remediation timeline\n- Request budget approval for fixes' )
prs.save('briefing.pptx')
undefined
prs = Presentation()
add_slide_with_notes( prs, 'Executive Summary', ['15 findings identified', '3 critical issues', 'Immediate action required'], 'Key talking points:\n- Emphasize urgency of critical findings\n- Discuss remediation timeline\n- Request budget approval for fixes' )
prs.save('briefing.pptx')
undefined

Configuration

配置

Environment Variables

环境变量

VariableDescriptionRequiredDefault
PPTX_TEMPLATE_DIR
Default template directoryNo
./assets/templates
变量描述是否必填默认值
PPTX_TEMPLATE_DIR
默认模板目录
./assets/templates

Script Options

脚本选项

OptionTypeDescription
--input
pathInput file (PPTX or Markdown)
--output
pathOutput PPTX file
--template
pathTemplate to use
--verbose
flagEnable verbose logging
选项类型描述
--input
路径输入文件(PPTX或Markdown)
--output
路径输出PPTX文件
--template
路径使用的模板
--verbose
标志启用详细日志

Examples

示例

Example 1: Security Briefing Generator

示例1:安全简报生成器

Scenario: Generate executive security briefing from findings data.
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

def generate_security_briefing(findings: list, output_path: str):
    """Generate a security briefing presentation."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = 'Security Assessment Briefing'
    title_slide.placeholders[1].text = 'Confidential - Executive Summary'

    # Summary statistics
    critical = sum(1 for f in findings if f['severity'] == 'Critical')
    high = sum(1 for f in findings if f['severity'] == 'High')
    medium = sum(1 for f in findings if f['severity'] == 'Medium')

    summary_slide = prs.slides.add_slide(prs.slide_layouts[1])
    summary_slide.shapes.title.text = 'Executive Summary'

    body = summary_slide.placeholders[1]
    tf = body.text_frame
    tf.paragraphs[0].text = f'Total Findings: {len(findings)}'
    tf.add_paragraph().text = f'Critical: {critical}'
    tf.add_paragraph().text = f'High: {high}'
    tf.add_paragraph().text = f'Medium: {medium}'

    # Individual finding slides
    for finding in findings:
        if finding['severity'] in ['Critical', 'High']:
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = f"[{finding['severity']}] {finding['title']}"

            body = slide.placeholders[1]
            tf = body.text_frame
            tf.paragraphs[0].text = finding.get('description', '')
            tf.add_paragraph().text = f"Risk: {finding.get('risk', 'N/A')}"
            tf.add_paragraph().text = f"Remediation: {finding.get('remediation', 'N/A')}"

    prs.save(output_path)
场景: 根据检测结果数据生成高管级安全简报。
python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

def generate_security_briefing(findings: list, output_path: str):
    """Generate a security briefing presentation."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = 'Security Assessment Briefing'
    title_slide.placeholders[1].text = 'Confidential - Executive Summary'

    # Summary statistics
    critical = sum(1 for f in findings if f['severity'] == 'Critical')
    high = sum(1 for f in findings if f['severity'] == 'High')
    medium = sum(1 for f in findings if f['severity'] == 'Medium')

    summary_slide = prs.slides.add_slide(prs.slide_layouts[1])
    summary_slide.shapes.title.text = 'Executive Summary'

    body = summary_slide.placeholders[1]
    tf = body.text_frame
    tf.paragraphs[0].text = f'Total Findings: {len(findings)}'
    tf.add_paragraph().text = f'Critical: {critical}'
    tf.add_paragraph().text = f'High: {high}'
    tf.add_paragraph().text = f'Medium: {medium}'

    # Individual finding slides
    for finding in findings:
        if finding['severity'] in ['Critical', 'High']:
            slide = prs.slides.add_slide(prs.slide_layouts[1])
            slide.shapes.title.text = f"[{finding['severity']}] {finding['title']}"

            body = slide.placeholders[1]
            tf = body.text_frame
            tf.paragraphs[0].text = finding.get('description', '')
            tf.add_paragraph().text = f"Risk: {finding.get('risk', 'N/A')}"
            tf.add_paragraph().text = f"Remediation: {finding.get('remediation', 'N/A')}"

    prs.save(output_path)

Usage

Usage

findings = [ { 'title': 'SQL Injection', 'severity': 'Critical', 'description': 'Authentication bypass via SQL injection', 'risk': 'Complete system compromise', 'remediation': 'Implement parameterized queries' }, { 'title': 'XSS Vulnerability', 'severity': 'High', 'description': 'Stored XSS in user profile', 'risk': 'Session hijacking', 'remediation': 'Implement output encoding' } ] generate_security_briefing(findings, 'security_briefing.pptx')
undefined
findings = [ { 'title': 'SQL Injection', 'severity': 'Critical', 'description': 'Authentication bypass via SQL injection', 'risk': 'Complete system compromise', 'remediation': 'Implement parameterized queries' }, { 'title': 'XSS Vulnerability', 'severity': 'High', 'description': 'Stored XSS in user profile', 'risk': 'Session hijacking', 'remediation': 'Implement output encoding' } ] generate_security_briefing(findings, 'security_briefing.pptx')
undefined

Example 2: Metrics Dashboard Presentation

示例2:指标仪表板演示文稿

Scenario: Create a metrics dashboard presentation with charts.
python
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

def create_metrics_dashboard(metrics: dict, output_path: str):
    """Create a metrics dashboard presentation."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = 'Security Metrics Dashboard'
    title_slide.placeholders[1].text = 'Monthly Report'

    # Vulnerability trend chart
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = 'Vulnerability Trend'

    chart_data = CategoryChartData()
    chart_data.categories = metrics['months']
    chart_data.add_series('Open', metrics['open_vulns'])
    chart_data.add_series('Closed', metrics['closed_vulns'])

    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.LINE, Inches(1), Inches(1.5), Inches(8), Inches(5), chart_data
    ).chart

    # Severity distribution
    slide2 = prs.slides.add_slide(prs.slide_layouts[5])
    slide2.shapes.title.text = 'Current Severity Distribution'

    chart_data2 = CategoryChartData()
    chart_data2.categories = list(metrics['severity_dist'].keys())
    chart_data2.add_series('Count', list(metrics['severity_dist'].values()))

    slide2.shapes.add_chart(
        XL_CHART_TYPE.PIE, Inches(2), Inches(1.5), Inches(6), Inches(5), chart_data2
    )

    prs.save(output_path)
场景: 创建包含图表的指标仪表板演示文稿。
python
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

def create_metrics_dashboard(metrics: dict, output_path: str):
    """Create a metrics dashboard presentation."""
    prs = Presentation()

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = 'Security Metrics Dashboard'
    title_slide.placeholders[1].text = 'Monthly Report'

    # Vulnerability trend chart
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = 'Vulnerability Trend'

    chart_data = CategoryChartData()
    chart_data.categories = metrics['months']
    chart_data.add_series('Open', metrics['open_vulns'])
    chart_data.add_series('Closed', metrics['closed_vulns'])

    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.LINE, Inches(1), Inches(1.5), Inches(8), Inches(5), chart_data
    ).chart

    # Severity distribution
    slide2 = prs.slides.add_slide(prs.slide_layouts[5])
    slide2.shapes.title.text = 'Current Severity Distribution'

    chart_data2 = CategoryChartData()
    chart_data2.categories = list(metrics['severity_dist'].keys())
    chart_data2.add_series('Count', list(metrics['severity_dist'].values()))

    slide2.shapes.add_chart(
        XL_CHART_TYPE.PIE, Inches(2), Inches(1.5), Inches(6), Inches(5), chart_data2
    )

    prs.save(output_path)

Usage

Usage

metrics = { 'months': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], 'open_vulns': [45, 52, 48, 35, 28, 22], 'closed_vulns': [30, 45, 55, 60, 65, 70], 'severity_dist': {'Critical': 3, 'High': 12, 'Medium': 25, 'Low': 40} } create_metrics_dashboard(metrics, 'dashboard.pptx')
undefined
metrics = { 'months': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], 'open_vulns': [45, 52, 48, 35, 28, 22], 'closed_vulns': [30, 45, 55, 60, 65, 70], 'severity_dist': {'Critical': 3, 'High': 12, 'Medium': 25, 'Low': 40} } create_metrics_dashboard(metrics, 'dashboard.pptx')
undefined

Limitations

局限性

  • Animations: Cannot create or modify slide animations
  • Transitions: Slide transitions are not supported
  • Videos: Limited support for embedded videos
  • Audio: Cannot add or modify audio clips
  • SmartArt: Cannot create SmartArt graphics
  • Complex Charts: Some advanced chart types may have limited support
  • 动画: 无法创建或修改幻灯片动画
  • 切换效果: 不支持幻灯片切换效果
  • 视频: 对嵌入视频的支持有限
  • 音频: 无法添加或修改音频剪辑
  • SmartArt: 无法创建SmartArt图形
  • 复杂图表: 部分高级图表类型的支持有限

Troubleshooting

故障排除

Layout Not Found

布局未找到

Problem: Getting KeyError when accessing slide layout
Solution: Check available layouts:
python
prs = Presentation()
for i, layout in enumerate(prs.slide_layouts):
    print(f"{i}: {layout.name}")
问题: 访问幻灯片布局时出现KeyError
解决方案: 检查可用布局:
python
prs = Presentation()
for i, layout in enumerate(prs.slide_layouts):
    print(f"{i}: {layout.name}")

Text Not Fitting

文本无法容纳

Problem: Text overflows placeholder
Solution: Adjust font size or use auto-fit:
python
from pptx.util import Pt

tf = placeholder.text_frame
tf.auto_size = True
问题: 文本溢出占位符
解决方案: 调整字体大小或使用自动适配:
python
from pptx.util import Pt

tf = placeholder.text_frame
tf.auto_size = True

Or manually set font size

或手动设置字体大小

for paragraph in tf.paragraphs: paragraph.font.size = Pt(14)
undefined
for paragraph in tf.paragraphs: paragraph.font.size = Pt(14)
undefined

Template Issues

模板问题

Problem: Custom template not applying correctly
Solution: Verify template has expected placeholders:
python
prs = Presentation('template.pptx')
for layout in prs.slide_layouts:
    print(f"\n{layout.name}:")
    for placeholder in layout.placeholders:
        print(f"  {placeholder.placeholder_format.idx}: {placeholder.name}")
问题: 自定义模板未正确应用
解决方案: 验证模板包含预期的占位符:
python
prs = Presentation('template.pptx')
for layout in prs.slide_layouts:
    print(f"\n{layout.name}:")
    for placeholder in layout.placeholders:
        print(f"  {placeholder.placeholder_format.idx}: {placeholder.name}")

Related Skills

相关技能

  • docx: Convert Word reports to presentations
  • xlsx: Import data for charts and tables
  • image-generation: Create visual assets for slides
  • pdf: Export presentations to PDF
  • docx: 将Word报告转换为演示文稿
  • xlsx: 导入图表和表格所需的数据
  • image-generation: 为幻灯片创建视觉素材
  • pdf: 将演示文稿导出为PDF

References

参考资料