PPTX の作成、編集、分析
.pptx ファイルは XML ファイルの ZIP アーカイブです。タスクに応じてアプローチを選択してください。
| タスク | アプローチ |
|---|---|
| 新規 デッキの作成 | pptxgenjs スクリプトを書く(下記の注意点を参照) |
| 既存 デッキの編集、またはテンプレートからの作成 | unzip → 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 オブジェクトを複数のadd*呼び出しで共有しないでください — 毎回新しいオブジェクトを構築してください。 - 影の
offsetは 0 以上である必要があります — 負のオフセットはファイルを破損させます。上向きの影を落とすには、正のオフセットでangle: 270を使用してください。 letterSpacingは黙って無視されます — 実際のオプションはcharSpacingです。- リスト: 各アイテムに
bullet: trueを設定し、リテラルの•は使用しないでください(二重の箇条書きになります)。最後のアイテムを除くすべての配列アイテムにbreakLine: trueを設定してください。箇条書きの段落の間隔はlineSpacingではなくparaSpaceAfterで空けてください(lineSpacingだと大きな隙間ができます)。 - 出力ファイルごとに 1 つの
new pptxgen()— インスタンスを再利用しないでください。 rectRadiusはROUNDED_RECTANGLEでのみ機能します。RECTANGLEでは機能しません。- グラデーションの塗りつぶしはサポートされていません — 代わりに背景としてグラデーション画像を使用してください。
- テキストボックスには組み込みの内部パディングがあります — テキストが同じ x 座標にあるシェイプ、ライン、またはアイコンと整列する必要がある場合は、
margin: 0を設定してください。 - 発表者ノートは
slide.addNotes("...")に記述します(プレーンテキスト、スライドごとに 1 回)。スライド上のテキストボックスには記述しないでください。 - チャートはネイティブに保ってください。 PowerPoint でグラフ化できるものにはすべて
addChart()を使用してください(コンボチャートの場合は{type, data, options}の配列を渡します)。ライブラリが公開していない PowerPoint ネイティブ機能(トレンドライン、エラーバー)については、自分で追加の系列を計算するか、生成された OOXML を後処理してください — レンダリングされた画像にフォールバックしないでください。PowerPoint にネイティブな形式がないチャートタイプ(Sankey、ネットワーク、コード)のみ、画像として挿入してください。 - デフォルトのチャートは簡素にレンダリングされます — タイトル、データラベルなし、時代遅れのパレット。パレットから
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 であるため、1 つのディレクトリで 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 します。最初に rm しないと、削除された部分が残ります
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 = "..."による書式の保持(段落を単一のスタイルなしの run に折りたたみます — 代わりに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>— アイテムを単一の段落に連結しないでください。兄弟の<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 つの特徴的な要素を選び、それを繰り返します — 丸い画像フレーム、色付きの円の中のアイコン。すべてのスライドにわたってそれを引き継いでください。モチーフとしてカラーバーやアクセントストライプを使用しないでください(回避リストを参照)。
カラーパレット
トピックに合わせた色を選択してください — デフォルトの無難な青にはしないでください。これらのパレットを参考にしてください。
| テーマ | プライマリ | セカンダリ | アクセント |
|---|---|---|---|
| ミッドナイトエグゼクティブ | 1E2761 (ネイビー) | CADCFC (アイスブルー) | FFFFFF (ホワイト) |
| フォレスト&モス | 2C5F2D (フォレスト) | 97BC62 (モス) | F5F5F5 (クリーム) |
| コーラルエナジー | F96167 (コーラル) | F9E795 (ゴールド) | 2F3C7E (ネイビー) |
| ウォームテラコッタ | B85042 (テラコッタ) | E7E8D1 (サンド) | A7BEAE (セージ) |
| オーシャングラデーション | 065A82 (ディープブルー) | 1C7293 (ティール) | 21295C (ミッドナイト) |
| チャコールミニマル | 36454F (チャコール) | F2F2F2 (オフホワイト) | 212121 (ブラック) |
| ティールトラスト | 028090 (ティール) | 00A896 (シーフォーム) | 02C39A (ミント) |
| ベリー&クリーム | 6D2E46 (ベリー) | A26769 (ダスティローズ) | ECE2D0 (クリーム) |
| セージカーム | 84B59F (セージ) | 69A297 (ユーカリ) | 50808E (スレート) |
| チェリーボールド | 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 控えめな色 |
…
[翻訳のため省略]