PowerPointノート処理ツール add_notes_pptx.py

プログラムの動作

add_notes_pptx.py は、PowerPointプレゼンテーションファイル(.pptx)のノートセクションを処理するためのPythonスクリプトです。主に以下の2つのモードで動作します。

  1. add モード(字幕追加): スライドのノートに記述されたテキストを読み込み、各スライドの画面下部に透過性を持つ字幕テキストボックスとして追加します。これにより、PowerPointのノートをスライド上で直接表示できるようになります。

  2. replace モード(プレースホルダー置換): スライド内の {{key}} 形式のプレースホルダーを、外部ファイルで定義された値、または各スライドのノートテキストで定義された値に置換します。これは、テンプレートPowerPointファイルの内容を動的に変更する際に有用です。

本プログラムは、PowerPointコンテンツの手動編集の手間を削減し、自動化されたドキュメント生成やプレゼンテーション準備を支援することを目的としています。

原理

本プログラムは、Microsoft OfficeのCOM(Component Object Model)インターフェースを通じてPowerPointアプリケーションを直接操作します。具体的には、Pythonの pywin32 ライブラリに含まれる win32com.client モジュールを利用して、PowerPointのオブジェクトモデルにアクセスします。

add モードのアルゴリズム

  1. win32com.client.Dispatch("PowerPoint.Application") を使用してPowerPointアプリケーションのインスタンスを生成し、指定された入力ファイルを開きます。

  2. プレゼンテーションの PageSetup からスライドの幅と高さを取得します。

  3. 各スライドを順に走査し、get_notes_text() 関数を使用してスライドのノート本文を取得します。

  4. 取得したノートテキストから空行を除去し、整形します。

  5. slide.Shapes.AddTextbox() メソッドを呼び出し、コマンドライン引数で指定された位置(通常はスライド下部)、サイズ、フォント、文字色、背景色、背景の透明度で新しいテキストボックスをスライドに作成します。

  6. 作成したテキストボックスの TextFrame.TextRange プロパティに整形したノートテキストを設定し、フォントや配置(左揃え)を適用します。

  7. テキストボックスの Fill プロパティを操作して、背景色と透明度を設定し、塗りつぶしを有効にします。

  8. 全ての処理が完了した後、プレゼンテーションを新しいファイル名で保存し、PowerPointアプリケーションを終了します。

replace モードのアルゴリズム

  1. parse_toml_style() 関数を使用して、--replace オプションで指定されたTOML風の key=value 形式の置換ファイルを読み込み、キーと値の辞書(base_map)を生成します。この関数は、行頭/行末の空白、# コメント、値のクォートの有無を許容する柔軟なパーサーです。

  2. PowerPointアプリケーションを開き、指定された入力ファイルを開きます。

  3. 各スライドを順に走査します。

    • スライドごとに、base_map をコピーして新しい辞書 current_map を作成します。

    • get_notes_text() 関数でスライドのノート本文を取得し、clean_text() で整形した後、current_map{{supertitle}} キーの値として追加します。これにより、スライドノートの内容もプレースホルダー置換の対象となります。

    • replace_placeholders_on_slide() 関数が呼ばれ、スライド内のすべてのシェイプ(図形)を再帰的に走査します。

  4. _replace_in_shapes()_replace_in_shape_deep()_replace_in_textframe() の各関数は、以下の優先順位でテキストを含むオブジェクトを処理します。

    • グループ化されたシェイプ: グループ内の各項目に対して再帰的に置換処理を行います。

    • 表(テーブル): 表の各セルに対して置換処理を行います。

    • 通常のテキストボックス: シェイプの TextFrame 内のテキストを直接処理します。

  5. テキストフレーム内の置換では、TextRange.Find() メソッドを使用して {{key}} 形式のプレースホルダーを検索します。一致が見つかった場合、その TextRangeText プロパティに直接置換後の値を代入します。この方法により、プレースホルダー部分のみが書き換えられ、元々のテキストが持っていた書式設定やアニメーションは保持されます。

  6. 全ての置換処理が完了した後、プレゼンテーションを新しいファイル名で保存し、PowerPointアプリケーションを終了します。

必要な非標準ライブラリとインストール方法

本プログラムは以下の非標準ライブラリに依存します。

  • pywin32: Microsoft Windows上のCOMオブジェクトをPythonから操作するためのライブラリです。PowerPointアプリケーションとの連携に不可欠です。

インストールは pip コマンドを使用して行います。

pip install pywin32

必要な入力ファイル

1. 入力PowerPointファイル(必須)

  • 形式: .pptx 形式のPowerPointプレゼンテーションファイル。

  • 内容:

    • add モードの場合: 各スライドのノートセクションに、字幕として追加したいテキストが記述されていることを想定しています。

    • replace モードの場合: スライド内の任意のテキストボックス、グループ内のテキスト、または表のセル内に {{key}} 形式のプレースホルダーが含まれていることを想定しています。また、{{supertitle}} プレースホルダーを使用する場合は、対応するスライドのノートセクションに置換テキストが記述されている必要があります。

