帳票やレポートなど、PDFに表形式のデータが埋め込まれているケースは多く見られます。これらをCSVやExcelとしてデータ化することで、二次利用や分析が可能になります。
Pythonでは「tabula」と「camelot」という2つのライブラリが主に使われますが、特性や精度に違いがあります。
この記事では、それぞれの使い方と得意・不得意な場面を比較しながら、PDFから表データを抽出する方法を紹介します。
準備:Javaのインストール(tabula用)
tabula-pyはJavaベースのTabulaをPythonから操作するため、事前にJavaが必要です。
- Javaのインストール:https://www.java.com/ja/
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に含まれる表データは、tabulaとcamelotを使うことで高精度に抽出できます。罫線の有無や日本語の扱い、実行環境などに応じて使い分けることで、効率よく業務データをCSVやExcelとして整形可能です。
両方試して結果を比較し、案件に応じて最適な手法を選択するのがおすすめです。