12A猫で学んだこと-Memoir-

...What are you learning now?

PowerpointをPythonで使うための検討

サマリー

注意

技術系エントリの常ですが、問題が発生しても、こちらでは一切責任を取れません。自己責任でお願いします。

実行環境

自分の実行環境は以下となっています。

はじめに

2つの方針があります。

  • ファイル自体を生成する (python-pptx)
  • Powerpointのアプリケーション自体を操作する (COM操作)

このエントリ中では、
ファイル自体を生成することを静的なpptx操作
アプリケーション自体を操作することを動的なpptx操作
と呼びたいと思います。

静的なpptx操作 (python-pptxによる.pptxファイル出力)

pptx ファイルは.zip ファイルです。
解凍を行うと色々なフォルダやファイルが生成されます。
ファイルの形式はXMLです。
Office Open XML
というフォーマットがあります。
つまり、Powerpoint のソフトウェアをもっていなくても
フォーマットに適合したファイル群さえ作成することができれば、
Powerpointで開けるファイルを作ることができます。
Office Open XML の仕様について自分は詳しくないのですが、 かなり複雑という印象を持っています。
ありがたいことに、pythonでライブラリが作成されています。

python Object のクラスとXML の相互変換を行ってくれます。

非常に助かります。作者のscannyさんに感謝です。

動的なpptx操作 (COM操作によるPowerpointの操作)

python-pptxを使ってできることは.pptx ファイルの作成なので
Powerpointのソフトウェアを動かすことはできません。
Powerpointのソフトウェアを動かすためよく使われるのはVisual Basic for Applicationsです。
プログラムを書くことで、Powerpointの操作を行うことができます。
例えば、下記のようなサイトを参照させていただけます。

しかし、やりたいことはpythonPowerpointを使うことです。VBAの利用ではありません。

(少し古い)技術ですが、アプリケーション間の通信を行うためのCommon Object Model
というフレームワークがあります。 これを用いるとpython から Powerpointが公開しているインターフェースにアクセスすることができます。
しかし、COMを利用するための手順もかなり煩雑です。
ありがたいことに、COM を利用するためのライブラリがあります。

pip install comtypes  

にてインストールを行った後、下記のスクリプトを実行するとHello, Powerpoint.
というテキストボックスが表示されたスライドが生成されます。

import os  
from comtypes import client  
  
if __name__ == "__main__":  
    application = client.CreateObject("Powerpoint.Application")  
    application.Visible = True  
    presentation = application.Presentations.Add()  
    slides = presentation.Slides     
  
    # Reference * https://www.relief.jp/docs/powerpoint-vba-make-new-presentation.html  
    # ppLayoutBlank = 12  
    slide = slides.Add(len(slides) + 1, 12)   
  
    # Reference:  
    # * https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.addtextbox  
    # * https://docs.microsoft.com/en-us/office/vba/api/office.msotextorientation  
  
    shape = slide.shapes.AddTextBox(Orientation=1, Left=100, Top=100, Width=500, Height=50)  
    shape.TextFrame.TextRange.Font.Color.RGB = 0x000000  
    shape.TextFrame.TextRange.text = "Hello, Powerpoint."  
    shape.TextEffect.FontSize = 36  
  
    current_folder = os.getcwd()  
    presentation.SaveAs(os.path.join(current_folder, "sample.pptx"))  

スクリプトとして使っただけでは、あまりpythonの良さが見えてきませんね。
他のライブラリとの連携を視野に入れつつ、自分用にカスタマイズしていくことが
ポイントになる気がします。

終わりに

このエントリだけでは片手落ちの感があるので、来月もこの関連のネタでいきたいと思っています。
そういえば、来月は12月...

  • 年末で色々忙しい時...
  • 綺麗な雪が降り積もる時...
  • 大人の恋人の人たちが楽しい思い出を作る時...

自分のところにサンタクロースさんが来てくれるといいなぁ。
来月がいい1か月になりますように!

付録: 静的なpptx操作 V.S 動的なpptx操作

  • 静的なpptx操作 (python-pptxによる.pptxファイル出力)
  • 動的なpptx操作 (COM操作によるPowerpointの操作)

どちらを使ったほうがいいかはケースバイケースですが、 動的なpptx操作には以下のような特徴があります。

  • インタラクティブな操作を行いやすい
  • 信頼性に不安がある (例: プログラムの実行のユーザー操作の衝突からくるエラー)

したがって、

  • プログラムだけで処理を完結させたいとき
  • 定型的なスライドをたくさん作りたい

というときには静的なpptx操作の方が向いているでしょう。

逆に、

  • Powerpointの操作自体を楽にしたい
  • スライドのデザインを考えながら作業をしたい

というときには動的なpptx操作の方が向いているでしょう。