【Python業務効率化】PDF自動処理マスター講座 第2回 PDFから文字・表データを抽出するテクニック

Python自動化

※本記事には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に自動出力し、レポートを自動作成する方法」について解説していきますので、お楽しみに!

PR

\ 初心者から未経験でプロを目指す /

Pythonプログラミング マンツーマン詳細はこちら >

Photo by Gabriel Heinzer on Unsplash

タイトルとURLをコピーしました