図形入りPowerPointをMarkdownに変換する方法|GitHub Copilot × OpenXML SDKの仕組みを徹底解説

元記事を読む
キュレーターコメント

「LLMに指定言語を使わせるのが難しい」という実践的な知見が刺さる記事。PowerPoint変換の技術的な仕組みだけでなく、プロンプトエンジニアリングの現場感を伝えており、GitHub Copilot Agentを業務利用しているエンジニアに特にオススメしたい。

概要

「PowerPointの複雑な図形をそのままMarkdownに変換したい」——そんな需要は意外と多い。ドキュメント整備やGitHub管理、AI読み込み用テキスト化など、用途はさまざまだ。今回は日本マイクロソフトのKazuki Otaさんが公開したリポジトリ github-copilot-excel-lab を実際に動かした際の知見をまとめた記事を紹介する。

環境構築:WSLにdotnetが無い場合の対処法

ローカルWSLに .NET実行環境 がない場合、Dev Containerで即座に解決できる。手順はシンプルだ。

  1. Docker + VS Code拡張機能をインストール
  2. リポジトリをクローン後、Ctrl+Shift+PDev Containers: Add Dev Container Configuration Files
  3. C#(.NET) テンプレートを選択してコンテナで再起動

環境構築を省きたいなら GitHub Codespaces が最速。dotnet・Pythonなど開発ツールが最初から揃っており、ブラウザだけで作業完結する。

ハマりポイント①:dotnet runの自動承認

GitHub Copilot経由でターミナルコマンドを実行するたびに承認を求められると作業が止まる。.vscode/settings.json に以下を追記することで、dotnet run - で始まるコマンドを自動承認できる。

{
  "chat.tools.terminal.autoApprove": {
    "/^dotnet run -/": {
      "approve": true,
      "matchCommandLine": true
    }
  }
}

ハマりポイント②:LLMがPythonに逃げる問題

これが一番面白い知見だ。スキルファイルで「dotnetを使え」と指示しているのに、LLMはなぜかPythonで実装しようとする。この挙動はCopilotに限らず多くのLLMで観測される傾向で、「Pythonの学習データが圧倒的に多いからでは」という推測が面白い。

解決策は スラッシュコマンドでスキルを明示的に指定 すること。

/scripting-guide `/workspaces/github-copilot-excel-lab/pptx/抜粋.pptx` に対して
OpenXML SDK 等を使って解析を行い、mermaid 形式の図を含んだ markdown に変換してください。
最終成果物は `/workspaces/github-copilot-excel-lab/pptx/report.md` に出力してください。

もう一つのポイントは 絶対パスで記述すること。相対パスより絶対パスの方がスクリプト実行の成功率が高いという実測結果は、プロンプトエンジニアリングの実践知として覚えておきたい。なお、記事中では「Claude Sonnet 4.6くらいの賢いモデルであればMarkdownへの変換はほぼ成功する」との記述もあり、モデル選定が変換品質に直結することも示唆されている。

変換の仕組み:OpenXML SDKで何をしているか

GitHub Copilotが生成するC#コードは、大きく2段階で処理される。

第1段階:構造把握

  • .pptxをOpenXML SDKで開き、各スライドのXMLを読み込む
  • テキスト(<a:t>要素)を抽出
  • 図形(sp)・コネクタ(cxnSp)・画像(pic)・グラフィックフレームの数を集計

第2段階:座標・接続関係の解析

  • 各図形の位置(<a:off>)とサイズ(<a:ext>)を取得
  • コネクタの接続先IDから「どの図形とどの図形がつながっているか」を解析
  • この位置関係・接続情報をもとにLLMが意味を推測し、Mermaid記法に変換

コードの先頭にある #:package DocumentFormat.OpenXml はC#スクリプト実行環境でNuGetパッケージをその場で宣言する記法。通常の .csproj 管理とは異なるアプローチで、Copilotがインタラクティブに試行錯誤できる構造になっている。

生成されたMarkdownの確認環境

生成物をそのまま読むのは辛いので、devcontainer.jsonに以下のVS Code拡張機能を追加しておくと快適だ。

"extensions": [
  "TakumiI.markdowntable",      // テーブルの整形
  "bierner.markdown-mermaid",   // Mermaidのプレビューレンダリング
  "yzane.markdown-pdf"           // PDFへのエクスポート
]

まとめ:「AIにdotnetを使わせる」プロンプト設計の難しさ

この記事の本質は、PowerPoint変換の技術解説であると同時に、LLMへの指示設計の実践報告でもある。「スキルで言語指定しても無視される」「絶対パスの方が成功率が高い」——こういった泥臭い知見は、公式ドキュメントには載っていないリアルな情報だ。Dev Container構築からプロンプト改善まで一気通貫で試せる環境が公開されているので、Copilot AgentやMCP連携を試している方は元リポジトリと合わせてぜひ手を動かしてみてほしい。