PythonでPowerpointファイル(pptx)を画像に変換する

PythonでPowerpointファイルを画像に変換する
スポンサーリンク
スポンサーリンク

業務効率化・自動化の事例として、Powerpoint(pptx)ファイルを画像に変換する方法を解説します。

Powerpointファイルは直接画像に変換・出力することはできません。そのため、一度中間ファイルとしてPDFファイルに変換して、そのPDFファイルを画像変換する方法を取ります。
Powerpoint → PDF →画像 といった流れになります。

Pythonスクリプトを動作させるPCにPowerpointアプリケーションがインストールされている必要があります。

スポンサーリンク

使用ライブラリ・モジュール

PythonでPowerpointを扱うためpywin32を使用します。
また、PDFファイルを画像変換するには、pdf2image を使用しますが、このライブラリは「Poppler」というフリーのPDFコマンドラインツールを内部で用います。そのため、Popplerをダウンロードしておく必要があります。

ライブラリ :pywin32(公式ドキュメント
インストール:必要
ライブラリ :pdf2image (公式ドキュメント
インストール:必要
モジュール :os
インストール:不要
モジュール :shutil
インストール:不要
モジュール :pathlib
インストール:不要

インストール

pipコマンドで pywin32pdf2imageライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)

python -m pip install pywin32 pdf2image

Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます。)

「poppler」はWindows版をこちからダウンロードします。

ダウンロードしたファイルは7z形式で圧縮されているため、7-zipなどのツールを使って展開します。
展開したフォルダの名称を「poppler」に変更してpythonスクリプトと同じディレクトリに保存します。

ディレクトリ構成

今回は以下の様なディレクトリ・ファイル構成として解説していきます。

D:\PythonScript\python-work\code
├── pptx2png.py
├── poppler
└── pptx
     ├── sample1.pptx   
     └── sub
          └── sample2.pptx

Pythonスクリプト(pptx2png.py)と同じディレクトリにdirフォルダが配置されており、その配下にsample1.pptx と、更にsubフォルダの配下にsample2.pptxが保存されています。

Powerpointファイルは以下のような構成とします。

Powerpointファイル

この2つのPowerpointファイルを画像に変換して、dir フォルダ配下にimgフォルダを新たに作成して、その中にPowerpointのファイル名のフォルダを作成・画像を格納します。

D:\PythonScript\python-work\code
├── pptx2png.py
├── poppler
└── pptx
     ├── sample1.pptx   
     ├── sub
     |    └── sample2.pptx
     └── img
          ├── sample1
          |      ├── sample1_01.png
          |      ├── sample1_02.png
          |      └── sample1_03.png
          └── sample2
                 ├── sample2_01.png
                 ├── sample2_02.png
                 ├── sample2_03.png
                 ├── sample2_04.png
                 └── sample2_05.png
PNG変換結果

Powerpointファイルを画像に変換する

以下がサンプルコードになります。

プログラムを解説していきます。

PRG1: ライブラリ設定

処理に必要なライブラリのインポートを行います。

import win32com.client
from pathlib import Path

PythonでWindowsアプリケーションを扱うにはWindowsAPIへアクセスするためのライブラリpywin32をインポートします。
またpywin32ではファイルパスをWindowsPath型で指定する必要があるため、pathlibモジュールも合わせてインポートします。

from pdf2image import convert_from_path

PDFを画像に変換するため、pdf2imageconvert_from_path クラスをインポートします。

import os
import shutil

ファイル操作のため、os, shutil モジュールをインポートします。

PRG2: poppler/binを環境変数PATHに追加

poppler を動作させるために、環境変数のPATHにPoppler実行ファイルのディレクトリを追加します。

poppler_dir = Path( ‘./poppler/bin’).resolve()

環境変数は絶対パスで指定する必要があるため、ディレクトリを絶対パスで取得します。
ここでは Path クラスの resolve() メソッドを使用しています。

pathlibライブラリの使い方についてはこちらの記事を参照してください。
・関連記事:【Python入門】pathlibの使い方(パス操作)- 絶対パスと相対パスの変換

os.environ[‘PATH’] += os.pathsep + str(poppler_dir)

環境変数のPATHにpoppler実行ファイルのディレクトリを追加します。

PRG3: ディレクトリ設定

作業対象ディレクトリを設定します。

dir = Path(__file__).parent.resolve()

Path(__file__) でPythonスクリプトのパスを取得することができます。

pptx_dir = dir/ ‘pptx’
img_dir = pptx_dir/ ‘img’
temp_dir = pptx_dir/ ‘temp’

