pptx2md_with_image プログラム仕様

pptx2md_with_image.py

概要: PowerPointプレゼンテーションからテキスト、数式、画像を抽出し、AIモデル(OpenAI, Gemini)を用いて解説レポートを生成するスクリプト。

詳細説明: このスクリプトは、指定されたPowerPoint (.pptx) ファイルを処理し、各スライドから以下の情報を抽出します。 - スライドのタイトルと通常のテキストコンテンツ。 - Office Math Markup Language (OMML) 形式で記述された数式をLaTeX形式に変換。 - スライドに埋め込まれた画像を抽出し、指定された作業ディレクトリに保存。

抽出されたテキスト、変換されたLaTeX数式、および各スライドの画像は、 指定されたAIモデル (OpenAI GPT-4o/GPT-5.2またはGoogle Gemini) への入力として使用されます。 AIはこれらの情報に基づいてスライドの詳細な解説を生成し、その結果はMarkdown形式のレポートとして出力されます。

PDF変換には pywin32、画像抽出には PyMuPDF、PPTX解析には python-pptxlxml が必要です。

関連リンク: pptx2md_with_image.py 技術ドキュメント

ai.pptx2md_with_image.call_gemini(model_name, slide_no, slide_text, image_path, lang)[ソース]

Google Gemini APIを呼び出して、スライドの解説を生成します。

詳細説明: グローバルで定義された prompt_template を使用し、スライド番号、抽出テキスト、 出力言語を組み込んだプロンプトを作成します。 スライド画像はバイナリデータとして読み込み、プロンプトと共にGeminiモデルに送信します。 APIからの応答(解説テキスト)を返します。

パラメータ:
  • model_name -- str 使用するGeminiモデルの名前(例: "gemini-pro-vision")。

  • slide_no -- int 処理中のスライド番号。

  • slide_text -- str スライドから抽出されたテキスト情報。

  • image_path -- Path スライド画像のファイルパス。

  • lang -- str 出力言語。

戻り値:

str Geminiモデルが生成した解説テキスト、またはエラーメッセージ。

ai.pptx2md_with_image.call_openai(client, model, slide_no, slide_text, image_path, lang)[ソース]

OpenAI APIを呼び出して、スライドの解説を生成します。

詳細説明: グローバルで定義された prompt_template を使用し、スライド番号、抽出テキスト、 出力言語を組み込んだプロンプトを作成します。 スライド画像はBase64エンコードされたデータURL形式に変換され、 プロンプトと共にOpenAIモデルに送信されます。 APIからの応答(解説テキスト)を返します。

パラメータ:
  • client -- openai.OpenAI OpenAI APIクライアントインスタンス。

  • model -- str 使用するOpenAIモデルの名前(例: "gpt-4o")。

  • slide_no -- int 処理中のスライド番号。

  • slide_text -- str スライドから抽出されたテキスト情報。

  • image_path -- Path スライド画像のファイルパス。

  • lang -- str 出力言語。

戻り値:

str OpenAIモデルが生成した解説テキスト。

ai.pptx2md_with_image.convert_pdf_to_images(pdf_path: Path, out_dir: Path) List[Path][ソース]

PDFファイルを各ページごとにPNG画像に変換します。

詳細説明: PyMuPDF (fitz) ライブラリを使用して、指定されたPDFファイル (pdf_path) の 各ページをPNG画像として変換します。画像は out_dir ディレクトリに保存されます。 変換時には、高解像度 (2.0倍) でレンダリングされます。 出力ディレクトリが存在しない場合は作成されます。

パラメータ:
  • pdf_path -- Path 入力PDFファイルへのパス。

  • out_dir -- Path 出力画像を保存するディレクトリへのパス。

戻り値:

List[Path] 生成されたPNG画像のファイルパスのリスト。

ai.pptx2md_with_image.extract_content_to_markdown(pptx_path, output_md=None, image_dir=None, include_xml=False)[ソース]

PPTXファイルからコンテンツを抽出し、Markdown形式の文字列として返します。

詳細説明: 指定されたPPTXファイルを解析し、各スライドから以下の情報を抽出してMarkdown形式に変換します。 - スライド番号とタイトル。 - 各スライド内のテキストコンテンツ。 - OMML形式の数式をLaTeXに変換し、$$ ... $$ ブロックで囲みます。

