MasayukiKiyota/dify-plugin-doc2ppt

★ 0Forks 0PythonGitHub ↗Compare

README

Word to PowerPoint

Author: masayukikiyota Version: 0.0.1 Type: Tool

Word 文書(.docx)を、既存の PowerPoint テンプレート(.pptx / .potx)のレイアウト・ テーマ配色・フォントに従って .pptx に変換する Dify プラグインです。見出しでスライドを 区切り、段落・箇条書き・表を Word の並び順のまま崩さずにスライド化します。

議事録・報告書・設計書といった既存の Word 資産を、自社テンプレートに沿った説明資料として ワークフローの出力からそのままダウンロードできます。

ツール

1. Word を PowerPoint に変換 (docx_to_pptx)

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 などが入ります。

2. PowerPoint テンプレート解析 (inspect_template)

テンプレートのスライドサイズ・スライドマスタ・全レイアウトとそのプレースホルダを 一覧表示します。自動判定の結果を確認・調整したいときに使います。

パラメータ 型 必須 説明
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 の対応表

Word スライドでの扱い
「表題」スタイル 表紙のタイトル(cover_title 未指定のとき)
見出し(見出し 1 / Heading 1 …) 新規スライド(見出しがスライドのタイトルになる)
段落 本文テキスト
箇条書き・段落番号 行頭記号つきの本文テキスト(階層は字下げで表現)
表 スライド上の表(1 行目を見出し行として太字)
最初の見出しより前の本文 「はじめに」スライド
画像・図形 取り込みません

生成されるスライドの並びは次のとおりです。

  1. 表紙 — タイトル+日付(+footer_text)
  2. アジェンダ — 見出しの一覧(options.agenda: false で無効化)
  3. 本文 — 見出しごとに 1 枚以上

見出しスタイルは、スタイル名(Heading 1 / 見出し 1 / Überschrift 1 など)、 スタイル ID、アウトラインレベルの順に判定します。Word の言語設定が英語でも日本語でも そのまま動きます。

自動的なスライド分割

1 枚に収まらない内容は自動的に次のスライドへ送られ、タイトルに「(続き)」が付きます。

  • 本文 — sizes.body_steps(既定 18 → 16 → 14pt)の順に縮めて収まるか試し、 それでも入らない分だけを次のスライドへ送ります
  • 表 — 入る行数で切り、続きのスライドでは見出し行を繰り返します

自社テンプレートを使う手順

通常は設定不要です。 テンプレートをアップロードするだけで、使うべきレイアウトが 自動判定されます。判定は次の 2 段階です。

  1. レイアウト名のキーワード — 「表紙 / 章扉 / 本文 / タイトルのみ / 白紙」や 「Title Slide / Section Header / Title and Content / Title Only / Blank」など

  2. プレースホルダの構成 — 名前が手がかりにならない場合の判定基準

    用途 判定基準
    表紙 サブタイトルのプレースホルダを持つ(無ければ中央タイトル)
    本文 タイトル+本文プレースホルダがちょうど 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 を参照してください。

Contributors

MasayukiKiyota

Issues