PPTXの作成、編集、分析
.pptxはXMLファイルのZIPアーカイブです。タスクに応じてアプローチを選択します:
| タスク | アプローチ |
|---|---|
| 新規デッキ作成 | pptxgenjsスクリプトを作成 — 以下の注意事項を参照 |
| 既存デッキの編集、またはテンプレートからの構築 | 解凍 → ppt/slides/slideN.xmlを編集 → zip化 |
| 内容の読み取り | markitdown deck.pptx(各スライドは<!-- Slide number: N -->マーカーで区切られます); ビジュアルグリッド: python scripts/thumbnail.py deck.pptx |
スクリプト
パスはこのスキルのディレクトリからの相対パスです。その他はすべてプレーンなPython、node、またはシェルです。
| スクリプト | 説明 |
|---|---|
scripts/thumbnail.py deck.pptx [prefix] | 全スライドのラベル付きグリッドを作成。テンプレートのレイアウト選定に使用。.pptxのみ。prefixを指定可能(デフォルトはthumbnails → 同じディレクトリ内の他のデッキのグリッドを上書きします) |
scripts/add_slide.py unpacked/ slide2.xml [--after slideN.xml] | すべてのパッケージ管理処理を含めてスライド(またはslideLayoutN.xml)を複製します。-o out.pptxを指定すると.pptxファイルを直接入力として受け付けます |
scripts/clean.py unpacked/ | 参照されなくなったスライド、メディア、relsを削除します。<p:sldIdLst>が確定した後に実行します |
scripts/office/validate.py deck.pptx [--original src.pptx] | スキーマ、関係性、コンテンツタイプ、チャート、スライドのチェックを行います。各エラーに対して修正方法を示します。テンプレートから派生したデッキの場合は--originalを指定すると、テンプレート自体のXSDエラーを除外してチェックできます |
scripts/office/soffice.py --headless --convert-to pdf deck.pptx | LibreOfficeラッパー — 素のsofficeはこのサンドボックスでハングします |
pptxgenjsでの作成 — 注意事項
pptxgenjsはプリインストールされています — npm installを実行せず、直接スクリプトを作成してrequire('pptxgenjs')してください。requireが失敗した場合のみnpm install pptxgenjsを実行します。モデルはAPIを理解していますが、以下の点に注意してください:
- スライド追加前に
pres.layoutを設定すること。 デフォルトのキャンバスはLAYOUT_16x9= 10" × 5.625" であり、幅13.3インチではありません。座標が端を超えてもエラーにはならず、単にその形状がスライドに表示されないだけです。(LAYOUT_WIDEは13.3" × 7.5"です。) - 16進数カラー:
#は使わず、8桁も使わないこと。color: "FF0000"と記述します。"#FF0000"やアルファ値を16進数に埋め込むと(例:"00000020")、ファイルが破損します。半透明にするには: 塗りつぶしと画像にはtransparency: 0-100を、影にはopacity: 0.0-1.0を使用 — それぞれ他方では無視されます。 - pptxgenjsはオプションオブジェクトをその場で変更します(最初の使用時に値をEMUに変換)。1つの
shadow/optionsオブジェクトを2つのadd*呼び出しで共有しないでください — 毎回新しいオブジェクトを作成してください。 - 影の
offsetは0以上である必要があります — 負のオフセットはファイルを破損します。上方向に影を落とすには、正のオフセットとangle: 270を使用します。 letterSpacingは無視されます — 実際のオプションはcharSpacingです。- リスト: 各アイテムに
bullet: trueを設定し、リテラルの•は使わないでください(二重の箇条書きになります)。配列の最後のアイテム以外にはbreakLine: trueを設定します。箇条書き段落の間隔はparaSpaceAfterで設定し、lineSpacingは使わないでください(間隔が大きくなりすぎます)。 - 出力ファイルごとに
new pptxgen()を1つ作成 — インスタンスを再利用しないでください。 rectRadiusはROUNDED_RECTANGLEでのみ機能し、RECTANGLEでは機能しません。- グラデーションの塗りつぶしはサポートされていません — 代わりにグラデーション画像を背景として使用してください。
- テキストボックスにはデフォルトで内部パディングがあります — テキストを同じx位置の図形、線、アイコンと揃える必要がある場合は
margin: 0を設定します。 - 発表者ノートは
slide.addNotes("...")に記述します(プレーンテキスト、スライドごとに1回)。スライド上のテキストボックスには入れないでください。 - チャートはネイティブのままにしておくこと。 PowerPointでグラフ化できるものにはすべて
addChart()を使用します(複合チャートの場合は{type, data, options}の配列を渡します)。ライブラリが公開していないPowerPointネイティブ機能(トレンドライン、エラーバー)については、追加の系列を自分で計算するか、生成されたOOXMLを後処理します — レンダリング画像にフォールバックしないでください。PowerPointにネイティブ形式がないチャートタイプ(サンキー、ネットワーク、コード図)のみ画像として挿入します。 - デフォルトのチャートは素っ気なく表示されます — タイトルなし、データラベルなし、時代遅れのパレット。
showTitle+title、showValue: true+dataLabelPosition、chartColors: [...](あなたのパレットから)、フレームをすっきりさせる(catAxisLabelColor/valAxisLabelColor、valGridLine: { color, size }、catGridLine: { style: "none" }、単一系列の場合はshowLegend: false)を設定してください。 - 積み上げ棒または積み上げ縦棒グラフでは、
dataLabelPositionはctr、inEnd、またはinBaseである必要があります。outEndはファイルを破損します。 secondaryValAxis/secondaryCatAxisを使用する複合系列では、チャートオプションにvalAxesとcatAxesの両方を、それぞれ2つずつ設定する必要があります。 これがないとpptxgenjsは宣言されていない軸IDを書き込み、PowerPointはそのチャートを破棄し、ファイルを破損として報告します。valAxesのみを指定するだけでは不十分です。writeFile()の後、python scripts/office/validate.py deck.pptxを実行します。 このバリデータは上記2つのチャート障害と、PowerPointが拒否するスライドXMLの欠陥を報告し、それぞれの修正方法を示します。生成コード内で修正してください。パックされたXMLを手動編集しないこと。<p:presentation>の子要素の順序を変更しないでください。 pptxgenjsは<p:sldIdLst>の直後に<p:notesMasterIdLst>を書き込み、両方のマスターを1つのテーマパーツにポイントします。PowerPointはそれを問題なく読み取りますが、要素を移動すると同じデッキが開けなくなります。- アイコン:
react-iconsをSVGとしてレンダリングし(ReactDOMServer.renderToStaticMarkup)、sharpで256px以上にラスタライズし、addImage({ data: "image/png;base64," + buf.toString("base64") })で挿入します —image/png;base64,プレフィックスは必須です(react-icons、react、react-dom、sharpはプリインストールされています — requireが失敗した場合のみnpm install react-icons react react-dom sharpを実行)。
既存のデッキとテンプレートの編集
まずレイアウトを選択します: python scripts/thumbnail.py template.pptx template-thumbs を実行すると、すべてのスライドのラベル付きグリッドが作成され、作成されたファイル(複数可)が出力されます — template-thumbs.jpg(スライドが12枚を超えるとtemplate-thumbs-N.jpgに分割)。必ず2番目の引数として、デッキの名前を渡してください。 デフォルトはthumbnailsなので、同じディレクトリ内で2つのデッキのサムネイルを作成すると、互いのグリッドを上書きし合います — 最初のデッキのグリッドは単に失われます(テンプレート分析のみ — ビジュアルQAには画像への変換のフル解像度レンダリングが必要です; .pptxのみを受け付けるので、.potxは先に.pptxにコピーしてください)。markitdownと組み合わせて、各コンテンツセクションをテンプレートスライドにマッピングし、レイアウトを多様化します — すべてのセクションを同じタイトルと箇条書きのスライドに配置しないでください。
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 # スライド(またはslideLayoutN.xml)を複製; 新しいスライドのパスを出力
# スライドの並べ替え/削除 = ppt/presentation.xml の <p:sldIdLst> を編集
python scripts/clean.py unpacked/ # 削除後: 孤立したスライド、メディア、relsを削除
# ppt/slides/slideN.xml でスライドの内容を編集
(cd unpacked && rm -f ../out.pptx && zip -Xr ../out.pptx .) # ディレクトリの**内部から** zip; 事前に削除しないと削除した部分が残る
python scripts/office/validate.py out.pptx --original deck.pptx
- すべての構造的な作業(追加、削除、並べ替え)は、スライドの内容を編集する前に行います。
add_slide.pyはスライドファイルをそのままコピーするため、編集後に複製すると編集済みの内容が複製されます。また、clean.pyは<p:sldIdLst>にないスライド(書き込んだばかりのものも含む)を削除します。 - スライドファイルを手動でコピーしないでください —
add_slide.pyは新しいスライドに必要なすべての登録を行い、作成内容を報告します(Created ppt/slides/slide17.xml from slide2.xml)。また、ファイルを直接操作することもできます:add_slide.py deck.pptx slide2.xml -o out.pptx—-oを指定してください。指定しないと入力デッキをその場で上書きします。 複製されたスライドは、ソースのチャート/SmartArt/埋め込みオブジェクトのパーツを複製するのではなく、参照するため、一方のスライドのチャートを編集するともう一方も変更されます。 python-pptxを使用する場合、次の3つのことはできません: スライドの複製(エントリポイントはadd_slide(layout)のみ)、text_frame.text = "..."による書式保持(段落がスタイルなしの1つのランに縮小されます — 代わりにrun.textを割り当てます)、ほとんどのテンプレートアートで使用されるSVG/EMFの読み取り(add_pictureはUnidentifiedImageErrorをスローします)。- レガシー
.pptは最初に変換する必要があります:python scripts/office/soffice.py --headless --convert-to pptx file.ppt。.potxテンプレートは解凍とパックが同じように行われるため、出力の拡張子は.potxのままにしてください。 - テンプレートのアイコンや画像を再利用するには、既にそれを含むスライドまたはレイアウトを複製します。
テンプレートを埋めるとき:
- XML変換をスクリプト化する場合は、
defusedxml.minidomでパースします — OOXMLをxml.etree.ElementTreeでラウンドトリップすると、名前空間プレフィックスが書き換えられ、デッキが破損します。 - テンプレートのスロットとソースアイテムは一致しないことがあります。 テンプレートに4人のチームメンバーが表示されていて、実際のメンバーが3人の場合、4人目のグループ全体(画像+テキストボックス)を削除します。テキストだけ削除しないでください — その後、QAで孤立したビジュアルがないか確認します。
- リスト項目ごとに1つの
<a:p>— 項目を1つの段落に連結しないでください。間隔を維持するために兄弟の<a:pPr>をコピーし、タイトル、セクションヘッダー、インラベル(Status:、Owner:)には<a:rPr>にb="1"を設定します。 - 箇条書きはレイアウトから継承させます。上書きする場合のみ
<a:buChar>、<a:buAutoNum>(番号付き)、または<a:buNone>を追加します — テキスト内にリテラルの•は絶対に使用しないでください。 - 先頭または末尾にスペースがあるテキストは、その
<a:t>にxml:space="preserve"を設定する必要があります。
デザインアイデア
退屈なスライドを作成しないでください。 白い背景にプレーンな箇条書きは誰も感心させません。各スライドに対して、以下のリストからアイデアを検討してください。
開始前
- 大胆で内容に基づいたカラーパレットを選ぶ: パレットは、このトピックのためにデザインされたと感じられるものでなければなりません。色を別のまったく異なるプレゼンテーションに適用しても「機能する」場合、それは十分に具体的な選択をしていない証拠です。
- 均等よりも支配性: 1つの色が支配的(視覚的な重みの60-70%)になり、1〜2のサポートトーンと1つの鋭いアクセントカラーを持つようにします。すべての色に同じ重みを与えないでください。
- ダーク/ライトのコントラスト: タイトルスライドと結論スライドには暗い背景、コンテンツスライドには明るい背景(「サンドイッチ」構造)。または、プレミアム感を出すために全体を暗く統一します。
- 視覚的なモチーフにコミットする: 1つの特徴的な要素を選び、それを繰り返します — 角丸の画像フレーム、色付きの丸の中のアイコン。すべてのスライドでそれを続けます。モチーフとしてカラーバーやアクセントストライプを使用しないでください(「避けるべきこと」リストを参照)。
カラーパレット
トピックに合った色を選んでください — デフォルトの青にしないでください。以下のパレットをインスピレーションとして使用してください:
| テーマ | プライマリ | セカンダリ | アクセント |
|---|---|---|---|
| Midnight Executive | 1E2761 (ネイビー) | CADCFC (アイスブルー) | FFFFFF (ホワイト) |
| Forest & Moss | 2C5F2D (フォレスト) | 97BC62 (モス) | F5F5F5 (クリーム) |
| Coral Energy | F96167 (コーラル) | F9E795 (ゴールド) | 2F3C7E (ネイビー) |
| Warm Terracotta | B85042 (テラコッタ) | E7E8D1 (サンド) | A7BEAE (セージ) |
| Ocean Gradient | 065A82 (ディープブルー) | 1C7293 (ティール) | 21295C (ミッドナイト) |
| Charcoal Minimal | 36454F (チャコール) | F2F2F2 (オフホワイト) | 212121 (ブラック) |
| Teal Trust | 028090 (ティール) | 00A896 (シーフォーム) | 02C39A (ミント) |
| Berry & Cream | 6D2E46 (ベリー) | A26769 (ダスティローズ) | ECE2D0 (クリーム) |
| Sage Calm | 84B59F (セージ) | 69A297 (ユーカリ) | 50808E (スレート) |
| Cherry Bold | 990011 (チェリー) | FCF6F5 (オフホワイト) | 2F3C7E (ネイビー) |
各スライドについて
すべてのスライドには視覚的な要素が必要です — 画像、チャート、アイコン、図形のいずれか。テキストのみのスライドは記憶に残りません。
レイアウトオプション:
- 2カラム(左にテキスト、右にイラスト)
- アイコン+テキストの行(色付き円の中のアイコン、太字のヘッダー、下に説明)
- 2x2または2x3グリッド(片側に画像、反対側にコンテンツブロックのグリッド)
- ハーフブリード画像(左側または右側いっぱい)とコンテンツのオーバーレイ
データ表示:
- 大きな統計コールアウト(大きな数字60-72pt、下に小さなラベル)
- 比較コラム(before/after、メリット/デメリット、選択肢の横並び)
- タイムラインまたはプロセスフロー(番号付きステップ、矢印)
ビジュアルの仕上げ:
- セクションヘッダーの横にある小さな色付き円の中のアイコン
- 重要な統計やタグラインのイタリック体のアクセントテキスト
タイポグラフィ
あなたが.pptxに書き込んだフォント名は、この環境ではなく、ユーザーのPowerPointでレンダリングされます。 ビジュアルQAはLibreOfficeを介してレンダリングされますが、LibreOfficeは持っていないフォントを代替フォントで置き換えます。一部のフォントでは代替フォントの横幅が異なるため、QAプレビューでは実際のデッキとは異なるテキストオーバーフロー(またはフィット)が表示される可能性があります。QAを信頼できるものにするために:
- 安全なフォント(QAで実際の幅でレンダリングされ、かつ Officeに同梱されている): Arial, Calibri, Cambria, Times New Roman, Courier New, Bookman Old Style, Century Schoolbook。本文やフィットが重要なテキストにはこれらを使用します。
- ゼロQAリスクで個性を出すヘッダー: 安全リストのセリフヘッダー(Cambria, Bookman Old Style, Century Schoolbook)と安全リストのサンズ体本文(CalibriまたはArial)を組み合わせます。信頼性のあるオーバーフローチェックを犠牲にせずに、視覚的なコントラストを得られます。
- ユーザーが安全リスト外のフォントを指定した場合(例: Georgia、Trebuchet MSなど): ユーザーが指定した場所ではそのフォントを使用しますが、そのコンテナのサイズには余裕(約10%)を持たせ、その要素のQAテキストフィットは信頼しないでください — そのフォントのプレビューは概算です。ユーザーが指定していない場合は、本文には安全リストのフォントを優先してください。
- QA信頼性の低いフォント(代替フォントの横幅が異なる — オーバーフローチェックが誤っている可能性がある): Georgia, Trebuchet MS, Impact, Arial Black, Garamond, Consolas, Palatino Linotype。Calibri Lightの代替は環境によって異なります。QA信頼性低として扱ってください。余裕を持たせたタイトルやアクセントには問題ありません。QAのテキストフィットは信頼しないでください。
- デフォルトでAptosを使用しないでください — Officeの2023年以降のデフォルトフォントは、ここにメトリクス互換の代替フォントがなく、かつ 古いOfficeインストールには存在しないため、両方の環境で信頼性が低くなります。
| 要素 | サイズ |
|---|---|
| スライドタイトル | 36-44pt 太字 |
| セクションヘッダー | 20-24pt 太字 |
| 本文 | 14-16pt |
| キャプション | 10-12pt やや淡く |
…
[翻訳のため一部省略]