業務効率化・自動化の事例として、Powerpoint(pptx)ファイルを画像に変換する方法を解説します。
Powerpointファイルは直接画像に変換・出力することはできません。そのため、一度中間ファイルとしてPDFファイルに変換して、そのPDFファイルを画像変換する方法を取ります。
Powerpoint → PDF →画像 といった流れになります。
Pythonスクリプトを動作させるPCにPowerpointアプリケーションがインストールされている必要があります。
使用ライブラリ・モジュール
PythonでPowerpointを扱うためpywin32
を使用します。
また、PDFファイルを画像変換するには、pdf2image
を使用しますが、このライブラリは「Poppler」というフリーのPDFコマンドラインツールを内部で用います。そのため、Popplerをダウンロードしておく必要があります。
インストール:必要
インストール
pip
コマンドで pywin32
と pdf2image
ライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)
Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます。)
「poppler」はWindows版をこちらからダウンロードします。
ダウンロードしたファイルは7z形式で圧縮されているため、7-zipなどのツールを使って展開します。
展開したフォルダの名称を「poppler」に変更してpythonスクリプトと同じディレクトリに保存します。
ディレクトリ構成
今回は以下の様なディレクトリ・ファイル構成として解説していきます。
├── pptx2png.py
├── poppler
└── pptx
├── sample1.pptx
└── sub
└── sample2.pptx
Pythonスクリプト(pptx2png.py)と同じディレクトリにdirフォルダが配置されており、その配下にsample1.pptx と、更にsubフォルダの配下にsample2.pptxが保存されています。
Powerpointファイルは以下のような構成とします。
この2つのPowerpointファイルを画像に変換して、dir フォルダ配下にimgフォルダを新たに作成して、その中にPowerpointのファイル名のフォルダを作成・画像を格納します。
├── 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
Powerpointファイルを画像に変換する
以下がサンプルコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # PRG1: ライブラリ設定 import win32com.client from pathlib import Path from pdf2image import convert_from_path import os import shutil # PRG2: poppler/binを環境変数PATHに追加 poppler_dir = Path( './poppler/bin').resolve() os.environ['PATH'] += os.pathsep + str(poppler_dir) # PRG3: ディレクトリ設定 dir = Path(__file__).parent.resolve() pptx_dir = dir/ 'pptx' img_dir = pptx_dir/ 'img' temp_dir = pptx_dir/ 'temp' if not os.path.exists(temp_dir): os.makedirs(temp_dir) else: shutil.rmtree(temp_dir) os.makedirs(temp_dir) # PRG4: Powerpointファイルを検索 pptx_files = [] for files in pptx_dir.rglob('*.pptx'): pptx_files.append(files) # PRG5: Powerpoint→PDF→画像変換処理 for i, pptx_path in enumerate(pptx_files): # PRG6: Powerpointファイルを開きPDF形式で保存 filename = pptx_path.stem 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) pdf_path = temp_dir/Path(filename + '.pdf') presentation.SaveAs(pdf_path, 32) presentation.close() application.quit() presentation = None application = None # PRG7: 画像変換処理 out_dir = img_dir/ filename os.makedirs(out_dir) images = convert_from_path(str(pdf_path), dpi=300, fmt='png') image_path = out_dir/ filename for k in range(len(images)): images[k].save(f'{image_path}_' + f'{k+1}'.zfill(2) + '.png', 'PNG') # PRG8: tempフォルダ削除 shutil.rmtree(temp_dir) |
プログラムを解説していきます。
PRG1: ライブラリ設定
1 2 3 4 5 6 | # PRG1: ライブラリ設定 import win32com.client from pathlib import Path from pdf2image import convert_from_path import os import shutil |
処理に必要なライブラリのインポートを行います。
from pathlib import Path
PythonでWindowsアプリケーションを扱うにはWindowsAPIへアクセスするためのライブラリpywin32
をインポートします。
またpywin32ではファイルパスをWindowsPath型で指定する必要があるため、pathlib
モジュールも合わせてインポートします。
PDFを画像に変換するため、pdf2image
の convert_from_path
クラスをインポートします。
import shutil
ファイル操作のため、os
, shutil
モジュールをインポートします。
PRG2: poppler/binを環境変数PATHに追加
1 2 3 | # PRG2: poppler/binを環境変数PATHに追加 poppler_dir = Path( './poppler/bin').resolve() os.environ['PATH'] += os.pathsep + str(poppler_dir) |
poppler を動作させるために、環境変数のPATHにPoppler実行ファイルのディレクトリを追加します。
環境変数は絶対パスで指定する必要があるため、ディレクトリを絶対パスで取得します。
ここでは Path
クラスの resolve()
メソッドを使用しています。
pathlibライブラリの使い方についてはこちらの記事を参照してください。
・関連記事:【Python入門】pathlibの使い方(パス操作)- 絶対パスと相対パスの変換
環境変数のPATHにpoppler実行ファイルのディレクトリを追加します。
PRG3: ディレクトリ設定
1 2 3 4 5 6 7 8 9 10 11 | # PRG3: ディレクトリ設定 dir = Path(__file__).parent.resolve() pptx_dir = dir/ 'pptx' img_dir = pptx_dir/ 'img' temp_dir = pptx_dir/ 'temp' if not os.path.exists(temp_dir): os.makedirs(temp_dir) else: shutil.rmtree(temp_dir) os.makedirs(temp_dir) |
作業対象ディレクトリを設定します。
Path(__file__)
でPythonスクリプトのパスを取得することができます。
img_dir = pptx_dir/ ‘img’
temp_dir = pptx_dir/ ‘temp’
変換対象のPowerpointファイルの保存ディレクトリ、画像保存先ディレクトリ、中間のPDFファイルを保存するディレクトリ temp_dir
を設定します。
os.makedirs(temp_dir)
else:
shutil.rmtree(temp_dir)
os.makedirs(temp_dir)
os.makedirs
で temp_dir
を作成します。
ただし、既にディレクトリが存在する場合はエラーが発生してしまうため、os.path.exists()
で存在有無を確認して、無い場合は作成、作成済の場合は削除してから新規で作成します。
・関連記事:Pythonでディレクトリ(フォルダ)の作成・削除(pathlib, shutil)
PRG4: Powerpointファイルを検索
1 2 3 4 | # PRG4: Powerpointファイルを検索 pptx_files = [] for files in pptx_dir.rglob('*.pptx'): pptx_files.append(files) |
対象とするディレクトリ内の全てのPowerpointファイルを検索して、リストに格納します。
pptx_files.append(files)
pathlib
の rglob()
メソッドの引数に *.pptx
を指定して、拡張子がpptxのファイルをサブディレクトリも含めて再帰的に取得します。
・関連記事:Pythonでディレクトリ名・ファイル名の一覧取得(pathlib)
取得した結果を、リストpptx_files
にappend()
メソッドで追加します。
・関連記事:リスト-リストに要素を追加する
PRG5: Powerpoint→PDF→画像変換処理
1 2 | # PRG5: Powerpoint→PDF→画像変換処理 for i, pptx_path in enumerate(pptx_files): |
リスト pptx_files
内のファイルを一つずつ取り出し、PRG6・7の処理を繰り返し実行します。
・関連記事:繰り返し処理(for文)-リストの要素とインデックスを取得(enumerate)
PRG6: Powerpointファイルを開きPDF形式で保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # PRG6: Powerpointファイルを開きPDF形式で保存 filename = pptx_path.stem 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) pdf_path = temp_dir/Path(filename + '.pdf') presentation.SaveAs(pdf_path, 32) presentation.close() application.quit() presentation = None application = None |
PowerpointファイルをPDFファイルに変換していきます。
こちらの記事でも解説しています。
・関連記事:PythonでPowerpointファイル(pptx)をPDFに変換する
環境変数は絶対パスで指定する必要があるため、ディレクトリを絶対パスで取得します。
ここでは Path
クラスの resolve()
メソッドを使用しています。使い方についてはこちらの記事を参照してください。
Powerpointファイルパスから拡張子抜きのファイル名を取得します。
・関連記事:【Python入門】pathlibの使い方(パス操作)- ファイル名・拡張子の取得
application.visible = True
read_only = True
title = False
window = False
presentation = application.Presentations.Open(pptx_path, read_only, title, window)
pywin32 でPowerpointアプリケーションを起動して、ファイルを開きます。
presentation.SaveAs(pdf_path, 32)
presentation.close()
application.quit()
presentation = None
application = None
PDF保存パスを指定して、開いたPowerpointファイルをPDFで保存します。
PRG7: 画像変換処理
1 2 3 4 5 6 7 | # PRG7: 画像変換処理 out_dir = img_dir/ filename os.makedirs(out_dir) images = convert_from_path(str(pdf_path), dpi=300, fmt='png') image_path = out_dir/ filename for k in range(len(images)): images[k].save(f'{image_path}_' + f'{k+1}'.zfill(2) + '.png', 'PNG') |
ファイル毎に画像出力先のディレクトリを作成して、PDFファイルの画像変換を行いファイルを出力していきます。
os.makedirs(out_dir)
画像出力先ディレクトリ img_dir
の配下に、各ファイル毎の保存先ディレクトリを作成します。
pdf2image
ライブラリの convert_from_path()
でPDFファイルを画像に変換します。引数はファイルパス、解像度(dpi)、ファイルフォーマットを指定します。フォーマットはppm
, jpeg
, png
, tiff
が指定可能です。
変換した結果は images
に、ページ毎に分割したオブジェクトのリストとして保存されます。
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フォルダ削除
1 2 | # PRG8: tempフォルダ削除 shutil.rmtree(temp_dir) |
最後に、中間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)