oMathPara 要素を優先し、その中の`oMath`を個別のブロックとして処理します。 また、複数行の数式は \ で分割して個別の $$ ... $$ ブロックにします。

  • スライドに埋め込まれた画像を抽出し、image_dir に保存します。 Markdown内には、保存された画像への相対パスを含むリンク ![alt_text](path/to/image.png) を挿入します。

抽出された内容はスライドごとにMarkdown文字列として辞書に格納され、最終的にその辞書が返されます。 output_md が指定された場合、全コンテンツをそのファイルに書き込みます。

パラメータ:
  • pptx_path -- Path 入力PPTXファイルへのパス。

  • output_md -- Optional[str] (現状未使用) 抽出結果を保存するMarkdownファイル名。

  • image_dir -- Optional[Path] 抽出された画像を保存するディレクトリへのパス。None の場合、画像は抽出されません。

  • include_xml -- bool 元のOMML XMLをMarkdownに含めるかどうか。True の場合、各数式の後にXMLスニペットが追加されます。

戻り値:

Optional[Dict[int, str]] スライド番号をキー、Markdown形式のコンテンツを値とする辞書。output_md が指定された場合は None

ai.pptx2md_with_image.find_ini_path(ini_name: str) Path | None[ソース]

INIファイルのパスをカレントディレクトリ、次にスクリプトディレクトリの順に探索します。

パラメータ:

ini_name -- str 探索するINIファイル名。

戻り値:

Optional[Path] 見つかったINIファイルの Path オブジェクト、または None

ai.pptx2md_with_image.get_slide_title(slide)[ソース]

PowerPointスライドからタイトルテキストを抽出します。

詳細説明: まず、スライド内のプレースホルダーのうち、タイプ1 (タイトル) のテキストフレームを検索します。 タイトルが見つかった場合、そのテキストを返します。 プレースホルダータイトルが見つからない場合、最初に見つかったテキストフレームの最初の行をタイトルとして使用します。 いずれも見つからない場合は、「無題のスライド」を返します。

パラメータ:

slide -- pptx.slide.Slide タイトルを抽出する対象のスライドオブジェクト。

戻り値:

str スライドのタイトル文字列、または「無題のスライド」。

ai.pptx2md_with_image.load_slide_texts(txt_path: Path) Dict[int, str][ソース]

既存のMarkdownファイルからスライドごとのテキストコンテンツを読み込みます。

詳細説明: 入力ファイル (txt_path) を読み込み、# Slide N の形式のヘッダーを検出して スライドの区切りとします。各スライドのコンテンツを抽出し、スライド番号 (1始まり) を キーとする辞書として返します。これにより、PPTXからのテキスト抽出ではなく、 既存のテキストファイルを利用してAI処理を進めることができます。

パラメータ:

txt_path -- Path 読み込むテキストファイルへのパス。

戻り値:

Dict[int, str] スライド番号をキー、対応するテキストコンテンツを値とする辞書。 ファイルが存在しない場合は空の辞書を返します。

ai.pptx2md_with_image.main()[ソース]

スクリプトの主要な実行ロジックをカプセル化します。

詳細説明: この関数は、コマンドライン引数の解析から始まり、以下の主要なステップを実行します。 1. INIファイルからプロンプトテンプレートを読み込みます(もしあれば)。 2. 入力ファイル (PPTXまたはPDF) に基づいて作業ディレクトリを設定します。 3. PPTXファイルの場合、テキスト、数式、画像を抽出し、Markdown形式でコンテンツを準備します。

既存のテキストファイルが指定された場合は、そこからテキストを読み込みます。

  1. PPTXファイルの場合、PowerPointをPDFに変換し、さらに各PDFページをPNG画像に変換します。 PDFファイルが直接入力された場合は、それを画像に変換します。

  2. 選択されたAIモデル(OpenAIまたはGemini)をAPIキーでセットアップします。

  3. 各スライドの画像と抽出されたテキストを用いてAIを呼び出し、詳細な解説を生成します。

7. 生成された解説は、指定された出力Markdownファイルにスライドごとに追記されます。 最後に、処理の完了メッセージと出力ファイルのパスが表示されます。

戻り値:

None

ai.pptx2md_with_image.omml_to_latex(element)[ソース]

Office Math Markup Language (OMML) のXML要素を再帰的に解析し、対応するLaTeX形式の文字列に変換します。

