PythonでWord文書に画像を追加、置換、削除する

Pythonを活用してWord文書内の画像を動的に管理することで、画像の挿入位置の指定、条件付きの置換、不要な要素の削除を正確に実行できます。これは、定期的に標準化されたWord文書を生成する必要がある場合に特に有効です。この自動化手法により、手作業によるフォーマットの崩れやバージョン管理の混乱といったリスクを大幅に低減できるだけでなく、APIを介してデータベースや画像処理システムとシームレスに統合することが可能になります。この記事では、**Pythonを使用してWord文書に画像を追加、置換、削除する方法**を紹介します。

- **[PythonでWord文書に画像を挿入する](#pythonでword文書に画像を挿入する)**
- **[PythonでWord文書の画像を新しい画像に置換する](#pythonでword文書の画像を新しい画像に置換する)**
- **[PythonでWord文書の画像をテキストに置換する](#pythonでword文書の画像をテキストに置換する)**
- **[PythonでWord文書の画像を削除する](#pythonでword文書の画像を削除する)**

本記事で紹介する方法では、無料の[Free Spire.Doc for Python](https://jp.e-iceblue.com/introduce/introduce-free-doc-for-python.html)を使用します。PyPIからインストールできます：`pip install spire.doc`。

## PythonでWord文書に画像を挿入する

Spire.Docの`Paragraph.AppendPicture(string: fileName)`メソッドを使用すると、指定したパスの画像をWord文書の特定の段落に挿入できます。また、`DocPicture`クラスのプロパティを使用して、画像のサイズ、位置、テキストの回り込みスタイルなどを設定できます。

### 操作手順
1. 必要なモジュールをインポートする。
2. `Document`オブジェクトを作成し、新しいWord文書を作成する。
3. `Document.AddSection()`メソッドで文書にセクションを追加し、フォーマットを設定する。
4. `Section.AddParagraph()`メソッドで段落を追加し、`Paragraph.AppendText()`メソッドでテキストを追加してフォーマットを設定する。
5. `Paragraph.AppendPicture()`メソッドで画像を挿入する。
6. `DocPicture`クラスのプロパティで画像の属性を設定する：
    - `Width`および`Height`プロパティで画像サイズを指定。
    - `HorizontalPosition`および`VerticalPosition`プロパティで画像の位置を指定。
    - `TextWrappingStyle`プロパティでテキストの回り込みスタイルを指定。
7. `Document.SaveToFile()`メソッドで文書を保存する。
8. リソースを解放する。

**コード例：**
```python
from spire.doc import Document, TextWrappingStyle, FileFormat

# Documentオブジェクトを作成し、新しいWord文書を作成します
doc = Document()

# 文書にセクションを追加し、余白を設定します
section = doc.AddSection()
section.PageSetup.Margins.All = 72

# セクションに段落を追加し、テキストを挿入します
para = section.AddParagraph()
textRange = para.AppendText("Document Introduction")
textRange.CharacterFormat.FontName = "Arial"
textRange.CharacterFormat.FontSize = 16
textRange.CharacterFormat.Bold = True

# 段落を追加し、画像を挿入します
para1 = section.AddParagraph()
pic = para1.AppendPicture("Word.png")

# 画像のサイズを設定します
pic.Width = 64
pic.Height = 64

# 画像の位置を設定します（オプション）
pic.HorizontalPosition = 360
pic.VerticalPosition = 10

# 画像のテキスト折り返しスタイルを設定します
pic.TextWrappingStyle = TextWrappingStyle.Square

# テキストを追加し、フォーマットを設定します
textRange2 = para1.AppendText("This document serves as a structured repository of critical information, designed to facilitate clear communication, collaborative workflows, and long-term knowledge retention. Its architecture prioritizes accessibility, with a navigable hierarchy of headings, cross-referenced sections, and embedded metadata to streamline information retrieval.")
textRange2.CharacterFormat.FontName = "Arial"
textRange2.CharacterFormat.FontSize = 12

# 文書を保存します
doc.SaveToFile("output/AddPicToWord.docx", FileFormat.Docx2019)
doc.Dispose()
```

結果文書
![PythonでWord文書に画像を挿入する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/cf09f1fb-1731-4f05-a739-c29542d7e80c.png)

## PythonでWord文書の画像を新しい画像に置換する

文書内のすべての画像を見つけるには、段落の子オブジェクトの`DocumentObjectType`プロパティが`DocumentObjectType.Picture`であるかを判定します。その後、該当する画像オブジェクトを`DocPicture`にキャストし、`DocPicture.LoadImage()`メソッドを使用して新しい画像に置換できます。新しい画像は元の画像の位置や回り込みスタイルを維持し、サイズも調整可能です。

### 操作手順
1. 必要なモジュールをインポートする。
2. `Document`オブジェクトを作成し、`Document.LoadFromFile()`メソッドでWord文書を読み込む。
3. 文書内のセクション、セクション内の段落、段落内の子オブジェクトを順に走査し、`DocumentObjectType.Picture`であるものをリストに追加する。
4. `DocPicture.LoadImage()`メソッドで新しい画像に置換する。
5. `Document.SaveToFile()`メソッドで文書を保存する。
6. リソースを解放する。

**コード例：**
```python
from spire.doc import Document, DocumentObjectType, DocPicture

# Documentオブジェクトを作成します
doc = Document()

# Word文書を読み込みます
doc.LoadFromFile("output/AddPicToWord.docx")

# 画像を保存するリストを作成します
pictures = []

# 文書内のすべてのセクションを走査します
for i in range(doc.Sections.Count):
    sec = doc.Sections.get_Item(i)

    # 各セクション内のすべての段落を走査します
    for j in range(sec.Paragraphs.Count):
        para = sec.Paragraphs.get_Item(j)

        # 各段落内のすべての子オブジェクトを走査します
        for k in range(para.ChildObjects.Count):
            docObj = para.ChildObjects.get_Item(k)

            # 画像を検索し、リストに追加します
            if docObj.DocumentObjectType == DocumentObjectType.Picture:
                pictures.append(docObj)

# リスト内の最初の画像を新しい画像に置き換えます
picture = DocPicture(pictures[0])
width = picture.Width
height = picture.Height
picture.LoadImage("NewWord.png")

# 画像のサイズを変更せずに保持します
picture.Width = width
picture.Height = height

# 変更を保存します
doc.SaveToFile("output/ReplaceWordImage.docx")
doc.Close()
```

結果文書
![PythonでWord文書の画像を新しい画像に置換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6dbffb1d-3cbc-4415-9a78-7112b7af587a.png)

## PythonでWord文書の画像をテキストに置換する

画像をテキストに置き換えるには、まず画像オブジェクトを特定し、その位置に`Paragraph.ChildObjects.Insert(Index, TextRange)`メソッドを使用してテキストを挿入し、`Paragraph.ChildObjects.Remove()`メソッドで画像オブジェクトを削除します。

### 操作手順
1. 必要なモジュールをインポートする。
2. `Document`オブジェクトを作成し、`Document.LoadFromFile()`メソッドでWord文書を読み込む。
3. 文書内のセクション、セクション内の段落、段落内の子オブジェクトを順に走査し、`DocumentObjectType.Picture`であるものをリストに追加する。
4. `TextRange`オブジェクトを作成し、テキストとフォーマットを設定する。
5. `Paragraph.ChildObjects.IndexOf()`メソッドで画像の位置を取得する。
6. `Paragraph.ChildObjects.Insert()`メソッドで該当位置にテキストを挿入する。
7. `Paragraph.ChildObjects.Remove()`メソッドで画像オブジェクトを削除する。
8. `Document.SaveToFile()`メソッドで文書を保存する。
9. リソースを解放する。

**コード例：**
```python
from spire.doc import Document, DocumentObjectType, TextRange, Color

# Documentオブジェクトを作成します
doc = Document()

# Word文書を読み込みます
doc.LoadFromFile("output/AddPicToWord.docx")

# 文書内のすべてのセクションを走査します
for k in range(doc.Sections.Count):
    sec = doc.Sections.get_Item(k)

    # 各セクション内のすべての段落を走査します
    for m in range(sec.Paragraphs.Count):
        para = sec.Paragraphs.get_Item(m)

        # 画像を保存するリストを作成します
        pictures = []

        # 画像を検索し、リストに追加します
        for x in range(para.ChildObjects.Count):
            docObj = para.ChildObjects.get_Item(x)
            if docObj.DocumentObjectType == DocumentObjectType.Picture:
                pictures.append(docObj)

        # リスト内のすべての画像をテキストに置き換えます
        for pic in pictures:
            # 画像のインデックス位置を取得します
            index = para.ChildObjects.IndexOf(pic)

            # TextRangeオブジェクトを作成します
            textRange = TextRange(doc)
            textRange.Text = "Word Document "
            textRange.CharacterFormat.FontName = "Arial"
            textRange.CharacterFormat.FontSize = 20
            textRange.CharacterFormat.TextColor = Color.get_Red()

            # 段落内にテキストを挿入します
            para.ChildObjects.Insert(index, textRange)

            # 画像を削除します
            para.ChildObjects.Remove(pic)

# 変更を保存します
doc.SaveToFile("output/ReplaceWordImageWithText.docx")
doc.Close()
```

結果文書
![PythonでWord文書の画像をテキストに置換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/f3d9ebba-e229-44b1-8284-cad0cc1c3566.png)

## PythonでWord文書の画像を削除する

文書内の画像オブジェクトを特定した後、`Paragraph.ChildObjects.Remove()`メソッドを使用して直接削除できます。

### 操作手順
1. 必要なモジュールをインポートする。
2. `Document`オブジェクトを作成し、`Document.LoadFromFile()`メソッドでWord文書を読み込む。
3. 文書内のセクション、セクション内の段落、段落内の子オブジェクトを順に走査し、`DocumentObjectType.Picture`であるものをリストに追加する。
4. `Paragraph.ChildObjects.IndexOf()`メソッドで画像の位置を取得する。
5. `Paragraph.ChildObjects.Remove()`メソッドで画像オブジェクトを削除する。
6. `Document.SaveToFile()`メソッドで文書を保存する。
7. リソースを解放する。

**コード例：**
```python
from spire.doc import Document, DocumentObjectType

# Documentオブジェクトを作成します
doc = Document()

# Word文書を読み込みます
doc.LoadFromFile("output/AddPicToWord.docx")

# 文書内のすべてのセクションを走査します
for k in range(doc.Sections.Count):
    sec = doc.Sections.get_Item(k)

    # 各セクション内のすべての段落を走査します
    for m in range(sec.Paragraphs.Count):
        para = sec.Paragraphs.get_Item(m)

        # 画像を保存するリストを作成します
        pictures = []

        # 画像を検索し、リストに追加します
        for x in range(para.ChildObjects.Count):
            docObj = para.ChildObjects.get_Item(x)
            if docObj.DocumentObjectType == DocumentObjectType.Picture:
                pictures.append(docObj)

        # リスト内のすべての画像を削除します
        for pic in pictures:
            para.ChildObjects.Remove(pic)

# 変更を保存します
doc.SaveToFile("output/RemoveWordImage.docx")
doc.Close()
```

結果文書
![PythonでWord文書の画像を削除する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/20ed70eb-f733-434f-8ab1-427dbb46b8b8.png)

## まとめ

本記事では、Pythonを使用してWord文書に画像を追加、置換、削除する方法について、具体的な手順とコード例を紹介しました。この手法を活用することで、Word文書の画像を効率的に管理し、自動化による生産性向上を実現できます。