# PPTX Builder

> python-pptx を使用して .pptx ファイルを自動生成する。スタイルガイド・スライド構成・ コンテンツを統合し、プロフェッショナルな PowerPoint プレゼンテーションを出力する。 Use when 「PPTXを生成して」「PowerPointを作って」「.pptxを出力して」 「スライドをビルドして」「パワポを作って」「pptxに変換して」。

- Skill: `nahisaho/pptx-builder` (Agent Skill)
- Install (CLI): `npx skillmds@latest add nahisaho/pptx-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/nahisaho/pptx-builder/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: nahisaho (https://skillmd.com/u/nahisaho)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/nahisaho/pptx-builder

---


# PPTX Auto Builder — Phase 7: .pptx 自動生成

> プレゼンテーション作成ワークフローの最終出力スキル。すべての成果物を .pptx に統合する。

## 概要

PPTX Auto Builder は、PrezenX ワークフローの最終フェーズとして、
これまでに作成されたコンテンツ・スタイルガイド・ビジュアル指示を統合し、
python-pptx によって実際の PowerPoint ファイルを自動生成するスキルである。

## 起動条件

- `style-guide.md` が存在すること（Brand Style Enforcer の出力）
- `slide-outline.md` または `presentation-context.md` が存在すること
- ユーザーが .pptx 出力を明示的に要求したとき
- HTML プレゼンテーションから PPTX への変換が必要なとき

## 前提条件

- Python 3.10+ がインストール済み
- `python-pptx` パッケージが利用可能であること
- Mermaid 図を含む場合は `mermaid-cli` (mmdc) が必要（なければテキスト代替）

## 生成ワークフロー

```
1. style-guide.md → カラー/フォント設定を読み込み
2. slide-outline.md → スライド構成を読み込み
3. presentation-context.md / executive-summary.md → 内容を統合
4. data-insights.md → データビジュアライゼーション指示を取得
5. infographic-specs.md / scientific-visuals.md → 図解指示を取得
6. python-pptx スクリプトを生成
7. スクリプトを実行
8. presentation.pptx を出力
```

## スライドレイアウト定義

### 利用可能レイアウト

| レイアウト名 | 構成 | 用途 |
|------------|------|------|
| Title Slide | タイトル + サブタイトル + 日付 | 表紙 |
| Section Header | セクション名 + 簡潔な説明 | セクション区切り |
| Content | タイトル + テキスト/箇条書き | 一般コンテンツ |
| Two Column | 左テキスト + 右図解 | 比較・対照 |
| Image Full | フルブリード画像 + オーバーレイテキスト | インパクト重視 |
| Data | タイトル + グラフ/表 | データ提示 |
| Quote | 引用 + 出典 | 権威付け・印象付け |
| Summary | キーポイント一覧 | まとめ |
| Call to Action | 次のステップ + 連絡先 | 最終スライド |

## python-pptx コードパターン

### 1. プレゼンテーション初期化

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

prs = Presentation()
prs.slide_width = Inches(13.333)   # 16:9 ワイドスクリーン
prs.slide_height = Inches(7.5)
```

### 2. タイトルスライド生成

```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 = "プレゼンテーションタイトル"
subtitle.text = "サブタイトル — 日付"

# フォント設定
for paragraph in title.text_frame.paragraphs:
    paragraph.font.size = Pt(36)
    paragraph.font.color.rgb = RGBColor(0x00, 0x78, 0xD4)
```

### 3. コンテンツスライド生成

```python
slide_layout = prs.slide_layouts[1]  # Content
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
body = slide.placeholders[1]

title.text = "スライドタイトル"
tf = body.text_frame
tf.text = "最初の箇条書き項目"

p = tf.add_paragraph()
p.text = "2番目の箇条書き項目"
p.level = 0
```

### 4. 表の自動生成

```python
rows, cols = 4, 3
left, top = Inches(1), Inches(2)
width, height = Inches(8), Inches(4)
table = slide.shapes.add_table(rows, cols, left, top, width, height).table

# ヘッダー行のスタイル設定
for col_idx in range(cols):
    cell = table.cell(0, col_idx)
    cell.text = f"ヘッダー {col_idx + 1}"
    for paragraph in cell.text_frame.paragraphs:
        paragraph.font.bold = True
        paragraph.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
```

### 5. 画像の配置

```python
img_path = "figures/diagram.png"
left, top = Inches(1), Inches(2)
width = Inches(5)
slide.shapes.add_picture(img_path, left, top, width=width)
```

### 6. スピーカーノート埋め込み

```python
notes_slide = slide.notes_slide
notes_tf = notes_slide.notes_text_frame
notes_tf.text = "このスライドでは〜を説明する。ポイントは3つ。"
```

### 7. ファイル出力

```python
prs.save("presentation.pptx")
```

## Mermaid 図の変換と埋め込み

### mmdc が利用可能な場合

```bash
mmdc -i diagram.mmd -o diagram.png -w 1920 -H 1080 --backgroundColor transparent
```

### mmdc が利用不可の場合（フォールバック）

