ショーラボ html2pptx エンジンが「編集可能なPowerPoint」へ変換できるHTMLの書き方です。
このルールに従うほど、グラデーション・影・SVG・日本語が画像化されずネイティブOOXMLとして出力されます。
スライド1枚 = <section class="slide"> 1つ。幅・高さを明示し、要素は絶対配置が基本です。
<section class="slide" style="position:relative; width:1600px; height:900px;
background:#FDFBF7; font-family:'Noto Sans JP',sans-serif; overflow:hidden;">
<h1 data-el="title" style="position:absolute; left:80px; top:70px; ...">タイトル</h1>
...
<div data-notes style="display:none;">このスライドのナレーション原稿</div>
</section>
<section class="slide"> を並べるとマルチスライドのデッキになりますlinear-gradient どちらも可(グラデはネイティブ gradFill 出力)| 属性 | 値 | 意味 |
|---|---|---|
data-el="役割名" | 任意の文字列 | 変換対象要素の宣言(シェイプ名になる)。省略時は自動抽出(視覚コンテナ・テキスト葉を自動検出) |
data-slide-title | 任意の文字列 | section.slide のPowerPointスライド識別名(可視要素は追加しない) |
data-shape | rect / roundRect | 図形種の明示(省略時は border-radius から自動判定) |
data-anchor | t / ctr / b | テキストの垂直アンカー(既定 ctr) |
data-notes | — | スピーカーノート原稿。display:none で不可視にする。TTSナレーション・動画化の原稿を兼ねる |
data-chart | JSON | ネイティブグラフ(c:chart)。{"kind":"bar|pie|line", "title":"...", "categories":[...], "series":[{"name":"...","values":[...]}]} |
data-anim | fadeIn / fadeInUp / appear | クリックで出現するエントランスアニメーション |
data-transition | fade / push / wipe / none | スライドの画面切替(section に付与) |
| HTML/CSS | PowerPoint出力 |
|---|---|
background: linear-gradient(...) | a:gradFill(角度・多段ストップ・透過対応) |
box-shadow | a:outerShdw(ネイティブ影) |
border-radius / border | prstGeom roundRect / a:ln(枠線。dash/dot対応) |
インライン <svg>(path/rect/circle/line/polygon…) | a:custGeom — 図形1つ1つが独立の編集可能ベクター。fill-opacity/stroke-opacity/破線対応 |
<table> | a:tbl(ネイティブ表。結合セル・罫線・塗り対応) |
data-chart | c:chart + 埋め込みxlsx(数値はExcel編集) |
テキスト(太字/斜体/色/サイズのインラインspan、<br>、リスト、::before/::after のcontent文字列) | a:r ラン分割で忠実に再現。全ランに lang="ja-JP" |
flexbox中央寄せ / text-align / letter-spacing / line-height / opacity(祖先含む) | algn / spc / lnSpc / a:alpha へ写像 |
<img>(png/jpeg) | p:pic(原寸埋め込み)。REST API / MCP は base64 の data:image/png / data:image/jpeg のみ。ローカルCLIはファイルパスも利用可 |
transform: rotate(θ) | a:xfrm rot(回転シェイプ) |
<script> / <iframe> / <canvas> / <video> / イベント属性 | REST API / MCP ではキュー投入前に 400 で拒否されます |
外部URL、相対パス、file://、CSS @import | REST API / MCP では拒否。画像は base64 PNG/JPEG、SVGはインラインで記述してください |
| CSSアニメーション / JSによる動的レイアウト | REST API / MCP では拒否。最終状態の静的HTML/CSSへ変換してから送信してください |
radial-gradient | 現状は単色フォールバック(linear-gradient を推奨) |
SVG内の <text> / <image> / <use> / フィルタ類 | そのSVGはPNG+ベクター二層のフォールバックになります |
ppt/fonts/*.fntdata へ実埋め込み)lang="ja-JP" と ea typeface を付与normAutofit で自動縮小各スライドの data-notes を原稿として、TTS音声合成+スライド描画で MP4 を生成できます。
# REST API
POST /v1/export { "html": "...", "format": "mp4", "tts": true, "wait": true }
# CLI(オンプレ)
npm run video -- slides.html slides.mp4 --tts
1スライド=1クレジット。TTSナレーション +1/枚、MP4化 +3/枚。プラン一覧は GET /v1/plans。
data-el を付けて配置を明示すると最も安定します。