PowerpointをPythonで使うための検討
サマリー
- pythonを使ってpowerpointが使う手法をまとめた
- python-pptx(.pptxファイルの操作) と COM操作(Powerpointの操作)の2種類がある
- COM操作を行う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の操作を行うことができます。
例えば、下記のようなサイトを参照させていただけます。
しかし、やりたいことはpython でPowerpointを使うことです。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操作の方が向いているでしょう。