iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Многоразовый шаблон презентаций из PowerPoint

Превращает ваш шаблон PowerPoint в многоразовый скилл: разбирает макеты и заполнители и пишет инструкцию, по которой потом собирают презентации.

СкиллAnthropicClaudeApache-2.0Нужен терминалПроверка не требуется
Что делает
Превращает ваш шаблон PowerPoint в многоразовый скилл: разбирает макеты и заполнители и пишет инструкцию, по которой потом собирают презентации.
Когда брать
Когда у вас есть фирменный шаблон презентации и нужен скилл для сборки презентаций в вашем стиле.
Когда не брать
Если нужна сама презентация, а не скилл: для этого есть скилл pptx.
Пример запроса
Сделай скилл из нашего фирменного шаблона PowerPoint, чтобы потом собирать по нему презентации.
Нужно подключить
Python, шаблон PowerPoint

Входит в плагин financial-analysis. В Cowork и Claude Code можно поставить плагин целиком.

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку ppt-template-creator в ~/.claude/skills/.
  3. Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.

Текст

---
name: ppt-template-creator
description: Создаёт самодостаточные СКИЛЛЫ с шаблонами PPT (не презентации) из шаблонов PowerPoint, которые предоставил пользователь. Используй ТОЛЬКО тогда, когда пользователь хочет создать многоразовый скилл из своего шаблона. Для создания самих презентаций используй скилл pptx.
---

Создатель шаблонов PPT

Этот скилл создаёт СКИЛЛЫ, а не презентации. Используй его, когда пользователь хочет превратить свой шаблон PowerPoint в многоразовый скилл, который позже сможет создавать презентации. Если пользователю просто нужна презентация, используй скилл pptx.

Созданный скилл включает:

  • assets/template.pptx — файл шаблона
  • SKILL.md — полные инструкции (ссылаться на этот мета-скилл не нужно)

Общие рекомендации по созданию скиллов смотри в скилле skill-creator. Этот скилл посвящён особенностям PPT.

Рабочий процесс

  1. Пользователь предоставляет шаблон (.pptx или .potx)
  2. Проанализируй шаблон — извлеки макеты, заполнители, размеры
  3. Инициализируй скилл — с помощью скилла skill-creator создай структуру скилла
  4. Добавь шаблон — скопируй .pptx в assets/template.pptx
  5. Напиши SKILL.md — следуй шаблону ниже, добавив сведения, специфичные для PPT
  6. Создай пример — сгенерируй образец презентации для проверки
  7. Упакуй — с помощью скилла skill-creator упакуй в файл .skill

Шаг 2: Проанализируй шаблон

КРИТИЧНО: извлеки точные позиции заполнителей — от них зависят границы области содержимого.

from pptx import Presentation

prs = Presentation(template_path)
print(f"Dimensions: {prs.slide_width/914400:.2f}\" x {prs.slide_height/914400:.2f}\"")
print(f"Layouts: {len(prs.slide_layouts)}")

for idx, layout in enumerate(prs.slide_layouts):
    print(f"\n[{idx}] {layout.name}:")
    for ph in layout.placeholders:
        try:
            ph_idx = ph.placeholder_format.idx
            ph_type = ph.placeholder_format.type
            # IMPORTANT: Extract exact positions in inches
            left = ph.left / 914400
            top = ph.top / 914400
            width = ph.width / 914400
            height = ph.height / 914400
            print(f"    idx={ph_idx}, type={ph_type}")
            print(f"        x={left:.2f}\", y={top:.2f}\", w={width:.2f}\", h={height:.2f}\"")
        except:
            pass

Ключевые измерения, которые нужно задокументировать:

  • Положение заголовка: где расположен заполнитель заголовка?
  • Подзаголовок/описание: где строка подзаголовка?
  • Заполнители нижнего колонтитула: где располагаются колонтитулы и источники?
  • Область содержимого: пространство МЕЖДУ подзаголовком и нижним колонтитулом и есть область содержимого

