PythonによるPDF添付ファイルの抽出、バッチ抽出、バッチ追加

PDF添付ファイルとは、PDFドキュメントに埋め込まれた画像、テーブル、音声、ビデオ、または他のドキュメントなどの別のファイルのことを指します。これらの添付ファイルは、PDFドキュメントと一緒に保存、転送、共有することができ、文書により豊かなコンテンツと機能を提供します。添付ファイルを追加することにより、関連するファイルや情報をまとめて管理および共有することができます。さらに、PDF添付ファイルは、文書内で外部リソースを参照するために使用され、より包括的な参考資料やサポート資料を提供します。ただし、大量のPDF添付ファイルを処理することは手間と時間がかかる場合があります。Pythonプログラムを活用することで、これらの添付ファイルを簡単に一括処理し、作業効率を大幅に向上させることができます。本記事では、**Pythonを使用してPDF添付ファイルを簡単に一括抽出および保存**、**PDFに添付ファイルを挿入**、および**PDFファイルから添付ファイルを削除**する方法について紹介します。

- **[Pythonを使用したPDF添付ファイルの一括抽出](#pythonを使用したpdf添付ファイルの一括抽出)**
- **[Pythonを使用したPDFへの簡単な添付ファイルの挿入](#pythonを使用したpdfへの簡単な添付ファイルの挿入)**
- **[Pythonを使用したPDF添付ファイルの一括削除](#pythonを使用したpdf添付ファイルの一括削除)**

本記事で紹介する方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)が必要です。公式ウェブサイトからダウンロードするか、PyPIを介してインストールすることができます：
```powershell
pip install Spire.PDF
```

## Pythonを使用したPDF添付ファイルの一括抽出
PDFドキュメントから添付ファイルを抽出するには、**PdfDocument.Attachments**プロパティと**PdfAttachment.Data.Save()**メソッドが主要な役割を果たします。PdfDocument.Attachmentsプロパティは、PDFドキュメント内のすべての添付ファイルを取得し、添付ファイルのコレクションを返します。一方、PdfAttachment.Data.Save()メソッドは指定された添付ファイルを指定されたフォルダに保存することができます。詳細な手順は以下の通りです：
1. 入力フォルダと出力フォルダのパスを指定します。
2. ".pdf"で終わるPDFファイルのリストを入力フォルダから取得します。
```python
pdfFiles = [f for f in os.listdir(inputFolder) if f.endswith(".pdf")]
```
3. 各PDFファイルをループします。
4. PdfDocumentクラスのオブジェクトを作成し、PdfDocument.LoadFromFile()を使用してPDFファイルを読み込みます。
```python
document = PdfDocument()
document.LoadFromFile(filePath)
```
5. PDFファイルの添付ファイルリストを取得します。
```python
attachments = document.Attachments
```
6. 添付ファイルリストが空であるかどうかを判断し、添付ファイルを保存するフォルダを作成します。
7. 添付ファイルリストをループし、添付ファイルオブジェクトを取得し、指定されたパスに添付ファイルを保存します。
```python
attachment = attachments.get_Item(i)
attachmentPath = os.path.join(outputFolderPath, attachment.FileName)
attachment.Data.Save(attachmentPath)
```
8. PDFファイルを閉じます。

**完全なコード例：**
```python
import os
from spire.pdf import *
from spire.pdf.common import *

# 指定入力フォルダと出力フォルダのパス
inputFolder = "文書/PDF"
outputFolder = "文書/添付ファイル"

# 入力フォルダ内の拡張子が".pdf"であるPDFファイルのリストを取得
pdfFiles = [f for f in os.listdir(inputFolder) if f.endswith(".pdf")]

# 各PDFファイルに対して処理を行う
for fileName in pdfFiles:
    # PDFファイルの完全パスを構築
    filePath = os.path.join(inputFolder, fileName)
    
    # PdfDocumentオブジェクトを作成し、PDFファイルを読み込む
    document = PdfDocument()
    document.LoadFromFile(filePath)
    
    # PDFファイルの添付ファイルリストを取得
    attachments = document.Attachments
    
    # 添付ファイルが存在する場合
    if attachments:
        # PDFファイル名（拡張子を除く）を取得
        fileNameWithoutExt = os.path.splitext(fileName)[0]
        # 出力フォルダのパスを構築
        outputFolderPath = os.path.join(outputFolder, fileNameWithoutExt)
        # 出力フォルダを作成
        os.makedirs(outputFolderPath, exist_ok=True)
        
        # 添付ファイルリストを処理する
        for i in range(attachments.Count):
            # 添付ファイルオブジェクトを取得
            attachment = attachments.get_Item(i)
            # 添付ファイルの保存パスを構築
            attachmentPath = os.path.join(outputFolderPath, attachment.FileName)
            # 指定されたパスに添付ファイルを保存する
            attachment.Data.Save(attachmentPath)
            
    # PDFドキュメントを閉じる
    document.Close()
```

**添付ファイルを抽出するためのPDFファイル：**

![PythonでPDF添付ファイルを抽出](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/26c4cff7-a1be-234d-5ed9-927f7d6f85a0.png)

**抽出結果：**
![PythonでPDF添付ファイルを抽出](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9034b7fc-3c4c-b2f6-45fc-e316937ab2bd.png)

## Pythonを使用したPDFへの簡単な添付ファイルの挿入
**PdfAttachment**クラスのインスタンスを作成することで、PDF添付ファイルを作成し、説明や変更日などの関連情報を設定することができます。添付ファイルを作成した後は、**PdfDocument.Attachments.Add()** メソッドを使用して添付ファイルをPDFファイルに追加することができます。添付ファイルはPDF注釈と組み合わせることもでき、ページから指定の添付ファイルにジャンプすることができます。以下は添付ファイルを追加する簡単な手順の例です：
1. PdfDocumentクラスのオブジェクトを作成し、PDFドキュメントを読み込みます。
```python
document = PdfDocument()
document.LoadFromFile(pdfPath)
```
2. PdfAttachmentクラスのオブジェクトを作成し、添付ファイルの説明や変更日を設定します。
```python
attachment = PdfAttachment(attachmentPath)
attachment.Description = "参加者名簿"
attachment.ModificationDate = DateTime.get_Now()
```
3. 添付ファイルをPDFファイルに追加します。
```python
document.Attachments.Add(attachment)
```
4. PDFファイルを保存して閉じます。
```python
document.SaveToFile("output/添付ファイルの追加.pdf")
document.Close()
```

**完全なコード例：**
```python
from spire.pdf import *
from spire.pdf.common import *

# PDFファイルのパスと添付ファイルのパスを定義
pdfPath = "文書/例5.pdf"
attachmentPath = "示例/名簿.txt"

# PdfDocumentオブジェクトを作成し、PDFファイルを読み込む
document = PdfDocument()
document.LoadFromFile(pdfPath)

# PdfAttachmentオブジェクトを作成
attachment = PdfAttachment(attachmentPath)

# 添付ファイルの説明と変更日付を設定
attachment.Description = "参加者名簿"
attachment.ModificationDate = DateTime.get_Now()

# PDF文書に添付ファイルを追加
document.Attachments.Add(attachment)

# PDF文書を指定のパスに保存
document.SaveToFile("output/添付ファイルの追加.pdf")

# PDF文書を閉じる
document.Close()
```

**追加効果：**
![PythonでPDFファイルに添付ファイルを追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/14961b48-e804-ce0e-267d-0b543a5a5ea7.png)

## Pythonを使用したPDF添付ファイルの一括削除
PDFファイルから添付ファイルを削除する場合、PdfDocument.Attachmentsプロパティを使用してPDFファイル内の添付ファイルのコレクションを取得し、指定された添付ファイルまたはすべての添付ファイルを削除します。以下は操作手順です：
1. PdfDocumentクラスのオブジェクトを作成し、PDFドキュメントを読み込みます。
```python
document = PdfDocument()
document.LoadFromFile(pdfPath)
```
2. PDFファイルから添付ファイルのコレクションを取得します。
```python
document.Attachments
```
3. 指定された添付ファイルを削除します。
```python
attachments.RemoveAt(0)
```
4. または、すべての添付ファイルを削除します。
```python
attachments.Clear()
```
5. PDFファイルを保存して閉じます。
```python
document.SaveToFile("output/删除附件.pdf")
document.Close()
```

**完全なコード例：**
```python
from spire.pdf import *
from spire.pdf.common import *

# PDFファイルのパスを定義
pdfPath = "文書/例5.pdf"

# PdfDocumentオブジェクトを作成し、PDFファイルを読み込む
document = PdfDocument()
document.LoadFromFile(pdfPath)

# PDFファイルの添付ファイルコレクションを取得
attachments = document.Attachments

# 指定された添付ファイルを削除
attachments.RemoveAt(0)

# すべての添付ファイルを削除
attachments.Clear()

# PDFファイルを保存して閉じる
document.SaveToFile("output/添付ファイル削除済み.pdf")
document.Close()
```

上記は、Pythonを使用してPDFファイルに添付ファイルを追加、抽出、および削除する方法についての説明です。Spire.PDF for Pythonは、さまざまな他の機能もサポートしていますので、詳細は[Spire.PDF for Pythonチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Spire.PDF-for-Python-Program-Guide-Content.html)をご覧ください。