PythonでPowerPointファイル内のテキストや画像を抜き出す方法を紹介します。
色々パワポで資料作ると、あの内容を書いた資料どこにあるっけ?とか、あの画像使いまわしたいけどどこでしたっけ?と探すのに手間がかかることありませんか?
パワポ内のテキストを検索するならWindowsのファイル検索機能でもいいけど、遅いしイマイチだし、画像さがすにはパワポ開くの面倒だし・・・。
このような悩みを抱えているひとは是非Python-pptxを活用してみて下さい(ほかの方法もあるかもだけど)。
Python-pptxならパワポファイル内のテキストや画像を探しだすことは簡単にできるので、是非今回紹介する方法で業務が効率化出来るか試してみて下さい。
PythonでPowerPointファイルを操作する方法を覚えよう
PythonでPowerPointファイルを操作する方法は以前に紹介したので、参考にしてください。




PowerPointファイルから画像を抜き出す
PowerPointファイルでのテキストを探すためには、PowerPointファイルのスライド内にShape(オブジェクト)を調べ、オブジェクトがimage属性を持つか調べます。ShapeはPresentationのスライドの構成要素(図や表等の要素)を扱う為のオブジェクトです。
スライドの中のShapeがimage属性を持つか調べるには、hasattrを使います。hasattrはPythonの組み込み関数です。
hasattr(オブジェクト, '属性名')
スライド内にshapeがimage属性を持つかは、hasattr(オブジェクト, ‘image’)のようにして調べます。
hasattrでimage属性をもつshapeが見つかったら保存します。image属性を持つshapeを調べると、Imageオブジェクトであることがわかります。
画像はバイナリデータですので、バイナリデータを書き出す為には、以下のようにします。
Imageオブジェクト.image.blob
画像を抽出する際に気を付ける点は以上です。
では、実際にソースコードを見てみましょう。
from pptx import Presentation
import os
ppt_path = r"/home/hoge/Desktop/test.pptx"
#PowerPointファイルを開く(=Presentaionオブジェクトを作る)
prs = Presentation(ppt_path)
image_no = 0
for slide in prs.slides:
#スライド内のshapeオブジェクトを1個ずつ取り出す
for shape in slide.shapes:
#スライド内のshapeオブジェクトがimage属性があるか調べる
if hasattr(shape, "image"):
print(shape, type(shape))
image_no += 1
#保存する為のファイル名設定
image_filename = shape.image.filename
save_image_filename = os.path.join(save_path, str(image_no) + image_filename)
#保存
with open(save_image_filename, "wb") as f:
f.write(shape.image.blob)
PowerPointファイル内のテキストを検索する
やりかたは、画像を抜き出す方法とほとんど同じです。違うのは、画像を探すか?テキストを探すかです。
テキストを探す方法は、画像を探すとき同じで、hasattrの第2引数を”image”を”text”に変えれば良いだけです。つまり、hasattr(オブジェクト, ‘text’)とすれば良いだけです。
“text”属性を持つオブジェクトは、Shape、SlidePlaceholderオブジェクトでしょう。
ShapeオブジェクトであろうとSlidePlaceholderオブジェクトであろうと、”text”属性で返されるのはStringオブジェクトなので、見つかった後は普通のテキスト処理をすれば良いだけです。
ppt_path = r"/home/hoge/Desktop/test.pptx"
prs = Presentation(ppt_path)
#スライド1個ずつ取り出す
slide_number = 0
for slide in prs.slides:
slide_number += 1
#スライド内のshapeオブジェクトを1個ずつ取り出す
for shape in slide.shapes:
#スライド内のshapeオブジェクトがimage属性があるか調べる
if hasattr(shape, "text"):
print(shape.text) #=> <class 'str'>なので、あとは普通にテキスト処理するだけ