はじめに

どうも!バックエンドのしゅがーです。

今回は「テンプレートとなるような資料作成をしたい!」「それじゃあ、試しにやれるようにしてみよう!」とpython-pptxを利用できるようにした話です。

AWS Lambdaでのpython-pptxの利用

AWS Lambdaでpython-pptxを利用するためにpython-pptxをAWS Lambda Layersに登録しました。

使っているとpython-pptxには以下の2つがないことがわかりました。

  1. 画像の置換をしたいが画像の特定が難しい
    1. 資料に使用する背景画像などはランダムで置き換えしたいのですが、テンプレートファイルは複数あり、これからも増える可能性もあります。 テンプレート、ページごとに位置などの情報を管理したくありませんでした。 なので、テンプレートファイルにある画像から直接情報を読み取ろうとなりました。
  2. フォントの参照がwindowsとmacのみ
    1. AmazonLinux2023上での利用を考えており、Linuxがないので足しました。 他にもフォントを指定できる箇所はありますが、最後の砦としてOSのフォントを参照しにくるので追加しました。

と上記2つについてpython-pptx自体に手を加えることにしました。

python-pptxの修正

  1. 画像の特定
    1. 画像の特定をするためにpython-pptxによる代替テキストへのアクセスを参考にソースを修正してみると代替テキストが取得できるようになりました。
    2. これを利用して、置換えしたい画像オブジェクトを代替テキストで取得し、位置をそのままに画像の置換えすることに成功しました。
  2. Linuxのfontパスを追加
    1. python\pptx\text\fonts.py 43行目のあたり
          @classmethod
      def _font_directories(cls):
      """
      Return a sequence of directory paths likely to contain fonts on the
      current platform.
      """
      if sys.platform.startswith("darwin"):
      return cls._os_x_font_directories()
      if sys.platform.startswith("win32"):
      return cls._windows_font_directories()
      if sys.platform.startswith("linux"):
      return cls._linux_font_directories()
      raise OSError("unsupported operating system")
    2. 100行目のあたりに「_linux_font_directories」を追加
          @classmethod
      def _windows_font_directories(cls):
      """
      Return a sequence of directory paths on Windows in which fonts are
      likely to be located.
      """
      return [r"C:\\Windows\\Fonts"]

      @classmethod
      def _linux_font_directories(cls):
      """
      Return a sequence of directory paths on Linux in which fonts are
      likely to be located.
      """
      return ["/usr/share/fonts", "/usr/local/share/fonts"]

上記修正したpython-pptxを他に必要なモジュールと一緒にzipに固めて、AWS Lambda Layersに登録することで無事画像の置換えやフォントの利用をすることが出来ました。

参考リンク