チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

チュートリアル»Python»Spire.PDF for Python»»PythonでPDFから表を抽出する方法 – 簡単テーブル解析ガイド
2025-10-24

PythonでPDFから表を抽出する方法 – 簡単テーブル解析ガイド

PythonでPDFから表を抽出するチュートリアル

PythonでPDFから表を抽出するには、通常、行と列で構成された視覚的レイアウトを理解する必要があります。多くのPDF表はセル境界を使用して定義されており、プログラム的に検出しやすくなっています。そのような場合、単にテキストを読み取るのではなく、レイアウト情報を解析できるライブラリを使うことが、正確なPDF表の抽出には不可欠です。

このチュートリアルでは、OCRや機械学習を使用せずにPythonでPDFから表を抽出する信頼性の高い方法を解説します。PDFに格子状の表がある場合でも複雑なレイアウトでも、表データをExcelやpandas DataFrameなどの構造化形式に変換する手順を学べます。

目次

PythonでPDFから表を抽出する準備

ExcelやCSVファイルとは異なり、PDFは表を構造化データとして保持していません。PythonでPDFから表を抽出するには、レイアウトを解析して表構造を検出できるライブラリが必要です。

Spire.PDF for Pythonは、ページごとに表を抽出するための組み込みメソッドを提供しており、明確にフォーマットされた表との相性が良く、PDFの内容をExcelやCSVなどの扱いやすいデータ形式に変換できます。

ライブラリのインストール方法:

pip install Spire.PDF

小規模なPDF表抽出には無料版も利用可能です:

pip install spire.pdf.free

PDFから表を抽出する手順

PythonでPDFから表を抽出するには、まず文書を読み込み、各ページを個別に解析します。Spire.PDF for Pythonを使えば、レイアウト構造に基づいて表を検出し、プログラムで抽出できます。複数ページのPDFにも対応可能です。

PDFを読み込み表を抽出する

以下は、PythonでPDFから表を読み取る基本例です。Spire.PDFを使い、文書の各ページから表を抽出します。プログラムで表データを扱いたい開発者に最適です。

from spire.pdf import PdfDocument, PdfTableExtractor

# PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

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

# 各ページの表を抽出
for i in range(pdf.Pages.Count):
    tables = table_extractor.ExtractTable(i)
    for table_index, table in enumerate(tables):
        print(f"Page {i + 1} の Table {table_index + 1}:")
        for row in range(table.GetRowCount()):
            row_data = []
            for col in range(table.GetColumnCount()):
                text = table.GetText(row, col).replace("\n", " ")
                row_data.append(text.strip())
            print("\t".join(row_data))

この方法は、境界線のある表に対して信頼性があります。ただし、境界線のない表や複数行セル、未マークのヘッダーを含む表では、抽出が正確に行えない場合があります。

抽出結果の例:

PythonとSpire.PDFでPDF表を抽出した結果

表をExcelやCSVにエクスポート

抽出したPDF表を分析や保存したい場合、PythonでExcelやCSVに変換できます。この例ではSpire.XLS for Pythonを使い、各表をスプレッドシートに出力します。

pipでのインストール:

pip install spire.xls

PDF表をExcel/CSVに出力するコード例

from spire.pdf import PdfDocument, PdfTableExtractor
from spire.xls import Workbook, FileFormat

# PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

# 抽出器とExcelワークブックを設定
extractor = PdfTableExtractor(pdf)
workbook = Workbook()
workbook.Worksheets.Clear()

# ページごとに表を抽出
for page_index in range(pdf.Pages.Count):
    tables = extractor.ExtractTable(page_index)
    for t_index, table in enumerate(tables):
        sheet = workbook.Worksheets.Add(f"Page{page_index+1}_Table{t_index+1}")
        for row in range(table.GetRowCount()):
            for col in range(table.GetColumnCount()):
                text = table.GetText(row, col).replace("\n", " ").strip()
                sheet.Range.get_Item(row + 1, col + 1).Value = text
                sheet.AutoFitColumn(col + 1)

