====== PowerPoint マージツール ====== 複数人が個別に更新したPowerPointファイルを1つのPowerPointファイルにまとめるという作業があります。少なくともスライドレベルの結合を人力で行なうことは不毛なので、自動化したいと思います。 ===== 利用ツール ===== Pythonのライブラリを使えばサクッとできるだろう、と考えていましたが、意外と制約があります。 結論として、今回の用途に最適と判断したのは win32com です。 * Python-pptx * 細かなPowerPoint操作ができて、ライセンス面でも使いやすいが、 スライド単位でマージする機能がありません。スライド配下にあるオブジェクトを全て参照して、それらを使って再構築する方法を取ることになります * スライド単位でマージできるPythonライブラリ * インターネットを検索すると、幾つか紹介記事が出てきますが、商用利用には諸々制約があります。 * win32com * Windows環境に限定されますが、直接PowerPointを用いて操作します。Windows環境で動かす前提で良いなら、これが一番無難な選択肢かと思います。 ===== 環境準備 ===== 必要なライブラリをインストールします。 pip install pywin32 python.exe -m pip install --upgrade pip import win32com.client ppt = win32com.client.Dispatch("PowerPoint.Application") ppt.Visible = True presentation = ppt.Presentations.Open(r"C:\Work\PPTCombined\first.pptx") for f in [r"C:\Work\PPTCombined\second.pptx", r"C:\Work\PPTCombined\third.pptx"]: presentation.Slides.InsertFromFile(f, presentation.Slides.Count) presentation.SaveAs(r"C:\Work\PPTCombined\merged.pptx") ppt.Quit() ===== 実行ファイル化 ===== Windows環境ということもあり、Python環境をインストールしていない人でも使えるようにしたいです。 まず必要なライブラリをインストールします。 pip install pyinstaller 下記のコマンドを実行して、実行ファイルを作成します。distフォルダ以下にexeファイルが出力されます。 pyinstaller --onefile pptmerger.py ===== トラブルシューティング ===== 自分は下記のエラーで悩まされました。 pywintypes.com_error: (-2147352567, '例外が発生しました。', (0, None, None, None, 0, -2147024773), None) 下記の対策で改善しました。 * ファイルパスを絶対パスにする * raw文字列指定をする("C:\Work\PPTCombined\first.pptx" を r"C:\Work\PPTCombined\first.pptx"とする) * raw文字列にしないと、バックスラッシュがエスケープ文字として解釈され、ファイルパスが正しくなくなります。