Pythonを使用してPDFファイルからテーブルをバッチ抽出する方法

PDFドキュメントには通常、公式レポート、学術論文、財務報告書などの文書に多くのデータが含まれています。これらの文書には、構造化されたテーブルデータがしばしば含まれています。テーブルは、重要な情報を保持するためのキャリアとして機能し、データ分析、研究論証、ビジネスの意思決定において重要な意味を持ちます。しかし、PDF形式は文書のクロスプラットフォームの一貫性を保証している一方で、データの直接的な抽出と利用には障壁があります。Pythonを使用してPDFドキュメントから効率的にテーブルを抽出する方法を習得することで、データ処理能力や情報フローの加速能力を向上させることができます。本記事では、**Pythonを使用してPDFドキュメントからテーブルデータを迅速に抽出し**、**Excelファイルに保存する方法**について説明します。

- **[Pythonを使用してPDFドキュメントからテーブルデータを抽出する方法](#pythonを使用してpdfドキュメントからテーブルデータを抽出する方法)**
- **[PDFドキュメントからテーブルを抽出してExcelファイルに保存する方法](#pdfPDFドキュメントからテーブルを抽出してexcelファイルに保存する方法)**

この記事で使用する方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)が必要です。PyPIを介してインストールすることができます：`pip install Spire.PDF`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## PDFドキュメントからテーブルデータを抽出する
`PdfTableExtractor(PdfDocument)`クラスは、PDFドキュメントのテーブル抽出作業に使用できます。このクラスのインスタンスを作成した後、`PdfTableExtractor.ExtractTable(int: page index)`メソッドを使用して指定されたページのすべてのテーブルを抽出することができます。テーブルを取得した後、`PdfTable.GetText(int: row index, int column index)`メソッドを使用してテーブルデータを他の場所に保存することができます。
以下は、PDFのテーブルを抽出してテキストに保存する手順です：
1. 必要なモジュールをインポートします。
2. `PdfDocument`のインスタンスを作成し、`PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントをロードします。
3. テーブルデータを保存するためのリストを作成し、ドキュメントから`PdfTableExtractor`のインスタンスを作成します。
4. ドキュメントのページを反復処理し、`PdfTableExtractor.ExtractTable(int: page index)`メソッドを使用してページ上のテーブルを抽出します。
5. 抽出された各テーブルを反復処理し、各テーブルに対して文字列オブジェクトを作成し、`PdfTable.GetText(int: row index, int column index)`メソッドを使用してテーブルデータを取得し、文字列に追加します。
6. 各テーブルをテキストファイルとして保存します。
7. リソースを解放します。

**コード例**
```python
from spire.pdf import *
from spire.pdf.common import *

# PdfDocumentクラスのインスタンスを作成します
pdf = PdfDocument()

# PDFファイルを読み込みます
pdf.LoadFromFile("サンプル.pdf")

# リストを作成します
table_data_list = []

# PdfTableExtractorオブジェクトを作成します
extractor = PdfTableExtractor(pdf)

# ドキュメントの各ページを処理します
for pageIndex in range(pdf.Pages.Count):
    # ページからテーブルを抽出します
    table_list = extractor.ExtractTable(pageIndex)

    # テーブルリストが空でないか確認します
    if table_list is not None and len(table_list) > 0:
        # リスト内の各テーブルに対して処理を行います
        for table in table_list:
            table_data = ''
            # 行数と列数を取得します
            row = table.GetRowCount()
            column = table.GetColumnCount()

            # テーブルの行と列を処理します
            for i in range(row):
                for j in range(column):
                    # セルからテキストを取得します
                    text = table.GetText(i, j)

                    # テキストをリストに追加します
                    table_data += text + " "
                table_data += "\n"
            table_data_list.append(table_data)

# 各テーブルをtxtファイルとして保存します
for i in range(len(table_data_list)):
    file_name = "output/Tables/ExtractedPDFTables{0}.txt".format(i)
    with open(file_name, "w") as f:
        f.writelines(table_data_list[i])

# リソースを解放します
pdf.Close()
```

**サンプルファイル**
![2024-05-27_102539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6b11139c-9e50-017f-baf3-4234fca25b1b.png)

**抽出されたテーブル**
![2024-05-27_102922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2c9e2304-8c85-80d3-f374-d18d88af5a88.png)
![2024-05-27_103005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7bf7d46c-c815-1c4d-be23-913f836506c8.png)

## PDFドキュメントからテーブルを抽出し、CSVファイルに保存する
テーブルデータを抽出する際に、[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)ライブラリ（`pip install Spire.XLS`）を組み合わせて、テーブルデータを直接Excelファイルに書き込むことができます。以下は手順です：
1. 必要なモジュールをインポートします。
2. `PdfDocument`クラスのインスタンスを作成します。
3. `PdfDocument.LoadFromFile()`メソッドを使用してサンプルPDFドキュメントをロードします。
4. `Workbook`クラスのインスタンスを作成し、デフォルトのワークシートをクリアします。
5. PDFドキュメントのページを反復処理します。
6. `PdfTableExtractor.ExtractTable()`メソッドを使用してテーブルをページから抽出します。
7. 抽出したテーブルを反復処理します。
8. 各テーブルに対して、`Workbook.Worksheets.Add()`メソッドを使用してワークブックにワークシートを追加します。
9. `PdfTable.GetText()`メソッドを使用してセルのテキストを取得します。
10. `Worksheet.Range[rowIndex, columnIndex].Value`プロパティを使用してテキストを特定のセルに書き込みます。
11. `Workbook.SaveToFile()`メソッドを使用して結果のワークブックをExcelファイルとして保存します。
12. リソースを解放します。

**コード例**
```python
from spire.pdf import *
from spire.xls import *

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

# サンプルPDFファイルを読み込みます
doc.LoadFromFile("サンプル.pdf")

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

# デフォルトのワークシートをクリアします
workbook.Worksheets.Clear()

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

sheetNumber = 1

# ページをループします
for pageIndex in range(doc.Pages.Count):
    # 特定のページからテーブルを抽出します
    tableList = extractor.ExtractTable(pageIndex)

    # テーブルリストが空でないか確認します
    if tableList is not None and len(tableList) > 0:
        # リスト内の各テーブルに対して処理を行います
        for table in tableList:
            # ワークシートを追加します
            sheet = workbook.Worksheets.Add(f"sheet{sheetNumber}")

            # テーブルの行数と列数を取得します
            row = table.GetRowCount()
            column = table.GetColumnCount()

            # 行と列を処理します
            for i in range(row):
                for j in range(column):
                    # 特定のセルからテキストを取得します
                    text = table.GetText(i, j)

                    # テキストを指定のセルに書き込みます
                    sheet.Range[i + 1, j + 1].Value = text

            # 列幅を自動調整します
            sheet.AllocatedRange.AutoFitColumns()

            sheetNumber += 1

# ファイルに保存します
workbook.SaveToFile("output/Tables/PDFテーブルをExcelファイルに保存.xlsx", ExcelVersion.Version2013)
doc.Dispose()
workbook.Dispose()
```

**抽出されたテーブル**
![2024-05-27_103345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/cdbe4ecb-e79a-7b4a-4637-bdf0433619c2.png)

本記事では、Pythonを使用してPDFドキュメントからテーブルデータを抽出し、テキストファイルまたはExcelファイルに保存する方法を示しました。

より詳しいPDFドキュメントの操作技術については、[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)をご覧ください。