MAGAZINE
ルーターマガジン
決算書のPDF内部の表をAIに読み取らせてみた

はじめに
こんにちは、エンジニアのmiyakawaです。
ビッグデータとよく聞きますが、いまだに表に記載されているデータがPDFの中にあるということは珍しくありません。
PDF内に記載されている表が1つくらいなら手作業で抽出してもいいのですが、表が100、200となると手作業だけでは困難ですよね。
ですが今の時代、PDF内の表もAIが読み取ってくれるらしいです。
PDF内に記載されている表をAIが読み取り、読み取った内容を完全自動化でデータに変換できるなら、手作業が減り効率的なデータ集計が可能です。そこでPDF内の表をAIが読み取り、データに正確に変換してくれるか検証しました。
検証環境
ChatGPTとGeminiを利用し、PDFの表の内容をJSONに変換しています。
ChatGPTはGPT-5で、Geminiは2.5 Flashを使用しています。
検証内容
東京都 オープンデータカタログサイトにある、タイトル名「財政(決算)【東京都下水道局】」のPDFファイル「令和2年度決算書(東京都下水道事業会計)^1」を使用しました。
そのPDFの30-31ページの一般的な縦横が1対1の表と、24ページの縦方向にセル結合が存在する表をそれぞれChatGPTとGeminiに添付ファイルとして渡しています。その後以下のプロンプトでPDF内の表をJSON形式に変換しています。
▼使用したプロンプト
添付ファイルは表が記載されたPDFファイルになります。
このPDFファイルに記載された表題と表を読み取り、JSONに変換してください。
テキストはそのまま抽出するようにお願いします。
縦横が1対1の表のJSON変換結果
結果としてはChatGPTもGeminiも、ヘッダーに対応する数値を正確に取得できており、またページを跨いで読み取り全ての行をJSONに変換しています。一部のテキストに入っている特殊文字は読み取れてはいませんが、テキストもほとんどPDFの表のまま変換できています。
Geminiの場合は、ヘッダー内テキストである工期を正確に読み取れていなので、期待するヘッダーが出るまで実行する必要があります。
▼縦横が1対1の表がある最初のページ
▼縦横が1対1の表がある最終ページ
▼ChatGPTで表をJSONに変換した結果(最初のページの初めの行と、最終ページの最後の行のみ記録)
{
"表題": "Ⅳ 会 計 1 重要契約の要旨(金額は消費税及び地方消費税を含む)",
"表": [
{
"契約年月日": "2.4.1",
"契約件名": "王子ポンプ所発電設備再構築その2工事",
"契約金額(円)": "935,000,000",
"契約先": "メタウォーター株式会社",
"工期": "契約確定の日の翌日から510日間"
},
〜中略〜
{
"契約年月日": "3.3.12",
"契約件名": "篠崎ポンプ所発電機棟建設工事",
"契約金額(円)": "1,758,900,000",
"契約先": "株式会社渡辺組",
"工期": "契約確定の日の翌日から565日間"
}
]
}
▼Geminiで表をJSONに変換した結果(最初のページの初めと最後の行と、最終ページの初めと最後の行のみ記録)
{
"title": "IV会計 1 重要契約の要旨 (金額は消費税及び地方消費税を含む)",
"pages": [
{
"page_number": 1,
"table": {
"headers": [
"契約年月日",
"契約件名",
"契約金額(円)",
"契約先",
"期"
],
"rows": [
{
"契約年月日": "2. 4. 1",
"契約件名": "王子ポンプ所発電設備再構築その2工事",
"契約金額(円)": "935,000,000",
"契約先": "メタウォーター株式会社",
"期": "契約確定の日の翌日から510日間"
},
〜中略〜
{
"契約年月日": "2.11.13",
"契約件名": "清瀬水再生センター汚泥濃縮設備再構築 工事",
"契約金額(円)": "1,232,000,000",
"契約先": "月島機械株式会社",
"期": "契約確定の日の翌日から800日間"
}
]
}
},
{
"page_number": 2,
"table": {
"headers": [
"契約年月日",
"契約件名",
"契約金額(円)",
"契約先",
"期"
],
"rows": [
{
"契約年月日": "2.12.18",
"契約件名": "小菅水再生センターポンプ設備再構築そ の5工事",
"契約金額(円)": "1,266, 100,000",
"契約先": "株式会社クボタ",
"期": "契約確定の日の翌日から350日間"
},
〜中略〜
{
"契約年月日": "3.3.12",
"契約件名": "篠崎ポンプ所発電機棟建設工事",
"契約金額(円)": "1,758,900,000",
"契約先": "株式会社渡辺組",
"期": "契約確定の日の翌日から565日間"
}
]
}
}
]
}
縦方向にセル結合が存在する表の変換結果
ChatGPTもGeminiも縦方向のセル結合を判別できず、セル結合があるテキストをそれぞれの行に分解して読み取ってしまっているので、表から正しいテキストを取得できていません。
またChatGPTでは5列の表としてJSONへ変換していますが、Geminiは6列の表としてJSONへ変換しているので、表の読み取り方が異なるように見られます。
また追加でJSONに変換されている、同ページ内の2×2の表もChatGPTとGemini、どちらも存在しない列を作ってJSONに変換しています。
▼縦方向にセル結合が存在する表のページ
▼ChatGPTで表をJSONに変換した結果
{
"表題": "(4) 下水道使用件数",
"表": {
"列名": ["(A) 当年度末件数", "(B) 前年度末件数", "(C=A-B) 前年度末との比較増減", "(C÷B) 増減率"],
"単位": ["件", "件", "件", "%"],
"データ": [
{
"区分": "水道 一般",
"当年度末件数": "5,793,809",
"前年度末件数": "5,799,754",
"増減": "△ 5,945",
"増減率": "△ 0.1"
},
{
"区分": "汚水 公衆浴場",
"当年度末件数": "410",
"前年度末件数": "430",
"増減": "△ 20",
"増減率": "△ 4.7"
},
{
"区分": "水道 計",
"当年度末件数": "5,794,219",
"前年度末件数": "5,800,184",
"増減": "△ 5,965",
"増減率": "△ 0.1"
},
〜中略〜
{
"区分": "合計",
"当年度末件数": "5,801,856",
"前年度末件数": "5,807,901",
"増減": "△ 6,045",
"増減率": "△ 0.1"
}
]
},
"次表": {
"表題": "(5) 水洗便所改造工事助成",
"列名": ["件数", "金額"],
"単位": ["件", "円"],
"データ": [
{
"種別": "一般",
"件数": "1",
"金額": "364,800"
},
{
"種別": "公衆浴場",
"件数": "",
"金額": ""
},
{
"種別": "小計",
"件数": "",
"金額": ""
},
{
"種別": "その他 一般",
"件数": "",
"金額": ""
}
]
}
}
▼Geminiで表をJSONに変換した結果
{
"title_4": "(4) 下水道使用件数",
"table_4": {
"columns": [
"種",
"別",
"(A) 当年度末件数",
"(B) 前年度末件数",
"(C A-B) 前年度末との比較増減",
"(CB) 增減率"
],
"units": [
null,
null,
"件",
"件",
"件",
"%"
],
"rows": [
{
"種": "水道",
"別": "般",
"(A) 当年度末件数": "5,793,809",
"(B) 前年度末件数": "5,799,754",
"(C A-B) 前年度末との比較増減": "5,945 Δ",
"(CB) 增減率": "0.1 Δ"
},
{
"種": "公衆浴場",
"別": null,
"(A) 当年度末件数": "410",
"(B) 前年度末件数": "430",
"(C A-B) 前年度末との比較増減": "20 Δ",
"(CB) 增減率": "4.7 Δ"
},
{
"種": "汚水",
"別": "計",
"(A) 当年度末件数": "5,794, 219",
"(B) 前年度末件数": "5, 800, 184",
"(C A-B) 前年度末との比較増減": "5,965 Δ",
"(CB) 增減率": "0.1 Δ"
},
〜中略〜
{
"種": "合",
"別": "計",
"(A) 当年度末件数": "5,801,856",
"(B) 前年度末件数": "5,807,901",
"(C A-B) 前年度末との比較増減": "6,045 Δ",
"(CB) 增減率": "0.1 Δ"
}
]
},
"title_5": "(5) 水洗便所改造工事助成",
"table_5": {
"columns": [
"件",
"数",
"金",
"額"
],
"units": [
"件",
null,
"円",
null
],
"rows": [
{
"件": "1",
"数": null,
"金": "364,800",
"額": null
}
]
}
}
検証結果
ChatGPT・Geminiの両方とも1対1の表では、数値の部分は高い精度で表を読み取れています。
セル結合がある場合は、今回使用したプロンプトではテキストをJSONに変換出来ていない箇所がありましたので、精度を求めるなら目件チェックをして修正するフローが必須になるかなと思います。
終わりに
PDF内の表をAIは読み取ることができます。ただPDFに表を読み取らせてデータに変換する方法の完全自動化はまだ難しいなという印象です。
またPDFの表を機械的に読み取るだけなら、PDFパーサーでデータを取得した方が精度が高まりコストも抑えられるかと思いますので、ぜひご参考に。
出典
- 東京都下水道局.「令和2年度東京都下水道事業会計決算書」.東京オープンデータカタログサイト.2024年9月5日.(https://catalog.data.metro.tokyo.lg.jp/dataset/t000020d0000000040/resource/02f2c8ed-2be8-40cf-b39c-0d1b4ce5b902).2025年10月12日
CONTACT
お問い合わせ・ご依頼はこちらから