Pythonでレシート・請求書のPDFをExcelの表に変換する方法
PDF内の表を読み取り、Excelにまとめて書き出します
この記事は、「Pythonでできる日常の自動化6選」で紹介した④PDFの明細書をExcelの表に変換の詳しい作り方をまとめた記事です。
医療費控除の集計や、請求書・レシートの整理で、PDFの中身を1つずつExcelに手入力していませんか?Pythonのpdfplumberというライブラリを使えば、PDF内の表を読み取り、Excelの表としてまとめて書き出すことができます。
- 1
- 2
- 3
- 4
- 5
用意するもの
- Python本体
- コードを書くためのエディタ(VS Codeなど)
- pdfplumber(PDFの中身を読み取るライブラリ)
- openpyxl(Excelファイルを作成するライブラリ)
Pythonのインストール、コードを書くためのエディタ(VS Code)の準備、コードの書き方・実行方法がまだの方は、先に「Pythonを始める前に:インストールとエディタの準備」を済ませてから、この続きに進んでください。
ターミナルで以下のコマンドを実行し、2つのライブラリをまとめてインストールします。
pip install pdfplumber openpyxl
対応できるPDFを知っておく
PDFには、大きく分けて2つの種類があります。
| 種類 | この記事の方法で扱えるか |
|---|---|
| パソコンで作成されたPDF(請求書・明細書など、文字を選択・コピーできるもの) | ○ 扱える |
| 紙の書類をスキャン・撮影しただけの画像PDF(文字を選択できないもの) | × 扱えない(別途OCRが必要) |
お使いのPDFがどちらのタイプかは、PDFを開いて文字をドラッグして選択できるかどうかで確認できます。選択できない場合は、この記事の方法では表を読み取れません。
PDFの中身を確認してみる
まずは、PDFの中の文字情報をそのまま取得してみましょう。
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0] # 1ページ目
text = page.extract_text()
print(text)
実行すると、PDFの1ページ目に含まれる文字が、そのままテキストとして表示されます。
invoice.pdfの部分は、実際に読み込みたいPDFファイルの名前に書き換えてください。コードと同じフォルダにPDFを置いておくとスムーズです。
PDFから表を抜き出す
文字全体ではなく、罫線で区切られた表の部分だけを抜き出したい場合は、extract_tableを使います。
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
table = page.extract_table()
for row in table:
print(row)
実行すると、表の1行ずつがリストの形で表示されます。tableは「行のリストの中に、セルの値のリストが入っている」という二重のリスト構造になっています。
PDF内に罫線などの明確な表構造がない場合、extract_tableがうまく表を認識できず、Noneが返ってくることがあります。その場合は、前のステップのextract_textで文字を取得し、自分で行ごとに分割する方法に切り替える必要があります。
抜き出した表をExcelに書き出す
取得した表のデータを、openpyxlでそのままExcelファイルに書き出します。
import pdfplumber
import openpyxl
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
table = page.extract_table()
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "明細"
for row in table:
ws.append(row)
wb.save("invoice.xlsx")
print("Excelへの変換が完了しました")
実行すると、PDFの表と同じ内容のinvoice.xlsxが作成されます。ws.append(row)は、リストの中身を1行分のデータとしてそのままシートに追加してくれる書き方です。
複数のPDFをまとめて処理する
同じ形式のPDFが複数枚あるとき(月ごとの請求書や、複数のレシートなど)は、フォルダ内のすべてのPDFをまとめて1つのExcelにできます。
from pathlib import Path
import pdfplumber
import openpyxl
pdf_dir = Path("receipts") # PDFが入っているフォルダ
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "明細一覧"
for pdf_file in pdf_dir.glob("*.pdf"):
with pdfplumber.open(pdf_file) as pdf:
for page in pdf.pages:
table = page.extract_table()
if table:
for row in table:
ws.append(row)
wb.save("receipts_summary.xlsx")
print("すべてのPDFの変換が完了しました")
pdf_dir.glob("*.pdf")で、指定したフォルダ内のPDFファイルを1つずつ順番に処理しています。PDFが何ページあっても、すべてのページの表がまとめてreceipts_summary.xlsxに書き出されます。
うまくいかないときのトラブルシューティング
extract_table()がNoneを返してきます▼extract_text()で文字を取得し、行ごとに手動で分割する方法に切り替えてください。まとめ
pdfplumberとopenpyxlを使って、PDF内の表を読み取りExcelに変換する方法、複数のPDFをまとめて処理する方法を紹介しました。医療費控除の集計や請求書整理など、手入力が面倒な作業ほど自動化のメリットを実感しやすくなります。


コメント