KatsuYuzuのブログ

.NET の開発をメインとした日記です。

Marp Markdown スライド を LibreOffice 不要で編集可能な PPTX に書き出す VSCode 拡張を作りました #Marp #Markdown #PowerPoint #パワポ #VSCode #GitHubCopilot

MarpのMarkdownスライドを、LibreOffice不要で編集可能なPowerPoint(PPTX)に書き出すVSCode拡張を作りました。テキスト・画像・図形がPowerPointのネイティブなオブジェクトになります。

  • F1 → Marp: Export to Editable PPTX で動きます。ChromeかEdgeがあればOKです

https://marketplace.visualstudio.com/items?itemName=KatsuYuzu.marp-to-editable-pptx

動機

自分もMarpでほぼすべてのスライドを書いています。プレゼン本番はMarpから出したPDFや画像形式のPPTXを使っていて、それで十分です。

困るのはプレゼン後に「編集できるパワポをもらえますか」と言われるシーン。

Marpの公式PPTXエクスポートには2種類ありますが、この「後から編集したい」という用途にはどちらも合いませんでした。

エクスポート方式 課題
スクリーンショット方式 テキストが画像になるので編集できない
LibreOffice方式 企業PCにLibreOfficeを入れられないケースが多い

この状況にはまって、「ないなら作るか」となりました。

仕組み:ブラウザのDOMをそのまま読む

Marpの公式issueには「native editable PPTXはwontfix」とあって、視覚的な再現精度の問題から諦められていました。

MarpスライドはHTMLとしてブラウザで描画されます。そこにPuppeteer(Chromium)でアクセスして、各要素のレンダリング済みの値を getComputedStyle()getBoundingClientRect() で読み出します。

// dom-walker.ts(ブラウザ内で実行される)
const rect = element.getBoundingClientRect();
const style = window.getComputedStyle(element);
// x, y, width, height, color, fontSize, fontWeight... を全部取り出す

ブラウザがすでに全部計算してくれているので、CSSを自前でパースしなくていいです。Marpのテーマが何であれ、flex/grid/カスタムCSSも透過的に動きます。取り出したデータを PptxGenJS に渡してPPTXを組み立てます。

GitHub Copilotのバイブコーディングで全部作った

このプロジェクト、手書きのコードは1行もありません。全部GitHub Copilotで作りました。 .github/instructions/.github/skills/ に、スライドの生成方法やテスト時のHTMLとの比較手順など書いています。参考にどうぞ。

HTMLを正本とした再現なので出来なくはないと思いましたが、当然、人間の手では不可能な作業量でした。

限界もある

フォントのズレ問題があります。ブラウザとPowerPointはテキストレンダリングエンジンが別物で、同じフォントでも文字幅の計算が微妙に違います。行の折り返し位置がずれてレイアウト全体がカスケード的にずれることがあります。

プレゼン用には向いてないですが、別のスライドに一部を取り込んだり、共有して一部使ってもらったりする用途では、十分なレベルかなと思います。


バグや要望は https://github.com/KatsuYuzu/marp-to-editable-pptx のissueへお願いします。