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 を指定すると、テンプレートのスキーマエラーをベースラインとして除外します |
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 に変換)。
add*呼び出し間で1つのshadow/options オブジェクトを共有しないでください。毎回新しいオブジェクトを作成してください。 - 影の
offsetは 0 以上 — 負のオフセットはファイルを破損します。影を上方向に投影するには、angle: 270と正のオフセットを使用します。 letterSpacingは無視されます — 実際のオプションはcharSpacingです。- リスト: 各項目に
bullet: trueを設定し、リテラルの•は使わないでください(二重の箇条書きになります)。最後の項目を除くすべての配列要素にbreakLine: trueを設定します。箇条書きの段落間のスペースはlineSpacingではなくparaSpaceAfterで設定します(lineSpacingは大きな隙間になります)。 - 出力ファイルごとに
new pptxgen()を1つ — インスタンスを再利用しないでください。 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 は、各スライドのラベル付きグリッドを書き込み、作成したファイルを表示します。12スライドを超えると、template-thumbs.jpg は 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; まず 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で解析してください。xml.etree.ElementTreeによる OOXML のラウンドトリップは名前空間プレフィックスを書き換え、デッキを破損します。 - テンプレートのスロット ≠ ソース項目。 テンプレートに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つの特徴的な要素を選び、それを繰り返します。丸みを帯びた画像フレーム、色付きの円の中のアイコンなど。すべてのスライドにわたってそれを貫きます。モチーフとしてカラーバーやアクセントストライプを使用しないでください(回避リストを参照)。
カラーパレット
トピックに合った色を選んでください。デフォルトの青にはしないでください。インスピレーションとして以下のパレットを使用します:
| テーマ | プライマリ | セカンダリ | アクセント |
|---|---|---|---|
| ミッドナイト エグゼクティブ | 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 控えめ |
…
[翻訳用に切り詰められました]