Author: masayukikiyota Version: 0.0.1 Type: Tool
Word 文書(.docx)を、既存の PowerPoint テンプレート(.pptx / .potx)のレイアウト・
テーマ配色・フォントに従って .pptx に変換する Dify プラグインです。見出しでスライドを
区切り、段落・箇条書き・表を Word の並び順のまま崩さずにスライド化します。
議事録・報告書・設計書といった既存の Word 資産を、自社テンプレートに沿った説明資料として ワークフローの出力からそのままダウンロードできます。
Word とテンプレートを受け取り、.pptx ファイルを返します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
docx_file |
file | 必須 | 変換する .docx。見出しスタイルの単位でスライドになります |
template_file |
file | 必須 | レイアウトとテーマを流用する .pptx / .potx |
cover_title |
string | – | 表紙のタイトル。未指定なら Word の「表題」スタイル → ファイル名の順に採用 |
footer_text |
string | – | 表紙で日付の下に入れる文字列(部署名など)。改行で複数行 |
config_yaml |
string | – | 自動判定の上書き。通常は不要(後述) |
file_name |
string | – | 出力ファイル名。未指定なら Word のファイル名を引き継ぎます |
テンプレートのレイアウトは自動判定されるため、config_yaml を指定しなくても
日本語・英語・独自命名のどのテンプレートでもそのまま動きます。
出力は「テキストの要約 → JSON のメタデータ → .pptx ファイル」の順に返ります。
JSON には slide_count / section_count / table_count / layouts_used / outline /
warnings などが入ります。
テンプレートのスライドサイズ・スライドマスタ・全レイアウトとそのプレースホルダを 一覧表示します。自動判定の結果を確認・調整したいときに使います。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
template_file |
file | 必須 | 解析する .pptx / .potx |
emit_config |
boolean | – | true で config_yaml の雛形も生成し、config.yaml として返します |
出力例:
[1] '本文'
idx type name left top width height (inch)
0 TITLE Title 1 0.92 0.49 11.50 1.25
1 OBJECT Content Placeholder 2 0.92 1.75 11.50 4.94
| Word | スライドでの扱い |
|---|---|
| 「表題」スタイル | 表紙のタイトル(cover_title 未指定のとき) |
見出し(見出し 1 / Heading 1 …) |
新規スライド(見出しがスライドのタイトルになる) |
| 段落 | 本文テキスト |
| 箇条書き・段落番号 | 行頭記号つきの本文テキスト(階層は字下げで表現) |
| 表 | スライド上の表(1 行目を見出し行として太字) |
| 最初の見出しより前の本文 | 「はじめに」スライド |
| 画像・図形 | 取り込みません |
生成されるスライドの並びは次のとおりです。
- 表紙 — タイトル+日付(+
footer_text) - アジェンダ — 見出しの一覧(
options.agenda: falseで無効化) - 本文 — 見出しごとに 1 枚以上
見出しスタイルは、スタイル名(Heading 1 / 見出し 1 / Überschrift 1 など)、
スタイル ID、アウトラインレベルの順に判定します。Word の言語設定が英語でも日本語でも
そのまま動きます。
1 枚に収まらない内容は自動的に次のスライドへ送られ、タイトルに「(続き)」が付きます。
- 本文 —
sizes.body_steps(既定 18 → 16 → 14pt)の順に縮めて収まるか試し、 それでも入らない分だけを次のスライドへ送ります - 表 — 入る行数で切り、続きのスライドでは見出し行を繰り返します
通常は設定不要です。 テンプレートをアップロードするだけで、使うべきレイアウトが 自動判定されます。判定は次の 2 段階です。
-
レイアウト名のキーワード — 「表紙 / 章扉 / 本文 / タイトルのみ / 白紙」や 「Title Slide / Section Header / Title and Content / Title Only / Blank」など
-
プレースホルダの構成 — 名前が手がかりにならない場合の判定基準
用途 判定基準 表紙 サブタイトルのプレースホルダを持つ(無ければ中央タイトル) 本文 タイトル+本文プレースホルダがちょうど 1 つ(2 カラムや比較は避ける) 章扉 「タイトルのみ」→「本文」の順に代用 白紙 プレースホルダが(日付・フッター・ページ番号を除いて)無い
本文の描画位置は、本文レイアウトの本文プレースホルダの位置・大きさをそのまま使います。 テンプレート側で余白を決めておけば、そのとおりに流し込まれます。 中身が入らなかったプレースホルダは削除するので、「テキストを入力」の枠は残りません。
実際に使われたレイアウト名は、変換結果の JSON の layouts_used で確認できます。
判定が意図と違う場合だけ config_yaml を指定してください。明示した項目が常に優先され、
書かなかった項目は自動判定の値が使われます(部分的な指定で構いません)。
layouts:
content: "タイトルとコンテンツ" # ここだけ上書き。他は自動判定のまま指定できるトップレベルのキーは次のとおりです。
| キー | 主な項目 |
|---|---|
layouts |
title / section / content / blank のレイアウト名 |
placeholders |
title / subtitle / body の idx |
body_area |
本文の描画領域 left / top / width / bottom(inch、null で自動) |
fonts |
body / table / cover のフォント名(null でテンプレートのまま) |
sizes |
body_steps(本文サイズの候補)/ table / footer |
spacing |
line_ratio / para_gap / block_gap / table_row / indent |
table |
split / repeat_header / first_row_bold |
cover |
date / date_format / footer_text / use_subtitle / 位置 |
options |
下表を参照 |
よく使う options:
| 項目 | 既定 | 説明 |
|---|---|---|
agenda |
true |
アジェンダスライドを作る |
agenda_title |
アジェンダ |
アジェンダスライドのタイトル |
agenda_level |
9 |
アジェンダに載せる見出しの深さ |
slide_level |
9 |
この深さまでの見出しが新規スライドになる。1 なら H1 だけがスライドになり、H2 以下は本文中の小見出し(太字)になる |
section_slides |
false |
true で章扉スライドを追加する |
bullets / bullet_char |
true / ・ |
箇条書きの行頭記号 |
auto_split |
true |
入りきらない内容を次のスライドへ送る |
continued_suffix |
(続き) |
続きスライドのタイトルに付ける文字列 |
preamble_title |
はじめに |
最初の見出しより前にある本文のスライド名 |
skip_empty_sections |
false |
true で中身の無い見出しのスライドを作らない |
設定例:
options:
slide_level: 1 # H1 だけをスライドにする
agenda: false
section_slides: true
sizes:
body_steps: [20, 18, 16]
cover:
date_format: "%Y/%m/%d"全角文字に注意
config_yamlに全角コロン「:」や全角スペースが混ざっていると YAML として 正しく読めません。全角コロンは構文エラーにすらならず、設定全体がただの文字列として 扱われます。IME を切り替えて入力した際に混入しやすいので、うまく反映されないときは まずここを疑ってください。エラーメッセージでも具体的に指摘します。
| 症状 | 原因と対処 |
|---|---|
| 「Word ファイルは .docx を指定してください」 | 旧 .doc 形式。Word で .docx に保存し直す |
| 「スライドを 1 枚も作れませんでした」 | 中身が空。見出しスタイルで章立てされているか確認する |
| スライドが 1 枚にまとまってしまう | 見出しが「見出し 1」ではなく太字の本文になっている可能性がある |
| 表が途中で切れる | 自動分割は有効。spacing.table_row を小さくすると 1 枚あたりの行数が増える |
| アップロードしたファイルを取得できない | リモートデバッグ時は Dify の FILES_URL がプラグインから到達可能か確認する |
uv venv && uv pip install -r requirements.txt
# 変換パイプラインのスモークテスト(dify_plugin なしで動く)
.venv/Scripts/python.exe tests/test_convert.py
# Tool 実装の結合テスト(dify_plugin が必要)
.venv/Scripts/python.exe tests/test_tools.py
# fixtures を作り直す
.venv/Scripts/python.exe tests/make_fixtures.py変換ロジック(docx2pptx_core.py)は CLI としても動きます。
python docx2pptx_core.py input.docx -t template.pptx -o output.pptx --title "表題"ローカルデバッグは .env.example を .env にコピーし、Dify の
「プラグイン > デバッグ」で得たキーを設定してから python -m main を実行します。
manifest.yaml プラグインの定義
main.py エントリポイント
provider/doc2ppt.* ツールプロバイダ(認証なし)
tools/docx_to_pptx.* Word → PowerPoint 変換ツール
tools/inspect_template.* テンプレート解析ツール
docx2pptx_core.py 変換エンジン(Dify 非依存・CLI 兼用)
doc2ppt_utils.py Dify 向けの薄いラッパ(バイト列 in / out)
sample/ 取り込み元の元スクリプト(プラグインには同梱しない)
tests/ テストと fixtures(プラグインには同梱しない)
外部サービスへの通信は一切行いません。詳細は PRIVACY.md を参照してください。