1. Mermaid コードをテキストボックスとして埋め込み
2. ユーザーに手動変換を案内
3. 代替として表形式やフローチャートのテキスト表現を使用

## 成果物

| ファイル | 内容 |
|---------|------|
| `presentation.pptx` | 生成された PowerPoint ファイル |
| `generate_pptx.py` | 生成に使用した python-pptx スクリプト |

## Validation Loop（検証ループ）

### 検証手順

1. **入力ファイル確認**: 必要な `.md` ファイルがすべて存在するか
2. **依存関係確認**: python-pptx がインストール済みか
3. **スクリプト生成**: python-pptx コードを生成
4. **構文チェック**: 生成スクリプトの Python 構文を検証
5. **実行**: スクリプトを実行し `.pptx` を生成
6. **出力検証**: ファイルが正常に生成され、破損していないか確認
7. **スライド数確認**: 想定スライド数と一致するか

### Failure Recovery（失敗時リカバリ）

| 失敗パターン | リカバリ手順 |
|-------------|------------|
| python-pptx 未インストール | `pip install python-pptx` を実行し再試行 |
| 日本語フォント不在 | システムフォント一覧を確認し、利用可能なフォントにフォールバック |
| 画像ファイル不在 | プレースホルダー画像で生成し、不在ファイルリストを出力 |
| Mermaid 変換失敗 | テキスト代替で埋め込み、手動変換手順を案内 |
| メモリ不足（大量画像） | 画像を圧縮して再試行。それでも失敗なら分割生成 |
| スクリプト実行エラー | エラー箇所を特定し、該当スライドをスキップして残りを生成 |
| .pptx 破損 | スクリプトを修正し再生成。破損原因をログ出力 |

## Quality Gates（品質ゲート）

以下のすべてを満たすこと:

- [ ] `presentation.pptx` が正常に生成されている
- [ ] ファイルが破損しておらず、PowerPoint で開ける
- [ ] スライド数が `slide-outline.md` の構成と一致
- [ ] すべてのスライドにタイトルが設定されている
- [ ] スピーカーノートが各スライドに埋め込まれている
- [ ] カラーパレットが `style-guide.md` に準拠している
- [ ] フォントが `style-guide.md` に準拠している
- [ ] 画像が適切な解像度（最低 1920x1080px）で配置されている
- [ ] ファイルサイズが 50MB 以下

## Gotchas（落とし穴）

1. **python-pptx のフォント制限** — python-pptx はフォントの埋め込みをサポートしない。
   日本語フォント（メイリオ等）はスライドを開く環境にインストールされている必要がある。
   フォントが不在の場合、OS のデフォルトフォントで代替表示される

2. **Mermaid → 画像変換の依存関係** — `mermaid-cli` (mmdc) は Node.js 依存。
   インストールされていない環境では変換できない。
   必ず事前に `mmdc --version` で確認し、不在ならテキスト代替を提供すること

3. **画像解像度とファイルサイズのトレードオフ** — プロジェクタ向けは最低 1920x1080px が
   必要だが、画像を多用すると .pptx が 10MB を超える。
   JPEG 品質 85%、PNG は可能なら圧縮して埋め込むこと

4. **スライドマスターの制約** — python-pptx でカスタムスライドマスターを
   ゼロから作成するのは困難。既存の `.pptx` テンプレートを読み込んで
   そのレイアウトを使用するアプローチを推奨する

5. **Chart.js グラフの埋め込み** — python-pptx はネイティブチャートをサポートするが
   種類が限定的。複雑なグラフは Chart.js → PNG 画像 → PPTX の
   パイプラインで対応すること

## Memory Persistence（学習記録）

このスキルの実行で得られた知見は以下に記録する:

- 環境固有のフォント利用可否 → Gotchas に追記
- 画像圧縮の最適設定 → Gotchas に追記
- テンプレート `.pptx` のカスタマイズ結果 → `assets/` に保存
- 生成スクリプトの再利用可能パターン → `scripts/` に保存
- 失敗パターンと解決策 → Failure Recovery テーブルに追記

## 禁止事項

1. **入力ファイルなしで生成しない** — `slide-outline.md` または
   `presentation-context.md` が存在しない状態で `.pptx` を生成しない
2. **style-guide.md を無視しない** — 存在する場合は必ずカラー・フォント設定を適用する
3. **著作権のある画像を無断埋め込みしない** — ライセンス未確認の画像は使用しない
4. **機密データをスピーカーノートに含めない** — ノートも共有される可能性がある
5. **50MB を超えるファイルを生成しない** — 大きすぎるファイルはメール添付・共有不可
6. **生成スクリプトにハードコードされたパスを含めない** — 相対パスを使用する

## 条件付き参照（存在する場合のみ）

- `references/python-pptx-api.md` → python-pptx API の詳細を確認するとき
- `references/slide-layout-specs.md` → レイアウト詳細仕様を確認するとき
- `assets/template.pptx` → カスタムテンプレートを使用するとき
- `scripts/generate_pptx.py` → 既存の生成スクリプトを再利用するとき

> ⚠️ 上記ファイルが存在しない場合は、本 SKILL.md 内のコード例とパターンで代替する。