詳細説明: この関数は、PowerPointスライドから抽出されたOMML形式の数式XMLを解析し、 LaTeX互換の表現に変換します。以下のOMML要素を処理します。 - oMath, oMathPara: 数式ブロック。 - f (Fraction): 分数。frac{numerator}{denominator} - rad (Root): 根号。sqrt{expression} または sqrt[degree]{expression} - sSup (Superscript): 上付き文字。base^{superscript} - sSub (Subscript): 下付き文字。base_{subscript} - sSubSup (Subscript and Superscript): 上下付き文字。base_{subscript}^{superscript} - d (Delimiter): 区切り文字(括弧など)。 - r (Run): テキストラン。 - t (Text): テキストコンテンツ。MATH_UNICODE_MAP を使用してUnicode数学記号を変換。 - limLow (Limit Lower): 下限。base_{lower_limit} - limUpp (Limit Upper): 上限。base^{upper_limit} - int (Integral): 積分。int_{lower}^{upper}{expression} - nary (N-ary Operator): n-ary演算子(Σ, Πなど)。operator_{lower}^{upper}{expression}

パラメータ:

element -- etree._Element 変換対象のOMML XML要素。

戻り値:

str 変換されたLaTeX文字列。

ai.pptx2md_with_image.parse_args()[ソース]

コマンドライン引数を解析し、プログラムの動作に必要な設定を取得します。

詳細説明: 入力ファイルパス、出力ファイル名、API選択、モデル名、言語設定、その他オプションを解析します。 OpenAIおよびGeminiのAPIキーは環境変数から取得されます。 モデル名が明示的に指定された場合、対応するAPIのモデル設定を上書きします。

戻り値:

tuple[argparse.ArgumentParser, argparse.Namespace] 解析器オブジェクトと引数オブジェクトのタプル。

ai.pptx2md_with_image.pptx_to_pdf(pptx_path: Path, pdf_path: Path, visible: bool = False) None[ソース]

PowerPointプレゼンテーションファイルをPDF形式に変換します。

詳細説明: win32com.client を使用してPowerPointアプリケーションを起動し、 指定されたPPTXファイル (pptx_path) をPDF形式 (pdf_path) で保存します。 visibleFalse の場合、PowerPointアプリケーションはバックグラウンドで実行され、 アラートも表示されません。PDFファイルが既に存在する場合は、変換をスキップします。

パラメータ:
  • pptx_path -- Path 入力PPTXファイルへのパス。

  • pdf_path -- Path 出力PDFファイルへのパス。

  • visible -- bool PowerPointアプリケーションのウィンドウを表示するかどうか。デフォルトは False

戻り値:

None

例外:

Exception -- PowerPointアプリケーションの操作中にエラーが発生した場合。

ai.pptx2md_with_image.read_ini(inifile=None)[ソース]

INIファイルから設定を読み込み、キーと値の辞書を返します。

詳細説明: この関数は、指定されたINIファイル(またはデフォルトのINIファイル)を解析し、設定を辞書としてロードします。 コメント行(# または ; で始まる)はスキップされます。 複数行の値は、三重引用符(""" または ''')で囲むことでサポートされます。 キーと値のペア内の変数は、$VAR_NAME の形式で定義済み変数に展開されます。

パラメータ:

inifile -- Optional[str] 読み込むINIファイルのパス。

戻り値:

dict INIファイルから読み込まれた設定の辞書。

例外:

FileNotFoundError -- 指定されたINIファイルが見つからない場合。

ai.pptx2md_with_image.search_file(infile=None)[ソース]

指定されたファイルがカレントディレクトリまたはスクリプトディレクトリに存在するかを探索します。

パラメータ:

infile -- Optional[str] 探索するファイル名。指定がない場合はデフォルトのINIファイル名を探索。

戻り値:

Optional[str] 見つかったファイルの絶対パス、またはNone。

ai.pptx2md_with_image.split_latex_blocks(s: str)[ソース]

LaTeX文字列を \ で区切られた複数のブロックに分割します。

詳細説明: 複数行の数式が単一のLaTeX文字列に含まれている場合、各行(\ で区切られる)を 個別の数式ブロックとして扱えるように分割します。 各ブロックは前後の空白が除去され、空のブロックは結果から除外されます。 これは、Pandocなどのツールで複数行数式を正しくレンダリングするために重要です。

パラメータ:

s -- str 分割対象のLaTeX文字列。

戻り値:

List[str] 分割されたLaTeXブロックのリスト。

ai.pptx2md_with_image.terminate()[ソース]

スクリプトを終了させ、必要に応じてユーザーの入力を待機します。

詳細説明: グローバル変数 pause が真の場合、ユーザーがEnterキーを押すまでプログラムの実行を停止します。 その後、プログラムは終了します。

戻り値:

None