変換対象のPowerpointファイルの保存ディレクトリ、画像保存先ディレクトリ、中間のPDFファイルを保存するディレクトリ temp_dir を設定します。

if not os.path.exists(temp_dir):
    os.makedirs(temp_dir)
else:
    shutil.rmtree(temp_dir)
    os.makedirs(temp_dir)

os.makedirstemp_dir を作成します。

ただし、既にディレクトリが存在する場合はエラーが発生してしまうため、os.path.exists() で存在有無を確認して、無い場合は作成、作成済の場合は削除してから新規で作成します。
・関連記事:Pythonでディレクトリ(フォルダ)の作成・削除(pathlib, shutil)

PRG4: Powerpointファイルを検索

対象とするディレクトリ内の全てのPowerpointファイルを検索して、リストに格納します。

for files in pptx_dir.rglob(‘*.pptx’):
    pptx_files.append(files)

pathlibrglob() メソッドの引数に *.pptx を指定して、拡張子がpptxのファイルをサブディレクトリも含めて再帰的に取得します。
・関連記事:Pythonでディレクトリ名・ファイル名の一覧取得(pathlib)

取得した結果を、リストpptx_filesappend()メソッドで追加します。
・関連記事:リスト-リストに要素を追加する

PRG5: Powerpoint→PDF→画像変換処理

リスト pptx_files 内のファイルを一つずつ取り出し、PRG6・7の処理を繰り返し実行します。
・関連記事:繰り返し処理(for文)-リストの要素とインデックスを取得(enumerate)

PRG6: Powerpointファイルを開きPDF形式で保存

PowerpointファイルをPDFファイルに変換していきます。
こちらの記事でも解説しています。
・関連記事:PythonでPowerpointファイル(pptx)をPDFに変換する

環境変数は絶対パスで指定する必要があるため、ディレクトリを絶対パスで取得します。
ここでは Path クラスの resolve() メソッドを使用しています。使い方についてはこちらの記事を参照してください。

filename = pptx_path.stem

Powerpointファイルパスから拡張子抜きのファイル名を取得します。
・関連記事:【Python入門】pathlibの使い方(パス操作)- ファイル名・拡張子の取得

application = win32com.client.Dispatch(‘Powerpoint.Application’)
application.visible = True
read_only = True
title = False
window = False
presentation = application.Presentations.Open(pptx_path, read_only, title, window)

pywin32 でPowerpointアプリケーションを起動して、ファイルを開きます。

pdf_path = temp_dir/Path(filename + ‘.pdf’)
presentation.SaveAs(pdf_path, 32)
presentation.close()
application.quit()
presentation = None
application = None

PDF保存パスを指定して、開いたPowerpointファイルをPDFで保存します。

PRG7: 画像変換処理

ファイル毎に画像出力先のディレクトリを作成して、PDFファイルの画像変換を行いファイルを出力していきます。

out_dir = img_dir/ filename
os.makedirs(out_dir)

画像出力先ディレクトリ img_dir の配下に、各ファイル毎の保存先ディレクトリを作成します。

images = convert_from_path(str(pdf_path), dpi=300, fmt=’png’)

pdf2image ライブラリの convert_from_path() でPDFファイルを画像に変換します。引数はファイルパス、解像度(dpi)、ファイルフォーマットを指定します。フォーマットはppmjpegpng, tiffが指定可能です。

変換した結果は images に、ページ毎に分割したオブジェクトのリストとして保存されます。

image_path = out_dir/ filename
for k in range(len(images)):
    images[k].save(f'{image_path}_’ + f'{k+1}’.zfill(2) + ‘.png’, ‘PNG’)

画像ファイルのパスを指定して、1ページずつ保存していきます。
ここでは、ファイル名の操作に f 文字列を使用しています。 zfill()で ページ番号に対して2桁のゼロ埋め(01, 02…) を行い、ファイル名の連番として利用しています。

PRG8: tempフォルダ削除

最後に、中間PDFファイルを保存したtempディレクトリを削除します。
ディレクトリ内にファイルが存在する場合は、shutil モジュールの rmtree() メソッドで削除します。os.rmdir()pathlib.Path.rmdir()で削除しようとするとエラーが発生してしまいます。

以上でPowerpointファイル(pptx)を画像に変換する方法の解説を終了します。

他にもPowerpoint ファイルやPDFファイルを操作する方法を解説していますので、参考にしてください。
・関連記事:PythonでPowerpointファイル(pptx)をPDFに変換する
・関連記事:PythonでPDFファイルを結合する(PyPDF2)
・関連記事:PythonでPDFファイルを分割する(PyPDF2)
・関連記事:PythonでPDFのページサイズを取得(PyPDF2)