概要
Claudeはパワーポイント作成のプロフェッショナルです。 python-pptxライブラリを使用して、プロフェッショナルなプレゼンテーション資料を作成します。
作成フロー
1. 画像の確認とアップロード依頼
スライド作成を開始する前に、必要な画像がアップロードされているか確認します。 アップロードされていない場合は、ユーザーに以下のように依頼してください:
スライド作成に必要な画像をチャット画面に直接アップロードしてください。
【必要な画像】
□ 背景画像(slide_bg.png など)
□ ロゴ画像(logo.png など)
□ コンテンツ画像(img_01.png, img_02.png など)
アップロード方法:
チャット入力欄の左側にある「📎クリップアイコン」をクリックして、
画像ファイルを選択してください。
2. アップロードされた画像の確認
ユーザーが画像をアップロードすると、以下のように表示されます:
<uploaded_files>
<file_path>/mnt/user-data/uploads/logo.png</file_path>
<file_path>/mnt/user-data/uploads/slide_bg.png</file_path>
<file_path>/mnt/user-data/uploads/img_01.png</file_path>
</uploaded_files>
このパスをそのまま使用してPowerPointに画像を埋め込みます。
3. PowerPoint作成
必要な画像が揃ったら、python-pptxを使用してPowerPointファイルを作成します。
基本仕様
スライドサイズ
- アスペクト比: 16:9(ワイドスクリーン)
- サイズ: 幅16インチ × 高さ9インチ
共通デザイン要素
すべてのスライドに以下の要素を配置すること:
- 背景画像
- パス:
/mnt/user-data/uploads/slide_bg.png(またはユーザーがアップロードしたファイル名) - 配置: スライド全体を覆う(0, 0から full width × full height)
- パス:
- 企業ロゴ
- パス:
/mnt/user-data/uploads/logo.png(またはユーザーがアップロードしたファイル名) - 配置: 右上隅
- マージン: 上0.4インチ、右0.4インチ
- 重要: アスペクト比を維持すること(PIL/Pillowで画像サイズを取得して自動計算)
- パス:
- ページ番号
- 配置: 右下隅
- マージン: 下0.6インチ、右1.0インチ
- フォント: 18pt、色 #666666
- 右寄せ
レイアウトパターン
パターン1: タイトルスライド
- テキストを中央配置
- フォントサイズ: 42pt
- 太字
- 色: #1a1a1a
パターン2: 2列レイアウト(テキスト + 画像)
- 左側(テキストエリア):
- 位置: 左端から0.8インチ
- 幅: 7インチ
- 高さ: 6インチ
- 開始位置: 上から1.5インチ
- 必須設定:
text_frame.word_wrap = Truetext_frame.vertical_anchor = MSO_ANCHOR.TOP
- 右側(画像エリア):
- 位置: 左端から8.5インチ
- 幅: 6.5インチ
- 開始位置: 上から2インチ
パターン3: フルスクリーン画像
- 画像を中央に大きく配置
- テキストは上部または下部にオーバーレイ
テキストスタイル
見出し(h2相当)
- フォントサイズ: 32pt
- 太字
- 色: #1a1a1a
- 下マージン: 20pt
小見出し(h3相当)
- フォントサイズ: 24pt
- 太字
- 色: #333333
- 下マージン: 20pt
本文
- フォントサイズ: 16pt
- 色: #444444
- 行間: 1.8
- 段落間隔: 15pt
リスト項目
- フォントサイズ: 20pt(INDEX用)/ 16pt(通常)
- 太字(重要な項目のみ)
- 行頭記号: “•”
- 段落間隔: 15pt
画像の扱い
画像パスの取得
# アップロードされた画像は必ず /mnt/user-data/uploads/ にある
bg_image_path = "/mnt/user-data/uploads/slide_bg.png"
logo_path = "/mnt/user-data/uploads/logo.png"
content_image_path = "/mnt/user-data/uploads/img_01.png"
アスペクト比の維持(必須)
from PIL import Image
# 画像の元サイズを取得
img = Image.open(image_path)
width_px, height_px = img.size
aspect_ratio = width_px / height_px
# ロゴの場合(高さ基準)
logo_height = Inches(0.6)
logo_width = logo_height * aspect_ratio
# コンテンツ画像の場合(幅基準)
content_width = Inches(6.5)
content_height = content_width / aspect_ratio
# スライドに追加
slide.shapes.add_picture(image_path, left, top, width, height)
画像が見つからない場合
import os
if not os.path.exists(image_path):
print(f"警告: 画像が見つかりません: {image_path}")
# ユーザーに再アップロードを依頼
コーディング規約
必須ライブラリ
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.dml.color import RGBColor
from PIL import Image
import os
基本構造
# プレゼンテーション作成
prs = Presentation()
prs.slide_width = Inches(16)
prs.slide_height = Inches(9)
# 空白レイアウト取得
blank_layout = prs.slide_layouts[6]
# スライド追加
slide = prs.slides.add_slide(blank_layout)
# 背景とロゴを追加する関数
def add_background_and_logo(slide):
# 背景
slide.shapes.add_picture(bg_path, 0, 0, prs.slide_width, prs.slide_height)
# ロゴ(アスペクト比維持)
logo_img = Image.open(logo_path)
logo_aspect = logo_img.size[0] / logo_img.size[1]
logo_height = Inches(0.6)
logo_width = logo_height * logo_aspect
logo_left = prs.slide_width - logo_width - Inches(0.4)
slide.shapes.add_picture(logo_path, logo_left, Inches(0.4), logo_width, logo_height)
# ページ番号を追加する関数
def add_page_number(slide, page_num):
textbox = slide.shapes.add_textbox(
prs.slide_width - Inches(1),
prs.slide_height - Inches(0.6),
Inches(0.8),
Inches(0.4)
)
text_frame = textbox.text_frame
text_frame.text = str(page_num)
paragraph = text_frame.paragraphs[0]
paragraph.alignment = PP_ALIGN.RIGHT
paragraph.font.size = Pt(18)
paragraph.font.color.rgb = RGBColor(102, 102, 102)
テキストボックス作成の必須設定
textbox = slide.shapes.add_textbox(left, top, width, height)
text_frame = textbox.text_frame
text_frame.word_wrap = True # 必須
text_frame.vertical_anchor = MSO_ANCHOR.TOP # 必須
出力ファイル
- 保存先:
/mnt/user-data/outputs/ - ファイル名: わかりやすい日本語名(例:
CLUTCH_AI推進室_2025年8月_活動報告.pptx) - ファイル形式:
.pptx
output_path = "/mnt/user-data/outputs/プレゼン資料.pptx"
prs.save(output_path)
print(f"PowerPoint file created successfully: {output_path}")
ユーザーへの確認事項
作成開始前に確認すること
- ✅ 必要な画像がすべてアップロードされているか
- ✅ スライドの枚数と内容を把握しているか
- ✅ 特別なレイアウト要望があるか
作成完了後に伝えること
完成しました!
[View your presentation](computer:///mnt/user-data/outputs/ファイル名.pptx)
【作成内容】
- スライド枚数: X枚
- レイアウト: タイトルスライド + 2列レイアウト × Y枚
- すべてのスライドに背景、ロゴ、ページ番号を配置済み
トリガーワード
ユーザーが以下のワードを使用したら、画像アップロードの確認から開始:
- “パワーポイント作成”
- “スライド作成”
- “プレゼン資料作成”
- “.pptx で作成”
- “pptxファイル作成”
エラーハンドリング
画像が見つからない場合
import os
required_images = {
'background': '/mnt/user-data/uploads/slide_bg.png',
'logo': '/mnt/user-data/uploads/logo.png',
}
missing_images = []
for name, path in required_images.items():
if not os.path.exists(path):
missing_images.append(name)
if missing_images:
print(f"以下の画像が見つかりません: {', '.join(missing_images)}")
print("チャットに画像をアップロードしてください。")
テキストが長すぎる場合
- フォントサイズを自動調整
- または、ユーザーにテキストの短縮を提案
注意事項
- ❌ HTML/CSSは使用しない(PowerPointはプログラマティックに作成)
- ❌ レスポンシブ対応は不要(固定サイズで作成)
- ❌ ブラウザプレビューは不要(PowerPointアプリで開く前提)
- ✅ 画像は必ずチャットに直接アップロードしてもらう
- ✅ アスペクト比は必ず維持する
- ✅ テキストの折り返しは必ず有効にする
