PythonでPDFをExcelファイルに変換する方法

PDFドキュメントをExcelファイルに変換することで、静的な形式に制限されていたデータの潜在力を解放し、その後のデータ分析、共有、およびレポート生成などの作業効率が大幅に向上します。変換されたExcelシートでは、データの操作がより柔軟になり、迅速なフィルタリング、計算、グラフ作成などの機能がサポートされ、手動入力や整理に多大な時間がかかる可能性がある情報が簡単に管理・活用できるようになります。この記事では、**Pythonを使用してPDFドキュメントをExcelファイルに変換し**、効率的にデータを活用する方法を紹介します。

---

- **[PDFドキュメントを直接Excelファイルに変換する](#pdfドキュメントを直接excelファイルに変換する)**
- **[PDFの表データを抽出し、Excelワークシートに書き込む](#pdfの表データを抽出しexcelワークシートに書き込む)**

---

この記事で使用する方法には、[Spire.PDF for Python](https://jp.e-iceblue.com/introduce/spire-pdf-for-python.html)が必要です。PyPI：`pip install spire.pdf`。

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

## PDFドキュメントを直接Excelファイルに変換する
ライブラリで提供されている`PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントを読み込み、`PdfDocument.SaveFromFile(string filename, FileFormat.XLSX)`メソッドを使用してドキュメントをExcelファイルに変換できます。また、`XlsxLineLayoutOptions`を使用して変換オプションを設定することも可能です。以下はパラメータ情報です：
| パラメータ            | 説明                                      |
|-----------------------|-------------------------------------------|
| convertToMultipleSheet (bool) | 各ページを異なるワークシートに変換する；Falseの場合は最初のページのみ変換 |
| rotatedText (bool)          | 回転したテキストを表示する                     |
| splitCell (bool)            | PDFの複数行テキストを複数のセルに分割する       |
| wrapText (bool)             | セル内のテキストを自動で折り返す                 |
| overlapText (bool)          | 重なったテキストを表示する                     |

以下は操作手順の詳細です：
1. 必要なモジュールをインポートします。
2. `PdfDocument`オブジェクトを作成し、`PdfDocument.LoadFromFile()`メソッドでPDFドキュメントを読み込みます。
3. `XlsxLineLayoutOptions`オブジェクトを作成し、変換オプションを指定します。
4. `PdfDocument.ConvertOptions.SetPdfToXlsxOptions()`メソッドを使用して変換オプションを適用します。
5. `PdfDocument.SaveFromFile(string filename, FileFormat.XLSX)`メソッドを使用して、ドキュメントをExcelファイルに変換し、保存します。
6. リソースを解放します。

**コードサンプル**
```python
from spire.pdf import *

# PdfDocumentのインスタンスを作成
pdf = PdfDocument()

# PDFドキュメントをロード
pdf.LoadFromFile("Sample.pdf")

# XlsxLineLayoutOptionsのインスタンスを作成
options = XlsxLineLayoutOptions(True, False, False, True)

# 変換オプションを適用
pdf.ConvertOptions.SetPdfToXlsxOptions(options)

# PDFドキュメントをXLSXファイルに変換
pdf.SaveToFile("output/PDFToExcel.xlsx", FileFormat.XLSX)

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

変換結果
![PDFドキュメントを直接Excelファイルに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3f6cc60e-7e4e-bf2a-266e-54ef3c1364d7.png)

## PDFの表データを抽出し、Excelワークシートに書き込む
より正確なデータ抽出を実現し、フォーマットの影響を排除したい場合は、PDFドキュメントからすべての表データを直接抽出してExcelワークシートに書き込むことも可能です。`PdfTableExtractor`クラスはPDFドキュメント内の表データを抽出するのに役立ち、Spire.XLS for Pythonを使用して、抽出されたデータをExcelワークシートに書き込むことができます。Spire.XLS for PythonはPyPIからインストール可能です：`pip install spire.xls`。
以下は操作手順の詳細です：
1. 必要なモジュールをインポートします。
2. `PdfDocument`オブジェクトを作成し、`PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントを読み込みます。
3. `Workbook`オブジェクトを作成し、`Workbook.Worksheets.Clear()`メソッドを使用して既定のワークシートをクリアします。
4. 読み込んだPDFドキュメントに対して`PdfTableExtractor`オブジェクトを作成します。
5. `PdfTableExtractor.ExtractTable()`メソッドを使用して、ドキュメント内の各ページの表を抽出します。
6. 各表を反復処理します
    - `Workbook.Worksheets.Add()`メソッドを使用して、各表に対応するワークシートをブック内に追加します。
    - `Table.GetText()`メソッドを使用して、各行および列を反復処理し、セルの値を取得し、`Worksheet.Range[].Text`プロパティを使用して、対応する位置に挿入します。
    - セルの書式を設定します。
7. `Workbook.SaveToFile()`メソッドを使用してブックを保存します。
8. リソースを解放します。

**コードサンプル**
```python
from spire.pdf import *
from spire.xls import *

# PdfDocumentオブジェクトを作成
pdf = PdfDocument()
# PDFドキュメントをロード
pdf.LoadFromFile("Sample.pdf")

# Workbookオブジェクトを作成
workbook = Workbook()
# デフォルトのワークシートをクリア
workbook.Worksheets.Clear()

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

# 各PDFページからテーブルを抽出
for pageIndex in range(pdf.Pages.Count):
    tables = extractor.ExtractTable(pageIndex)
    # テーブルが複数ある場合に繰り返し処理
    if tables is not None:
        for tableIndex in range(len(tables)):
            # テーブルを取得
            table = tables[tableIndex]
            # テーブル用のワークシートを作成
            sheet = workbook.Worksheets.Add(f"Page{pageIndex + 1}-Table{tableIndex + 1}")
            # テーブルの行と列を繰り返し処理
            for rowIndex in range(table.GetRowCount()):
                for colIndex in range(table.GetColumnCount()):
                    # セルの値を取得
                    text = table.GetText(rowIndex, colIndex)
                    cellText = text.replace("\n", "")
                    # セルの値をワークシートの対応するセルに書き込む
                    sheet.Range[rowIndex + 1, colIndex + 1].Text = cellText
            # ヘッダー行のスタイルを設定
            sheet.Rows.get_Item(0).Style.Font.FontName = "Yu Gothic UI"
            sheet.Rows.get_Item(0).Style.Font.Size = 12
            sheet.Rows.get_Item(0).Style.Font.IsBold = True
            sheet.Rows.get_Item(0).Style.HorizontalAlignment = HorizontalAlignType.Center
            # データ行のスタイルを設定
            for i in range(1, sheet.Rows.Count):
                sheet.Rows.get_Item(i).Style.Font.FontName = "Yu Gothic UI"
                sheet.Rows.get_Item(i).Style.Font.Size = 12
                sheet.Rows.get_Item(i).Style.HorizontalAlignment = HorizontalAlignType.Left
            # 列を自動調整
            for j in range(1, sheet.Columns.Count):
                sheet.AutoFitColumn(j)

# ワークブックを保存
workbook.SaveToFile("output/PDFTableToExcel.xlsx", FileFormat.Version2016)
workbook.Dispose()
pdf.Close()
```

抽出結果
![PDFの表データを抽出しExcelワークシートに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/e9fb3ef7-2b76-46d8-5588-5cb8423c8360.png)

> この記事では、Pythonを使用してPDFドキュメントをExcelファイルに変換する方法、および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)をご覧ください。