【Python】PDFからテーブルデータを抽出する方法|tabulaとcamelotの使い分け

【Python】PDFからテーブルデータを抽出する方法|tabulaとcamelotの使い分け Python

帳票やレポートなど、PDFに表形式のデータが埋め込まれているケースは多く見られます。これらをCSVやExcelとしてデータ化することで、二次利用や分析が可能になります。

Pythonでは「tabula」と「camelot」という2つのライブラリが主に使われますが、特性や精度に違いがあります。

この記事では、それぞれの使い方と得意・不得意な場面を比較しながら、PDFから表データを抽出する方法を紹介します。

準備:Javaのインストール(tabula用)

tabula-pyはJavaベースのTabulaをPythonから操作するため、事前にJavaが必要です。

tabulaのインストールと使い方

pip install tabula-py
import tabula

# PDFからすべてのテーブルを抽出
dfs = tabula.read_pdf("sample.pdf", pages="all", multiple_tables=True)

# 結果を確認・保存
for i, df in enumerate(dfs):
    df.to_csv(f"table_tabula_{i+1}.csv", index=False)

特徴:

  • Javaベースで安定性が高い
  • 表の罫線が明確にある場合は非常に高精度
  • 日本語のPDFにも強い

camelotのインストールと使い方

camelotはPythonネイティブで動作するOCR不要のPDFテーブル抽出ライブラリです。

pip install "camelot-py[cv]"
import camelot

# 1ページ目からテーブルを抽出(stream or lattice モードを選択)
tables = camelot.read_pdf("sample.pdf", pages="1", flavor="lattice")

# CSVとして保存
tables.export("tables_camelot.csv", f="csv", compress=False)

特徴:

  • Pythonのみで動作(Java不要)
  • 表の罫線がない場合は「stream」モードで抽出可能
  • 細かなパラメータ調整で柔軟性あり

tabulaとcamelotの比較

項目 tabula camelot
必要環境 Java必須 Python + OpenCV
精度(罫線あり)
精度(罫線なし) ◎(streamモード)
日本語対応 △(フォントによる)
処理速度 やや遅い 高速

応用:複数ページから一括抽出

# tabula
dfs = tabula.read_pdf("report.pdf", pages="1-5", multiple_tables=True)

# camelot
tables = camelot.read_pdf("report.pdf", pages="1-5", flavor="stream")

まとめ

PDFに含まれる表データは、tabulacamelotを使うことで高精度に抽出できます。罫線の有無や日本語の扱い、実行環境などに応じて使い分けることで、効率よく業務データをCSVやExcelとして整形可能です。

両方試して結果を比較し、案件に応じて最適な手法を選択するのがおすすめです。