# すべての表を1つのExcelファイルに保存
workbook.SaveToFile("output/Sample.xlsx", FileFormat.Version2016)

下記のように、抽出したPDFの表はSpire.XLS for Pythonを使用してExcelやCSVに変換されます。

PythonでPDF表をExcelに変換した結果

PDF表抽出精度向上のヒント

複雑なレイアウトや改ページ、フォーマットの不一致により、PDFからの表抽出は完全でない場合があります。Pythonでより正確な結果を得るための実用的な方法を紹介します。

1. 複数ページにまたがる表の結合

Spire.PDFはページ単位で表を抽出します。表が複数ページにまたがる場合、行を結合して対応できます。

# 表を抽出して結合
combined_rows = []
for i in range(start_page, end_page + 1):
    tables = table_extractor.ExtractTable(i)
    if tables:
        table = tables[0]  # ページごとに1つの表を想定
        for row in range(table.GetRowCount()):
            cells = [table.GetText(row, col).strip().replace("\n", " ") for col in range(table.GetColumnCount())]
            combined_rows.append(cells)

結合後、ExcelやCSVに変換して分析できます。

2. 空行・無効行の除外

表には空行や空列が含まれることがあります。抽出前にフィルタリングすると精度が向上します。

# 空行を除外
filtered_rows = []
for row in range(table.GetRowCount()):
    row_data = [table.GetText(row, col).strip().replace("\n", " ") for col in range(table.GetColumnCount())]
    if any(cell for cell in row_data):
        filtered_rows.append(row_data)

# 空列を除外
transposed = list(zip(*filtered_rows))
filtered_columns = [col for col in transposed if any(cell.strip() for cell in col)]
filtered_data = list(zip(*filtered_columns))

これにより、雑多なレイアウトでもより正確な表抽出が可能です。

よくある質問 (FAQ)

Q: PDFからテキストと表の両方を抽出できますか?

はい、PdfTextExtractorでページ全体のテキストを取得し、PdfTableExtractorで構造化された表を抽出できます。

Q: 表が検出されません

PDFがテキストベース(スキャン画像ではない)であり、行列形式のレイアウトになっていることを確認してください。Spire.PDF for Pythonは境界線付き表のみを検出します。境界線のない表は認識されない場合があります。

画像ベースPDFの場合、Spire.OCR for Pythonを使用して表データを抽出できます。詳細は「Pythonで画像からテキストを抽出する方法」を参照してください。

Q: 境界線のない表を抽出するには?

Spire.PDFでは境界線のない表の抽出は難しい場合があります。以下の方法を検討してください:

  • PdfTextExtractorでテキストを抽出し、行列を特定するカスタムロジックを作成
  • 大規模言語モデルAPI(例: GPT)で抽出したテキストから構造を解析し、表データを取得
  • 元PDFに表の境界線を追加してから生成することで抽出しやすくする

Q: 抽出した表をpandas DataFrameに変換するには?

Spire.PDFには直接DataFrame出力はありませんが、セル値をリストのリストに格納してから変換可能です。

import pandas as pd
df = pd.DataFrame(table_data)

これにより、PythonでPDF表をDataFrameに変換して分析できます。

Q: Spire.PDF for Pythonは無料で使えますか?

はい、以下の2つのオプションがあります:

  • Free Spire.PDF for Python – 機能制限ありの永続無料版(ページ数制限など)。pipでインストール可能。公式ページ
  • 一時的無料ライセンス – 商用版の全機能を評価や社内利用で試せます。申請ページ

まとめ

構造化されたレポートや財務データ、標準フォームなど、PythonでPDF表を抽出すると作業効率が大幅に向上します。Spire.PDF for Pythonのようなレイアウト認識型パーサを使えば、OCRや手動調整なしで表を正確に検出・抽出可能です。Excel、CSV、DataFrameに変換すれば、自動化やデータ分析にすぐ活用できます。

総じて、Spire.PDFを使ったPythonによるPDF表抽出は、ExcelやCSVなどの構造化形式への変換を通じて、分析や自動処理に非常に便利です。

Read 21 times