※本記事にはPR(アフィリエイト広告)が含まれています。
はじめに
こんにちは!「Python業務効率化」PDF自動処理マスター講座」第2回へようこそ。前回の第1回では、PDFファイルをPythonで扱うための基礎知識や環境構築について学びました。今回はいよいよ実践編として、PDFから文字データや表データを自動で抽出するテクニックを詳しく解説していきます。
請求書や報告書、各種帳票など、業務で扱うPDFファイルから必要な情報を手作業でコピー&ペーストしていませんか?この記事を読めば、その作業をPythonで自動化できるようになります。初心者の方にも理解しやすいよう、コード例を交えながら丁寧に解説していきますので、ぜひ最後までお付き合いください。
PDF処理に使う代表的なPythonライブラリ
PDFからデータを抽出するためには、専用のライブラリを使用します。まずは代表的なライブラリの特徴を押さえておきましょう。
pdfplumber:テキストと表の抽出に強い
pdfplumberは、PDFのレイアウトを保持したままテキストを抽出できるほか、表データの抽出機能も充実しているライブラリです。初心者にも扱いやすく、本記事でもメインで使用していきます。
pip install pdfplumber
PyPDF2(pypdf):シンプルな操作が魅力
PDFの結合・分割・回転などの操作が得意なライブラリです。テキスト抽出も可能ですが、複雑なレイアウトの場合は精度が落ちることがあります。
tabula-py:表抽出に特化
Javaベースのツール「tabula」をPythonから利用できるライブラリです。表形式のデータ抽出に強みがありますが、事前にJavaの実行環境が必要になる点に注意しましょう。
今回は、導入のしやすさと機能のバランスが良いpdfplumberを中心に解説を進めます。
PDFからテキストデータを抽出する
まずは基本となるテキスト抽出の方法を見ていきましょう。
基本的なテキスト抽出コード
以下のコードは、PDFファイルを開いて全ページのテキストを抽出するシンプルな例です。
import pdfplumber
with pdfplumber.open("sample.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
extract_text()メソッドを使うことで、ページ内のテキストを文字列として取得できます。改行やレイアウトもある程度自然な形で再現されるのが特徴です。
特定のページだけ抽出したい場合
全ページではなく、特定のページだけを処理したい場合は、インデックスを指定します。
with pdfplumber.open("sample.pdf") as pdf:
first_page = pdf.pages[0]
text = first_page.extract_text()
print(text)
業務では「1ページ目だけ必要な情報がある」というケースも多いので、覚えておくと便利です。
PDFから表データを抽出する
続いて、本講座の核心ともいえる表データの抽出方法を解説します。
extract_tables()で表を抽出
pdfplumberには、表データを自動検出して抽出するextract_tables()メソッドが用意されています。
import pdfplumber
with pdfplumber.open("sample.pdf") as pdf:
page = pdf.pages[0]
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
このコードを実行すると、表の各行がリスト形式で出力されます。セルの区切りが自動で認識されるため、手作業でのデータ整形の手間が大幅に削減できます。
抽出した表データをPandasで扱いやすく整形
抽出したデータはそのままだとリストの入れ子構造になっているため、分析や保存をしやすいようにpandasのDataFrameに変換するのがおすすめです。
import pdfplumber
import pandas as pd
with pdfplumber.open("sample.pdf") as pdf:
page = pdf.pages[0]
table = page.extract_tables()[0]
df = pd.DataFrame(table[1:], columns=table[0])
print(df)
ここでは、表の1行目をヘッダー(列名)として扱い、2行目以降をデータとしてDataFrame化しています。CSVやExcelへの出力も簡単に行えるようになります。
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
実践で役立つ応用テクニック
基本をマスターしたら、実務でさらに活用できる応用テクニックも押さえておきましょう。
複数のPDFファイルをまとめて処理する
業務では1つのPDFだけでなく、複数のファイルをまとめて処理したい場面が多くあります。globモジュールと組み合わせることで、フォルダ内の全PDFを一括処理できます。
import glob
import pdfplumber
import pandas as pd
all_data = []
for file_path in glob.glob("pdf_folder/*.pdf"):
with pdfplumber.open(file_path) as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
df = pd.DataFrame(table[1:], columns=table[0])
all_data.append(df)
merged_df = pd.concat(all_data, ignore_index=True)
merged_df.to_csv("merged_output.csv", index=False, encoding="utf-8-sig")
表がうまく抽出できない場合の対処法
PDFのレイアウトによっては、表が正しく認識されないことがあります。その場合は、extract_tables()に抽出設定(table_settings)を渡すことで精度を調整できます。
table_settings = {
"vertical_strategy": "lines",
"horizontal_strategy": "lines"
}
tables = page.extract_tables(table_settings)
罫線の種類や間隔によって最適な設定が異なるため、実際のPDFを見ながら調整してみてください。
まとめ
今回は、Pythonのpdfplumberを使って、PDFからテキストデータと表データを抽出する方法を解説しました。
- テキスト抽出には
extract_text()を使用する - 表データの抽出には
extract_tables()を使用する - 抽出したデータはPandasのDataFrameに変換すると扱いやすい
- 複数ファイルの一括処理にはglobモジュールが便利
これらのテクニックをマスターすれば、これまで手作業で行っていたPDFからのデータ転記作業を大幅に自動化できます。次回、第3回では「抽出したデータをExcelに自動出力し、レポートを自動作成する方法」について解説していきますので、お楽しみに!
Photo by Gabriel Heinzer on Unsplash