2. 置換ファイル(--replace オプション、replace モードのみ)

  • 形式: テキストファイル(例: .txt, .toml, .conf など、拡張子は任意)。

  • 内容: TOML風の key=value 形式で、プレースホルダーのキーと置換する値を記述します。

    • 行頭・行末の空白は無視されます。

    • # で始まる行はコメントとして無視されます。

    • 値はクォート(シングルクォート ' またはダブルクォート ")で囲まれていても構いません(その場合、クォートは取り除かれます)。

    • [ で始まる行はセクションヘッダとして扱われず、無視されます。

例: replace_data.txt

# これはコメントです
title = "2023年度 年次報告"
author = '田中 太郎'
version = "1.0.0"
date = 2023-11-01

生成される出力ファイル

出力PowerPointファイル

  • 形式: .pptx 形式のPowerPointプレゼンテーションファイル。

  • ファイル名:

    • --outfile または -o オプションで明示的に指定しない場合、入力ファイル名に基づいて自動生成されます。

      • add モードのデフォルト: <入力ファイル名>-note-added.pptx

      • replace モードのデフォルト: <入力ファイル名>-replaced.pptx

      • 例: input.pptx の場合、input-note-added.pptx または input-replaced.pptx

  • 内容:

    • add モードの場合: 各スライドのノート内容が、指定された書式(位置、サイズ、フォント、色、透明度)で画面下部に字幕テキストボックスとして追加されたプレゼンテーションファイル。

    • replace モードの場合: スライド内の {{key}} プレースホルダーが、置換ファイルやスライドノートの内容で置き換えられたプレゼンテーションファイル。元の書式やアニメーションは可能な限り保持されます。

コマンドラインでの使用例 (Usage)

python add_notes_pptx.py [-h] [-o OUTFILE] [--mode {add,replace}] [-R REPLACE]
                         [--box_margin BOX_MARGIN] [--box_height BOX_HEIGHT]
                         [--font_name FONT_NAME] [--font_size FONT_SIZE]
                         [--font_color FONT_COLOR] [--bgcolor BGCOLOR]
                         [--bgalpha BGALPHA]
                         infile

引数説明

  • infile: 入力PowerPointファイル(.pptx)。

  • -o OUTFILE, --outfile OUTFILE: 出力ファイル名(省略時はモードによって自動生成)。

  • --mode {add,replace}: 実行モードを選択します。

    • add: ノートを字幕テキストボックスとして追加します(デフォルト)。

    • replace: 置換ファイルとノート({{supertitle}})で {{key}} を置換します。

  • -R REPLACE, --replace REPLACE: (mode=replace のみ) 置換用のTOML風 key=value ファイルのパスを指定します(例: data.txt)。

  • --box_margin BOX_MARGIN: (mode=add のみ) 字幕ボックスの左右余白(pt)。デフォルトは 50

  • --box_height BOX_HEIGHT: (mode=add のみ) 字幕ボックスの高さ(pt)。デフォルトは 60

  • --font_name FONT_NAME: (mode=add のみ) フォント名。デフォルトは メイリオ

  • --font_size FONT_SIZE: (mode=add のみ) フォントサイズ(pt)。デフォルトは 12

  • --font_color FONT_COLOR: (mode=add のみ) 文字色(16進RGB、例: 884444)。

  • --bgcolor BGCOLOR: (mode=add のみ) 背景色(16進RGB、例: 00dddd)。

  • --bgalpha BGALPHA: (mode=add のみ) 背景の透明度(0.01.0)。0.0が完全に不透明、1.0が完全に透明。デフォルトは 0.6

コマンドラインでの具体的な使用例

ここでは、sample.pptx という入力ファイルを使用し、いくつかの具体的な実行例を示します。

1. add モードの基本例

sample.pptx の各スライドのノート内容を、デフォルト設定(左右余白50pt、高さ60pt、フォント「メイリオ」12pt、文字色884444、背景色00dddd、透明度0.6)で字幕として追加します。

python add_notes_pptx.py sample.pptx --mode add

実行結果: sample-note-added.pptx というファイルが生成されます。このファイルには、sample.pptx の各スライドの下部に、ノート内容が記載された半透明のテキストボックスが追加されています。

2. add モードでの書式指定例

sample.pptx のノートを、フォントサイズを14pt、文字色を黒(000000)、背景色を白(FFFFFF)、透明度を0.8に設定して追加し、出力ファイル名を sample_subtitles.pptx と指定します。

python add_notes_pptx.py sample.pptx --mode add --font_size 14 --font_color 000000 --bgcolor FFFFFF --bgalpha 0.8 -o sample_subtitles.pptx

実行結果: sample_subtitles.pptx というファイルが生成されます。このファイルでは、字幕の見た目が指定した書式に変更されています。

3. replace モードの基本例

template.pptx というファイルがあり、その中に {{title}}{{project_name}} といったプレースホルダーが含まれているとします。また、以下の内容の data.txt ファイルが存在します。

data.txt:

title = "月次報告会"
project_name = "新サービス開発"

この data.txt の内容で template.pptx 内のプレースホルダーを置換します。

python add_notes_pptx.py template.pptx --mode replace --replace data.txt

実行結果: template-replaced.pptx というファイルが生成されます。template.pptx 内の {{title}} は「月次報告会」に、{{project_name}} は「新サービス開発」に置換されます。

4. replace モードでの {{supertitle}} の利用例

上記 replace モードの例に加え、template.pptx の1ページ目のノートに「会議資料(機密)」と記載されているとします。スライド内に {{supertitle}} というプレースホルダーがあれば、そのノート内容で置換されます。

python add_notes_pptx.py template.pptx --mode replace --replace data.txt

実行結果: template-replaced.pptx が生成され、{{title}}{{project_name}} が置換されるだけでなく、1ページ目スライド内の {{supertitle}} も「会議資料(機密)」に置換されます。