PythonでWordの表に画像を挿入または抽出する

表中の画像は、データを視覚的に表現する方法です。Wordの表に関連する画像を含めることで、情報に説得力を持たせ、理解しやすくすることができます。しかし、再利用や編集のために、Wordの表に埋め込まれた画像を抽出する必要がある場合もあります。
この記事では、[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリを使用して、PythonでWordの表に画像を挿入したり、Wordの表から画像を抽出したりする方法を紹介します。
* [【Python】Wordの表に画像を挿入する](#python-wordの表に画像を挿入する)
* [【Python】Wordの表から画像を抽出する](#python-wordの表から画像を抽出する)


## Wordの表を扱うためのPythonライブラリ
[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)はWord文書を作成・処理するための使いやすいライブラリです。これを使うと、Word文書に表を作成したり、表にデータを記入したり、画像を挿入したりすることができます。

Python Wordライブラリをインストールするには、以下のpipコマンドを実行します。
`pip install Spire.Doc`

## Python Wordの表に画像を挿入する
コードサンプル：
```python
from spire.doc import *
from spire.doc.common import *

inputFile = "Table.docx"
outputFile = "AddImageToTable.docx"

# Word文書を読み込む
doc = Document()
doc.LoadFromFile(inputFile)

# ドキュメントの最初のセクションから最初の表を取得する
table = doc.Sections[0].Tables[0]

# 表の2行目の3番目のセルに画像を追加する。
cell = table.Rows[1].Cells[2]
picture = cell.Paragraphs[0].AppendPicture("pic1.jpg")
# 画像の幅と高さを設定する
picture.Width = 100
picture.Height = 100

# 表の3行目の3番目のセルに画像を追加する。
cell = table.Rows[2].Cells[2]
picture = cell.Paragraphs[0].AppendPicture("pic2.jpg")
# 画像の幅と高さを設定する
picture.Width = 100
picture.Height = 100

# 表の4行目の3番目のセルに画像を追加する。
cell = table.Rows[3].Cells[2]
picture = cell.Paragraphs[0].AppendPicture("pic3.jpg")
# 画像の幅と高さを設定する
picture.Width = 100
picture.Height = 100

# 結果文書を保存する
doc.SaveToFile(outputFile, FileFormat.Docx)
doc.Close()
```
上記のコードでは、まず **`Table.Row[int].Cells[int]`** プロパティを使って特定のセルにアクセスし、**`TableCell.Paragraphs[int].AppendPicture()`** メソッドを使って画像を追加します。Pythonライブラリには、画像の幅と高さを設定するAPIも用意されています。

## Python Wordの表から画像を抽出する
コードサンプル：
```python
from spire.doc import *
from spire.doc.common import *

inputFile = "AddImageToTable.docx"

# Word文書を読み込む
doc = Document()
doc.LoadFromFile(inputFile)

# ドキュメントの最初のセクションから最初の表を取得する
table = doc.Sections[0].Tables[0]

# 画像名の初期化
image_name = None

# 画像リストの作成
images = []

# テーブルのすべての行を反復処理する
for i in range(table.Rows.Count):

    # 各行のすべてのセルを反復処理する
        for j in range(table.Rows[i].Cells.Count):
            
            # 各セル内のすべての段落を繰り返し処理する
            for p in range(table.Rows[i].Cells[j].Paragraphs.Count):
                 # 指定した段落を取得する
                 para = table.Rows[i].Cells[j].Paragraphs.get_Item(p)
                 
                 # 各段落のすべての子オブジェクトを反復処理する                 for x in range(para.ChildObjects.Count):       
                      # 指定した子オブジェクトを取得する
                       obj = para.ChildObjects.get_Item(x)
                       
                       # 子オブジェクトがDocPicture型かどうかを判断する
                       if obj.DocumentObjectType == DocumentObjectType.Picture:
                            picture = obj if isinstance(obj, DocPicture) else None
                            
                            # 画像データをリストに追加する
                            dataBytes = picture.ImageBytes
                            images.append(dataBytes)
                            
                            # リスト内の画像を繰り返し処理し、それぞれを指定したファイルパスに保存する
                            for index, item in enumerate(images):
                                 image_Name = "TableImages/Image-{}.png".format(index)
                                 with open(image_Name, 'wb') as imageFile:
                                      imageFile.write(item)
# ドキュメントを閉じる
doc.Close()
```

表から画像を抽出するには、表のセル内の段落の各子オブジェクトが **`DocPicture`** タイプかどうかを判断する必要があります。もしそうであれば、画像をリストに追加し、それぞれを指定されたファイル・パスに保存することができます。


## Python Wordライブラリの無料ライセンスを取得する
Python Word ライブラリを試してみたい、Word 文書処理機能をもっと知りたいという方は、無料ライセンスをリクエストしてください。

https://www.e-iceblue.com/TemLicense.html