PowerPointノート処理ツール add_notes_pptx.py
プログラムの動作
add_notes_pptx.py は、PowerPointプレゼンテーションファイル(.pptx)のノートセクションを処理するためのPythonスクリプトです。主に以下の2つのモードで動作します。
addモード(字幕追加): スライドのノートに記述されたテキストを読み込み、各スライドの画面下部に透過性を持つ字幕テキストボックスとして追加します。これにより、PowerPointのノートをスライド上で直接表示できるようになります。replaceモード(プレースホルダー置換): スライド内の{{key}}形式のプレースホルダーを、外部ファイルで定義された値、または各スライドのノートテキストで定義された値に置換します。これは、テンプレートPowerPointファイルの内容を動的に変更する際に有用です。
本プログラムは、PowerPointコンテンツの手動編集の手間を削減し、自動化されたドキュメント生成やプレゼンテーション準備を支援することを目的としています。
原理
本プログラムは、Microsoft OfficeのCOM(Component Object Model)インターフェースを通じてPowerPointアプリケーションを直接操作します。具体的には、Pythonの pywin32 ライブラリに含まれる win32com.client モジュールを利用して、PowerPointのオブジェクトモデルにアクセスします。
add モードのアルゴリズム
win32com.client.Dispatch("PowerPoint.Application")を使用してPowerPointアプリケーションのインスタンスを生成し、指定された入力ファイルを開きます。プレゼンテーションの
PageSetupからスライドの幅と高さを取得します。各スライドを順に走査し、
get_notes_text()関数を使用してスライドのノート本文を取得します。取得したノートテキストから空行を除去し、整形します。
slide.Shapes.AddTextbox()メソッドを呼び出し、コマンドライン引数で指定された位置(通常はスライド下部)、サイズ、フォント、文字色、背景色、背景の透明度で新しいテキストボックスをスライドに作成します。作成したテキストボックスの
TextFrame.TextRangeプロパティに整形したノートテキストを設定し、フォントや配置(左揃え)を適用します。テキストボックスの
Fillプロパティを操作して、背景色と透明度を設定し、塗りつぶしを有効にします。全ての処理が完了した後、プレゼンテーションを新しいファイル名で保存し、PowerPointアプリケーションを終了します。
replace モードのアルゴリズム
parse_toml_style()関数を使用して、--replaceオプションで指定されたTOML風のkey=value形式の置換ファイルを読み込み、キーと値の辞書(base_map)を生成します。この関数は、行頭/行末の空白、#コメント、値のクォートの有無を許容する柔軟なパーサーです。PowerPointアプリケーションを開き、指定された入力ファイルを開きます。
各スライドを順に走査します。
スライドごとに、
base_mapをコピーして新しい辞書current_mapを作成します。get_notes_text()関数でスライドのノート本文を取得し、clean_text()で整形した後、current_mapに{{supertitle}}キーの値として追加します。これにより、スライドノートの内容もプレースホルダー置換の対象となります。replace_placeholders_on_slide()関数が呼ばれ、スライド内のすべてのシェイプ(図形)を再帰的に走査します。
_replace_in_shapes()、_replace_in_shape_deep()、_replace_in_textframe()の各関数は、以下の優先順位でテキストを含むオブジェクトを処理します。グループ化されたシェイプ: グループ内の各項目に対して再帰的に置換処理を行います。
表(テーブル): 表の各セルに対して置換処理を行います。
通常のテキストボックス: シェイプの
TextFrame内のテキストを直接処理します。
テキストフレーム内の置換では、
TextRange.Find()メソッドを使用して{{key}}形式のプレースホルダーを検索します。一致が見つかった場合、そのTextRangeのTextプロパティに直接置換後の値を代入します。この方法により、プレースホルダー部分のみが書き換えられ、元々のテキストが持っていた書式設定やアニメーションは保持されます。全ての置換処理が完了した後、プレゼンテーションを新しいファイル名で保存し、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.pptxreplaceモードのデフォルト:<入力ファイル名>-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.0〜1.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}} も「会議資料(機密)」に置換されます。