PPTX の作成、編集、解析
.pptx ファイルは XML ファイルの ZIP アーカイブです。タスクに応じてアプローチを選択してください:
| タスク | アプローチ |
|---|---|
| 新規デッキの作成 | pptxgenjs スクリプトを作成 — 以下の注意点を参照 |
| 既存デッキの編集、またはテンプレートからの構築 | ZIP を展開 → 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を設定してください。箇条書きパラグラフの間隔はlineSpacing(大きな隙間ができる)ではなくparaSpaceAfterで調整してください。 - 出力ファイルごとに 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.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 経由でレンダリングされ、これは持っていないフォントを代替します。一部のフォントでは代替フォントの幅が異なるため、実際のデッキではテキストオーバーフロー(または収まり)が 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 をデフォルトにしないでください — 2023 年以降の Office のデフォルトフォントは、ここにメトリクス互換の代替がなく、古い Office インストールにはないため、両端で信頼できません。
| 要素 | サイズ |
|---|---|
| スライドタイトル | 36-44pt ボールド |
| セクションヘッダー | 20-24pt ボールド |
| 本文テキスト | 14-16pt |
| キャプション | 10-12pt ミュート |
…
[翻訳のため省略]