Pythonでword、excel、powerpointを画像に変換する方法

この記事はword、excel、powerpointなどMicrosoft Officeで書いた書類のファイルから画像に変換する方法についてまとめます。

# wordから画像への変換

wordから画像へ変換する方法をgoogleで検索してみたら、`aspose`というモジュールを使うという方法を見つけました。

https://products.aspose.com/words/python-net/conversion/word-to-image/

でもこれは有料なので、あまりおすすめできません。

他の方法なら結局wordから直接画像ファイルに変換する方法は見つからないので、まずwordからpdfに変換して、その後pdfから画像に変換することになります。

wordからpdfに変換するには`docx2pdf`というモジュールは便利です。
そしてpdfから画像に変換するには`pdf2image`というモジュールは便利です。
どれもモジュールの名前はそのままですね。

インストールはpipで簡単にできます。

```
pip install docx2pdf
pip install pdf2image
```

`docx2pdf`の使い方はすごく簡単です。特に説明しなくてもコードを見ればすぐわかるくらい。

`pdf2image`の使い方について、この記事を参考に

https://qiita.com/masuda401/items/f5cf9102cd3380db6ffb

`pdf2image`ではjpg、png、gif、bmp、tiffなど色んな画像の種類ができるが、ここではpngにします。

`docx2pdf`と`pdf2image`を使ってwordを画像に変換するコードはこのように書きます。

```python
import docx2pdf
import pdf2image
import os

word_file = r'hoge.docx' # 入力wordファイルの名前
img_path = r'fugaimage' # 出力の画像を置くフォルダ
dpi = 72 # 解像度（指定しなければ200になってたなり大きい）

# まずはpdfにする
pdf_file = word_file+'.pdf' # pdfファイルの名前（すぐ削除するからどうでもいいけど）
docx2pdf.convert(word_file,pdf_file)
# フォルダが既存でなければまずは作成
if(not os.path.exists(img_path)):
    os.mkdir(img_path)
# pdfから画像を取得する
lis_img = pdf2image.convert_from_path(pdf_file,dpi)
for i,img in enumerate(lis_img,1): # 一枚ずつ保存する
    img.save(os.path.join(img_path,str(i)+'.png'))
os.remove(pdf_file) # すべて終わった後pdfを削除する
```

こうやって指定したフォルダにwordの中の各ページがそれぞれ画像に出力されます。

.pngの代わりに.jpgや.gifなどが欲しい場合、拡張子を変えてもいいです。

変換したいwordが1ページしかない場合なら、簡単にこう書けばいいです。
```python
word_file = r'hoge.docx'
img_file = r'fugaimage.png'
dpi = 72

pdf_file = word_file+'.pdf'
docx2pdf.convert(word_file,pdf_file)
pdf2image.convert_from_path(pdf_file,dpi)[0].save(img_file)
os.remove(pdf_file)
```


# excelから画像への変換

wordと同じように、簡単で直接画像ファイルに変換する方法はないようです。

ちなみにこれも`aspose`でできるようですが、やはり有料なのでこの方法はひとまず不採用にします。

https://blog.aspose.com/cells/convert-excel-to-image-in-python/

まずexcelをpdfに変換してからpdfから画像に変換するということになります。

excelからpdfに変換できるモジュールとして`comtypes`や`win32com`があります。この2つはとても似ていますが、`win32com`がよく知られているようなので、ここでは`win32com`を使うという方法で行きます。

`win32com`でexcelからpdfに変換する方法についてはこの記事を参考に

https://qiita.com/KazukiTerashima/items/2300c4e5bd56ac84ea43

その他に、`win32com`で色々excelを扱う方法についてはこの記事を参考に

https://qiita.com/kumarstack55/items/9ae3432446afca06497f

ちなみに、実は`win32com`がwordをpdfに変換することもできます。この記事を参考に

https://qiita.com/hanchan/items/21552ed97e7203744310

でもwordの場合はやっぱり`docx2pdf`を使う方が便利なので、ここで`win32com`はexcelにだけ適用します。

`win32com`と`pdf2image`を使ってexcelをpngに変換するコードはこうなります。

```python
import win32com.client
import pdf2image
import os

excel_file = r'hoge.xlsx'
img_path = r'fugaimage'
dpi = 72

pdf_file = excel_file+'.pdf'
app = win32com.client.Dispatch('Excel.Application')
wb = app.Workbooks.Open(excel_file)
wb.ExportAsFixedFormat(0,pdf_file)
app.Quit()

if(not os.path.exists(img_path)):
    os.mkdir(img_path)

lis_img = pdf2image.convert_from_path(pdf_file,dpi)
for i,img in enumerate(lis_img,1):
    img.save(os.path.join(img_path,str(i)+'.png'))
os.remove(pdf_file)
```

ほとんどwordの場合とは同じなので、詳しい説明は省略します。


# powerpointから画像への変換

次はppt（powerpoint）です。実はwordとexcelと違って、pptは簡単に直接画像に変換できる方法があります。

それができるモジュールは`win32com`と`comtypes`です。excelと同じようにこれを使ってpdfに変換することもできますが、pptの場合はpdfだけでなく、各種の画像ファイルに変換することもできます。

この記事も参考に

https://qiita.com/Gyutan/items/dee1d6922778fe70037b

同じ方法はwordとexcelに使うことはできないのは残念です。

`win32com`を使ってpptからpngに変換するコードはこんな感じです。

```python
import win32com.client

ppt_file = r'hoge.pptx' # pptファイル
img_path = r'fugaimage' # 画像を入れるフォルダ

app = win32com.client.Dispatch('Powerpoint.Application')
ppt = app.Presentations.Open(ppt_file)
ppt.SaveAs(img_path,18)
ppt.Close()
app.Quit()
```

ここで`.SaveAs()`の中の`18`という数字はpngに変換するという意味です。その他にもいっぱいあります。例えば

- 16： gif
- 17： jpg
- 18： png
- 19： bmp
- 21： tif
- 32： pdf

こうやって`win32com`を使ったらpowerpointファイルを画像にもpdfにも簡単に変換できて便利です。