Claudeのpptxスキルの使い方 — 作成・編集・読み取りの分岐と落とし穴
pptxスキルは作成・編集・読み取りでやり方が分かれます。SKILL.mdの手順、ファイルが壊れる設定、検証コマンド、動く環境の違いを読み解きます。
pptxスキルは、.pptx と .potx が関わる作業をすべて引き受けるスキルです。anthropics/skillsリポジトリの skills/pptx には SKILL.md、LICENSE.txt、scripts フォルダが置かれています。中身の中心は SKILL.md で、作業を「作る」「直す」「読む」の3つに分けています。
使い方の結論は単純です。新規作成は pptxgenjs のスクリプト、既存ファイルの編集はZIPを展開してXMLを直接編集、読み取りは markitdown です。ここを取り違えると、ファイルが開けなくなったり、テンプレートの書式が消えたりします。
API標準スキルとしての一覧や呼び出し方はAgent SkillsのAPI標準スキル一覧にあります。この記事では、スキル本体が何を指示しているかを手順と落とし穴に分けて読みます。
pptxスキルは3つの作業をどう振り分けるか
SKILL.md の冒頭は、.pptx はXMLファイルを詰めたZIPアーカイブだという一文から始まります。そのうえで、作業ごとにやり方を決めた表を置いています。
作業別の入り口
新規作成
pptxgenjsのスクリプトを書きます。ゼロから組むときの標準ルートです。既存デッキの編集・テンプレート流用
展開して
ppt/slides/slideN.xmlを編集し、ZIPに戻します。内容の読み取り
markitdown deck.pptxでテキストを取ります。見た目を一覧するならscripts/thumbnail.pyです。
markitdown の出力は、スライドごとに <!-- Slide number: N --> というマーカーで区切られます。あとから「3枚目だけ直して」と指示するときの目印に使えます。
スキルが動き出す条件も description に書かれています。.pptx や .potx のファイル名が出たとき、または「deck」「slides」「presentation」といった語が出たときです。メール本文や要約にだけ使う目的でも、.pptx を開く必要があれば対象になります。
同梱スクリプトは何をするのか
scripts フォルダのスクリプトは、すべてスキルのディレクトリからの相対パスで呼びます。SKILL.md が挙げているのは次の5つです。
| スクリプト | 役割 | 注意点 |
|---|---|---|
thumbnail.py | 役割全スライドのラベル付き一覧画像を作る | 注意点.pptx のみ。出力名の prefix を必ず渡す |
add_slide.py | 役割スライド(またはレイアウト)を複製する | 注意点入力を直接渡すときは -o が必須 |
clean.py | 役割参照されなくなったスライド・画像・関係定義を消す | 注意点<p:sldIdLst> が確定してから実行する |
office/validate.py | 役割スキーマ・関係・コンテントタイプ・チャートを検査する | 注意点テンプレート由来なら --original を付ける |
office/soffice.py | 役割LibreOfficeの起動ラッパー | 注意点素の soffice はこの環境で固まる |
thumbnail.py の prefix の既定値は thumbnails です。同じ場所で2つのデッキを処理すると、先のデッキの一覧画像が上書きされて消えます。デッキ名を付けて呼ぶのが安全です。
python scripts/thumbnail.py template.pptx template-thumbs12枚を超えると template-thumbs-N.jpg のように分割されます。.potx はそのままでは渡せないので、.pptx の名前にコピーしてから使います。
新規作成でファイルが壊れる設定はどれか
新規作成の節は、APIの説明ではなく「踏みやすい箇所」の一覧です。pptxgenjs は事前にインストール済みという前提で、require('pptxgenjs') から書き始めます。このrequireが失敗したときだけ npm install pptxgenjs を実行する、という順序です。
最も重要なのは、ファイルが壊れる指定と、黙って無視される指定を分けて覚えることです。
ファイルが壊れる指定
色の指定
"#FF0000"のように#を付けると壊れます。"00000020"のように透明度を8桁の16進に混ぜても壊れます。正しくは"FF0000"です。影の offset
負の値は壊れます。影を上向きに落とすなら
angle: 270と正のoffsetを使います。積み上げグラフのラベル位置
積み上げの棒・縦棒で
dataLabelPosition: "outEnd"を使うと壊れます。ctr・inEnd・inBaseから選びます。第2軸つきのコンボチャート
secondaryValAxisとsecondaryCatAxisを使うなら、valAxesとcatAxesの両方に2エントリずつ必要です。片方だけだとPowerPointがグラフを捨て、破損ファイル扱いにします。
壊れはしないが意図どおりにならない指定も挙げられています。
letterSpacingは無視されます。字間はcharSpacingで指定します- 透明度は塗りや画像なら
transparency: 0-100、影ならopacity: 0.0-1.0です。取り違えると、どちらも黙って無視されます - グラデーションの塗りは非対応です。グラデーション画像を背景にします
rectRadiusはROUNDED_RECTANGLEでしか効きません- 箇条書きは
bullet: trueを使い、文字としての•は入れません。二重に表示されます。配列の項目には、最後を除いてbreakLine: trueを付けます - 箇条書きの段落間は
paraSpaceAfterで空けます。lineSpacingを使うと間隔が開きすぎます
オブジェクトの扱いにも癖があります。pptxgenjs は渡されたオプションのオブジェクトを内部でEMUに書き換えます。同じ shadow を2つの add* 呼び出しで共有すると、2回目に壊れた値が入ります。呼び出しごとに新しいオブジェクトを作ります。出力ファイルごとに new pptxgen() を1つ作り、使い回さない点も同じ理由です。
キャンバスの大きさは思っているより小さい
pres.layout はスライドを追加する前に決めます。既定の LAYOUT_16x9 は10インチ×5.625インチで、一般的なワイド画面の13.3インチ幅ではありません。13.3×7.5インチが必要なら LAYOUT_WIDE を選びます。
端を越えた座標はクリップされず、そのまま書き込まれます。図形が「消えた」ように見えるときは、まず座標がキャンバス外に出ていないかを疑います。
グラフは画像にしない
グラフは addChart() でネイティブのまま作ります。トレンドラインや誤差バーのように pptxgenjs が出せない機能も、画像に落とさず、追加の系列を自分で計算するかOOXMLを後処理します。画像にしてよいのは、PowerPointに標準の形がないSankey・ネットワーク・コード図の類だけです。
既定のグラフはタイトルもデータラベルもない素の見た目です。showTitle と title、showValue: true と dataLabelPosition、chartColors を指定して整えます。系列が1つなら showLegend: false にします。
アイコンはreact-iconsから画像にして入れる
アイコンは react-icons をSVGに描き出し、sharp で256px以上のPNGにして addImage で入れます。data には image/png;base64, という接頭辞が必須です。これらのパッケージも事前インストール済みの扱いで、requireが失敗したときだけ npm install します。
作ったあとの検証はどう進めるか
SKILL.md はQAを「必須」と書いています。順序は内容、ファイル、見た目の3段階です。
書き出し後の検証
- 1
内容を確認する
markitdown output.pptxで欠落・誤字・順序を見ます。テンプレートを使った場合は、プレースホルダーの取り残しをgrepで探します。 - 2
ファイルを検査する
python scripts/office/validate.py output.pptxを実行します。テンプレート由来なら--original src.pptxを付けます。 - 3
画像にして目で見る
PDFに変換し、
pdftoppmでJPEGにして全枚を見ます。最初に探すのは、文字のあふれと見切れです。
テンプレートを使ったデッキでは、取り残しの検査に次のコマンドを使うよう示されています。
markitdown output.pptx | grep -iE \
"\bx{3,}\b|lorem|ipsum|\bTODO|\[insert"validate.py が必要な理由は、SKILL.md の説明にあります。pptxgenjs が出すグラフのXMLには、PowerPointが開けないものがあります。python-pptxは開け、LibreOfficeは描画でき、XSDも通ります。PowerPointにだけ拒否されるため、他のツールでの確認では見逃します。
失敗が出たら、手書きのXML修正ではなく、生成スクリプト側を直して作り直します。--original は、テンプレート自身のXSDエラーを自分のミスと混同しないための基準線です。関係定義・コンテントタイプ・グラフの検査は --original を渡しても無視され、テンプレート由来の問題も報告されます。
画像化のコマンドは次の4行です。修正のたびに、PDFの再生成からやり直します。
python scripts/office/soffice.py --headless --convert-to pdf output.pptx
rm -f slide-*.jpg
pdftoppm -jpeg -r 150 output.pdf slide
ls -1 "$PWD"/slide-*.jpgpdftoppm の連番は、10枚未満なら slide-1.jpg、10〜99枚なら slide-01.jpg、100枚以上なら slide-001.jpg です。
既存デッキを編集するときの手順と順番
編集は、展開、XMLの編集、ZIPへの再パッケージという流れです。SKILL.md のコマンドをそのまま並べると次のようになります。
python3 -c "import sys,zipfile; \
zipfile.ZipFile(sys.argv[1]).extractall('unpacked')" deck.pptx
python scripts/add_slide.py unpacked/ slide2.xml --after slide2.xml
python scripts/clean.py unpacked/
(cd unpacked && rm -f ../out.pptx && zip -Xr ../out.pptx .)
python scripts/office/validate.py out.pptx --original deck.pptx順序が結果を左右します。追加・削除・並べ替えの構造作業を先に終え、そのあとでスライドの中身を編集します。理由は2つあります。
add_slide.pyはスライドのファイルをそのまま複製します。中身を編集したあとに複製すると、編集済みの内容がコピーされますclean.pyは<p:sldIdLst>に載っていないスライドを消します。書いたばかりのスライドも例外ではありません
ZIPは展開したディレクトリの内側から作り、先に出力ファイルを rm します。残すと、削除したパーツが新しいファイルに生き残ります。
手でコピーしない、-oを付ける
スライドのファイルは手でコピーしません。add_slide.py は新しいスライドに必要な登録を全部行い、Created ppt/slides/slide17.xml from slide2.xml のように結果を出力します。.pptx を直接渡す形では -o out.pptx が必須です。省くと入力のデッキが上書きされます。
複製したスライドは、元のスライドのグラフ・SmartArt・埋め込みオブジェクトを参照したままです。複製したスライドのグラフを編集すると、元のスライドのグラフも変わります。
テンプレートに流し込むときの決まり
テンプレートに内容を入れる節には、見落としやすい指示が並んでいます。
- XMLを変換するスクリプトは
defusedxml.minidomで解析します。xml.etree.ElementTreeで往復させると名前空間の接頭辞が書き換わり、デッキが壊れます - テンプレートに4人分の枠があり、用意した人数が3人なら、4人目のグループ(画像とテキストボックス)ごと消します。文字だけ消すと、画像が孤立して残ります
- リストの項目は
<a:p>1つにつき1項目です。連結しません。兄弟要素の<a:pPr>をコピーして間隔を保ち、見出しやラベル(Status:など)の<a:rPr>にはb="1"を付けます - 箇条書き記号はレイアウトから継承させ、上書きするときだけ
<a:buChar>、<a:buAutoNum>、<a:buNone>を足します - 前後に空白があるテキストには、
<a:t>にxml:space="preserve"が必要です
python-pptx を使う場合に、できないことも3つ書かれています。スライドの複製、text_frame.text = "..." での書式維持(段落が1つの無装飾runになります)、そしてSVGやEMFの読み込み(add_picture が UnidentifiedImageError を出します)です。書式を保ちたいときは run.text に代入します。
古い .ppt は先に soffice.py --headless --convert-to pptx で変換します。.potx は .pptx と同じ手順で展開・再パッケージでき、出力にも .potx の拡張子を保ちます。
落とし穴
p:presentation の子要素を並べ替えるとデッキが開かなくなる
pptxgenjs は <p:notesMasterIdLst> を <p:sldIdLst> の直後に書き、2つのマスターを同じテーマに向けます。PowerPointはこのままなら読めます。要素を動かすと、同じデッキが開けなくなります。順序は触りません。
どの作業にどの道具を使うか
作業を迷ったときは、次の順に問うと入り口が決まります。
入り口の決め方
- Q既存の .pptx / .potx を元にしますか?答えがいいえのとき答えがはい
展開してXMLを編集するルートです。先に
thumbnail.pyでレイアウトを選び、構造作業を終えてから中身を編集します。 - Q新しく作る前に、中身だけ知りたいですか?答えがいいえのとき答えがはい
読み取りだけなら
markitdownで足ります。見た目を確かめたいときだけthumbnail.pyを足します。
pptxgenjs で新規作成する
pres.layout を先に決め、色は # なしの6桁にします。書き出した後に validate.py を通します。
デザイン指針はどこまで細かいか
SKILL.md の後半は、動作ではなく見た目の指示です。Claudeにスライドを作らせると「白背景に箇条書き」になりがちな点を、あらかじめ禁じる内容になっています。
方針として挙がっているのは、主題に合わせた配色を選ぶこと、1色を支配的にして補助色を1〜2色、強調色を1色に絞ること、タイトルと結びは暗く本文は明るくする構成、1つのモチーフを全スライドで繰り返すことです。各スライドには画像・グラフ・アイコン・図形のいずれかを入れ、文字だけのスライドは避けるよう求めています。
避けるべき表現も明記されています。タイトル下のアクセント線、ヘッダーやフッターの色帯、カードの片側だけの縁取り線は、いずれも「AIが作ったスライドの典型」として禁止です。背景色を指定されなかったときは、クリームやベージュではなく白か、利用者のブランド配色を使います。
フォントは、手元のPowerPointで表示されるため、確認用の描画(LibreOffice)と幅が食い違うことがあります。そこで幅が正確に再現される安全なフォントとして、Arial、Calibri、Cambria、Times New Roman、Courier New、Bookman Old Style、Century Schoolbookが挙げられています。見出しに個性が欲しいときは、Cambriaなどの明朝系とCalibriかArialの本文を組み合わせます。Aptosは代替フォントがなく、古いOfficeにも入っていないため、既定にしないよう書かれています。
| 要素 | サイズ |
|---|---|
| スライドタイトル | サイズ36〜44pt太字 |
| 節見出し | サイズ20〜24pt太字 |
| 本文 | サイズ14〜16pt |
| キャプション | サイズ10〜12ptの控えめな色 |
余白は端から0.5インチ以上、ブロック間は0.3〜0.5インチです。
どの環境で動かせるか
pptxスキルは、動く環境によって使える条件が変わります。ここは SKILL.md ではなくAgent Skillsの概要ページにある条件です。
環境ごとの条件
Claude API
標準スキルは skill_id に pptx を指定して使います。コード実行ツールが前提で、コンテナにはネットワークがなく、実行時にパッケージを追加できません。
claude.ai
標準スキルとして使えます。ネットワークは、ユーザーや管理者の設定で、全面・一部・なしのいずれかになります。
Claude Code
PowerPointなどの標準の文書スキルは使えません。カスタムスキルは ~/.claude/skills/ か .claude/skills/ に置いて使います。
SKILL.md が「preinstalled」と書く pptxgenjs、markitdown、LibreOfficeは、APIのコンテナのように、ネットワークもパッケージ追加もない環境を想定した書き方です。
Claude Codeでこのリポジトリのスキルを自分のスキルとして置く場合は、同じ道具が最初から入っているとは限りません。pptxgenjs、markitdown、LibreOffice、pdftoppm を自分で用意する必要があります。ライセンスは Proprietary で、条件は LICENSE.txt に書かれているため、コピーして配布する前に読みます。スキル同士はプラットフォーム間で同期されず、claude.aiにアップロードしたものはAPIでは使えません。
標準スキルをAPIで呼ぶ具体的なリクエストは、Agent Skills APIクイックスタートにあります。Officeアドインとして使うならClaude for PowerPointの導入手順が別の経路です。
指示の出し方で変わること
スキルの手順は固定ですが、依頼文に含める情報でやり方が変わります。次のような依頼文は、SKILL.md の分岐に沿って書いた例です。
添付の template.potx のレイアウトを使って、
別添の議事録から8枚のデッキを作ってください。
- 先にサムネイル一覧でレイアウトを選ぶこと
- 構造(追加・削除)を終えてから本文を入れること
- 最後に validate.py を --original 付きで実行して結果を報告すること「新規に作る」のか「テンプレートから作る」のかを明示するのがポイントです。前者は pptxgenjs、後者はXML編集で、壊れ方もデバッグの方法も別物になります。検証コマンドの実行を依頼文に含めておくと、スキルが出力を読んで直す反復も依頼の一部になります。
まとめ
pptxスキルは、作成・編集・読み取りを別の道具に振り分けるのが核心です。作成で壊れるのは色・影・グラフ軸の指定、編集で壊れるのは作業の順序とZIPの作り方です。どちらも validate.py が最終的な関門になります。依頼するときは、作る元(新規かテンプレートか)と検証の実行を書き添えてください。