Как найти настоящее начало содержимого

КРИТИЧНО: Область содержимого НЕ всегда начинается сразу после заполнителя подзаголовка. Во многих шаблонах между подзаголовком и областью содержимого есть визуальная граница, линия или зарезервированное место.

Лучший подход: посмотри на макет 2 или похожие «контентные» макеты, где есть заполнитель типа OBJECT — позиция y этого заполнителя показывает, где на самом деле должно начинаться содержимое.

# Find the OBJECT placeholder to determine true content start
for idx, layout in enumerate(prs.slide_layouts):
    for ph in layout.placeholders:
        try:
            if ph.placeholder_format.type == 7:  # OBJECT type
                top = ph.top / 914400
                print(f"Layout [{idx}] {layout.name}: OBJECT starts at y={top:.2f}\"")
                # This y value is where your content should start!
        except:
            pass

Пример: в шаблоне может быть так:

  • Подзаголовок заканчивается на y=1.38"
  • Но заполнитель OBJECT начинается на y=1.90"
  • Промежуток (0.52") зарезервирован под границу или линию — не размещай там содержимое

Используй позицию y заполнителя OBJECT как начало содержимого, а не конец подзаголовка.

Шаг 5: Напиши SKILL.md

У создаваемого скилла должна быть такая структура:

[company]-ppt-template/
├── SKILL.md
└── assets/
    └── template.pptx

Шаблон создаваемого SKILL.md

Создаваемый SKILL.md должен быть самодостаточным: все инструкции встроены в него. Используй этот шаблон, подставив в квадратных скобках значения из своего анализа:

---
name: [company]-ppt-template
description: Шаблон PowerPoint компании [Company] для создания презентаций. Используй при создании питч-презентаций, материалов для совета директоров или клиентских презентаций в стиле [Company].
---

# Шаблон PPT компании [Company]

Шаблон: `assets/template.pptx` ([WIDTH]" x [HEIGHT]", макетов: [N])

## Создание презентаций

from pptx import Presentation

prs = Presentation("path/to/skill/assets/template.pptx")

DELETE all existing slides first

while len(prs.slides) > 0: rId = prs.slides._sldIdLst[0].rId prs.part.drop_rel(rId) del prs.slides._sldIdLst[0]

Add slides from layouts

slide = prs.slides.add_slide(prs.slide_layouts[LAYOUT_IDX])


## Основные макеты

| Индекс | Название | Для чего |
|-------|------|---------|
| [0] | [Название макета] | [Обложка/титульный слайд] |
| [N] | [Название макета] | [Содержимое с маркированным списком] |
| [N] | [Название макета] | [Макет в две колонки] |

## Соответствие заполнителей

**КРИТИЧНО: укажи точные позиции (координаты x, y) каждого заполнителя.**

### Макет [N]: [Название]
| idx | Тип | Положение | Назначение |
|-----|------|----------|-----|
| [idx] | TITLE (1) | y=[Y]" | Заголовок слайда |
| [idx] | BODY (2) | y=[Y]" | Подзаголовок/описание |
| [idx] | BODY (2) | y=[Y]" | Нижний колонтитул |
| [idx] | BODY (2) | y=[Y]" | Источник/примечания |

### Границы области содержимого

**Задокументируй безопасную область содержимого для своих фигур, таблиц и графиков:**

Область содержимого (для макета [N]):

  • Левое поле: [X]" (здесь начинается содержимое)
  • Верх: [Y]" (под заполнителем подзаголовка)
  • Ширина: [W]"
  • Высота: [H]" (заканчивается до нижнего колонтитула)

Для макетов с 4 квадрантами:

  • Левая колонка: x=[X]", ширина=[W]"
  • Правая колонка: x=[X]", ширина=[W]"
  • Верхний ряд: y=[Y]", высота=[H]"
  • Нижний ряд: y=[Y]", высота=[H]"

**Почему это важно:** пользовательское содержимое (текстовые блоки, таблицы, графики) должно оставаться в этих границах, чтобы не накладываться на заполнители шаблона: заголовки, нижние колонтитулы и строки источников.

## Наполнение содержимым

**НЕ добавляй маркеры вручную** — форматирование обеспечивает образец слайдов.

Fill title

for shape in slide.shapes: if hasattr(shape, 'placeholder_format'): if shape.placeholder_format.type == 1: # TITLE shape.text = "Slide Title"

Fill content with hierarchy (level 0 = header, level 1 = bullet)

for shape in slide.shapes: if hasattr(shape, 'placeholder_format'): idx = shape.placeholder_format.idx if idx == [CONTENT_IDX]: tf = shape.text_frame for para in tf.paragraphs: para.clear()

content = [ ("Section Header", 0), ("First bullet point", 1), ("Second bullet point", 1), ]

tf.paragraphs[0].text = content[0][0] tf.paragraphs[0].level = content[0][1] for text, level in content[1:]: p = tf.add_paragraph() p.text = text p.level = level


## Пример: титульный слайд

slide = prs.slides.add_slide(prs.slide_layouts[[COVER_IDX]]) for shape in slide.shapes: if hasattr(shape, 'placeholder_format'): idx = shape.placeholder_format.idx if idx == [TITLE_IDX]: shape.text = "Company Name" elif idx == [SUBTITLE_IDX]: shape.text = "Presentation Title | Date"


## Пример: слайд с содержимым

slide = prs.slides.add_slide(prs.slide_layouts[[CONTENT_IDX]]) for shape in slide.shapes: if hasattr(shape, 'placeholder_format'): ph_type = shape.placeholder_format.type idx = shape.placeholder_format.idx if ph_type == 1: shape.text = "Executive Summary" elif idx == [BODY_IDX]: tf = shape.text_frame for para in tf.paragraphs: para.clear() content = [ ("Key Findings", 0), ("Revenue grew 40% YoY to $50M", 1), ("Expanded to 3 new markets", 1), ("Recommendation", 0), ("Proceed with strategic initiative", 1), ] tf.paragraphs[0].text = content[0][0] tf.paragraphs[0].level = content[0][1] for text, level in content[1:]: p = tf.add_paragraph() p.text = text p.level = level

Шаг 6: Создай пример результата

Сгенерируй образец презентации, чтобы убедиться, что скилл работает. Сохрани его рядом со скиллом для справки.

Правила, специфичные для PPT, для создаваемых скиллов

  1. Шаблон в assets/ — всегда включай файл .pptx
  2. Самодостаточный SKILL.md — все инструкции встроены, без внешних ссылок
  3. Без маркеров вручную — для иерархии используй paragraph.level
  4. Сначала удали слайды — всегда очищай существующие слайды, прежде чем добавлять новые
  5. Документируй заполнители по idx — значения idx заполнителей зависят от шаблона

Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/financial-services/tree/main/plugins/vertical-plugins/financial-analysis/skills/ppt-template-creator, лицензия Apache-2.0. Изменения: перевод на русский язык.

Оригинал на английском
---
name: ppt-template-creator
description: Creates self-contained PPT template SKILLS (not presentations) from user-provided PowerPoint templates. Use ONLY when a user wants to create a reusable skill from their template. For creating actual presentations, use the pptx skill instead.
---

# PPT Template Creator

**This skill creates SKILLS, not presentations.** Use this when a user wants to turn their PowerPoint template into a reusable skill that can generate presentations later. If the user just wants to create a presentation, use the `pptx` skill instead.

The generated skill includes:
- `assets/template.pptx` - the template file
- `SKILL.md` - complete instructions (no reference to this meta skill needed)

**For general skill-building best practices**, refer to the `skill-creator` skill. This skill focuses on PPT-specific patterns.

## Workflow

1. **User provides template** (.pptx or .potx)
2. **Analyze template** - extract layouts, placeholders, dimensions
3. **Initialize skill** - use the `skill-creator` skill to set up the skill structure
4. **Add template** - copy .pptx to `assets/template.pptx`
5. **Write SKILL.md** - follow template below with PPT-specific details
6. **Create example** - generate sample presentation to validate
7. **Package** - use the `skill-creator` skill to package into a .skill file

## Step 2: Analyze Template

**CRITICAL: Extract precise placeholder positions** - this determines content area boundaries.

```python
from pptx import Presentation

prs = Presentation(template_path)
print(f"Dimensions: {prs.slide_width/914400:.2f}\" x {prs.slide_height/914400:.2f}\"")
print(f"Layouts: {len(prs.slide_layouts)}")

for idx, layout in enumerate(prs.slide_layouts):
    print(f"\n[{idx}] {layout.name}:")
    for ph in layout.placeholders:
        try:
            ph_idx = ph.placeholder_format.idx
            ph_type = ph.placeholder_format.type
            # IMPORTANT: Extract exact positions in inches
            left = ph.left / 914400
            top = ph.top / 914400
            width = ph.width / 914400
            height = ph.height / 914400
            print(f"    idx={ph_idx}, type={ph_type}")
            print(f"        x={left:.2f}\", y={top:.2f}\", w={width:.2f}\", h={height:.2f}\"")
        except:
            pass
```

**Key measurements to document:**
- **Title position**: Where does the title placeholder sit?
- **Subtitle/description**: Where is the subtitle line?
- **Footer placeholders**: Where do footers/sources appear?
- **Content area**: The space BETWEEN subtitle and footer is your content area

### Finding the True Content Start Position

**CRITICAL:** The content area does NOT always start immediately after the subtitle placeholder. Many templates have a visual border, line, or reserved space between the subtitle and content area.

**Best approach:** Look at Layout 2 or similar "content" layouts that have an OBJECT placeholder - this placeholder's `y` position indicates where content should actually start.

```python
# Find the OBJECT placeholder to determine true content start
for idx, layout in enumerate(prs.slide_layouts):
    for ph in layout.placeholders:
        try:
            if ph.placeholder_format.type == 7:  # OBJECT type
                top = ph.top / 914400
                print(f"Layout [{idx}] {layout.name}: OBJECT starts at y={top:.2f}\"")
                # This y value is where your content should start!
        except:
            pass
```

**Example:** A template might have:
- Subtitle ending at y=1.38"
- But OBJECT placeholder starting at y=1.90"
- The gap (0.52") is reserved for a border/line - **do not place content there**

Use the OBJECT placeholder's `y` position as your content start, not the subtitle's end position.

## Step 5: Write SKILL.md

The generated skill should have this structure:
```
[company]-ppt-template/
├── SKILL.md
└── assets/
    └── template.pptx
```

### Generated SKILL.md Template

The generated SKILL.md must be **self-contained** with all instructions embedded. Use this template, filling in the bracketed values from your analysis:

````markdown
---
name: [company]-ppt-template
description: [Company] PowerPoint template for creating presentations. Use when creating [Company]-branded pitch decks, board materials, or client presentations.
---

# [Company] PPT Template

Template: `assets/template.pptx` ([WIDTH]" x [HEIGHT]", [N] layouts)

## Creating Presentations

```python
from pptx import Presentation

prs = Presentation("path/to/skill/assets/template.pptx")

# DELETE all existing slides first
while len(prs.slides) > 0:
    rId = prs.slides._sldIdLst[0].rId
    prs.part.drop_rel(rId)
    del prs.slides._sldIdLst[0]

# Add slides from layouts
slide = prs.slides.add_slide(prs.slide_layouts[LAYOUT_IDX])
```

## Key Layouts

| Index | Name | Use For |
|-------|------|---------|
| [0] | [Layout Name] | [Cover/title slide] |
| [N] | [Layout Name] | [Content with bullets] |
| [N] | [Layout Name] | [Two-column layout] |

## Placeholder Mapping

**CRITICAL: Include exact positions (x, y coordinates) for each placeholder.**

### Layout [N]: [Name]
| idx | Type | Position | Use |
|-----|------|----------|-----|
| [idx] | TITLE (1) | y=[Y]" | Slide title |
| [idx] | BODY (2) | y=[Y]" | Subtitle/description |
| [idx] | BODY (2) | y=[Y]" | Footer |
| [idx] | BODY (2) | y=[Y]" | Source/notes |

### Content Area Boundaries

**Document the safe content area for custom shapes/tables/charts:**

```
Content Area (for Layout [N]):
- Left margin: [X]" (content starts here)
- Top: [Y]" (below subtitle placeholder)
- Width: [W]"
- Height: [H]" (ends before footer)

For 4-quadrant layouts:
- Left column: x=[X]", width=[W]"
- Right column: x=[X]", width=[W]"
- Top row: y=[Y]", height=[H]"
- Bottom row: y=[Y]", height=[H]"
```

**Why this matters:** Custom content (textboxes, tables, charts) must stay within these boundaries to avoid overlapping with template placeholders like titles, footers, and source lines.

## Filling Content

**Do NOT add manual bullet characters** - slide master handles formatting.

```python
# Fill title
for shape in slide.shapes:
    if hasattr(shape, 'placeholder_format'):
        if shape.placeholder_format.type == 1:  # TITLE
            shape.text = "Slide Title"

# Fill content with hierarchy (level 0 = header, level 1 = bullet)
for shape in slide.shapes:
    if hasattr(shape, 'placeholder_format'):
        idx = shape.placeholder_format.idx
        if idx == [CONTENT_IDX]:
            tf = shape.text_frame
            for para in tf.paragraphs:
                para.clear()

            content = [
                ("Section Header", 0),
                ("First bullet point", 1),
                ("Second bullet point", 1),
            ]

            tf.paragraphs[0].text = content[0][0]
            tf.paragraphs[0].level = content[0][1]
            for text, level in content[1:]:
                p = tf.add_paragraph()
                p.text = text
                p.level = level
```

## Example: Cover Slide

```python
slide = prs.slides.add_slide(prs.slide_layouts[[COVER_IDX]])
for shape in slide.shapes:
    if hasattr(shape, 'placeholder_format'):
        idx = shape.placeholder_format.idx
        if idx == [TITLE_IDX]:
            shape.text = "Company Name"
        elif idx == [SUBTITLE_IDX]:
            shape.text = "Presentation Title | Date"
```

## Example: Content Slide

```python
slide = prs.slides.add_slide(prs.slide_layouts[[CONTENT_IDX]])
for shape in slide.shapes:
    if hasattr(shape, 'placeholder_format'):
        ph_type = shape.placeholder_format.type
        idx = shape.placeholder_format.idx
        if ph_type == 1:
            shape.text = "Executive Summary"
        elif idx == [BODY_IDX]:
            tf = shape.text_frame
            for para in tf.paragraphs:
                para.clear()
            content = [
                ("Key Findings", 0),
                ("Revenue grew 40% YoY to $50M", 1),
                ("Expanded to 3 new markets", 1),
                ("Recommendation", 0),
                ("Proceed with strategic initiative", 1),
            ]
            tf.paragraphs[0].text = content[0][0]
            tf.paragraphs[0].level = content[0][1]
            for text, level in content[1:]:
                p = tf.add_paragraph()
                p.text = text
                p.level = level
```
````

## Step 6: Create Example Output

Generate a sample presentation to validate the skill works. Save it alongside the skill for reference.

## PPT-Specific Rules for Generated Skills

1. **Template in assets/** - always bundle the .pptx file
2. **Self-contained SKILL.md** - all instructions embedded, no external references
3. **No manual bullets** - use `paragraph.level` for hierarchy
4. **Delete slides first** - always clear existing slides before adding new ones
5. **Document placeholders by idx** - placeholder idx values are template-specific

Источник: anthropics/financial-services / financial-analysis / ppt-template-creator ↗. Ссылка проверена 2026-10-10.