複数ページに続くPDF表は、AIに「1つの表にして」と丸投げするより、まずページごとに抽出し、列構造・行の継続・脚注を照合してから統合した方が安全です。ページ境界では、同じHeaderの再掲、途中で切れた行、単位の変更、Subtotalの重複が起きやすく、単純結合すると見た目は整っていても数字が壊れることがあります。
この記事では、架空の3ページ表を例に、Page単位の抽出→Column Contract→行継続判定→脚注・単位の保持→Stitching→検算まで進めます。読後には、AIで表をCSVやSpreadsheetへ移すときに「どの行を結合し、どこを要確認にするか」を判断できる状態を目指します。
目次
最初に「表が本当に同じ表の続きか」を確認する
ページ2に似たHeaderがあるからといって、必ずページ1の続きとは限りません。表番号、Caption、Column名、単位、並び順、脚注記号を見ます。
たとえばp.12が「地域別売上(単位:千円)」、p.13が「地域別利益(単位:千円)」なら、Columnが似ていても別Tableです。まずTable IDを振り、同じ表として結合する根拠を残します。
Page単位でRaw Extractionを残す
統合前の抽出結果を消さないことが重要です。各行へsource_pageとsource_rowを付けます。
例:
P12-R01|地域|2025上期|2025下期|合計
P12-R02|東北|120|130|250
P12-R03|関東|300|
P13-R01|地域|2025上期|2025下期|合計
P13-R02||320|620
P13-R03|関西|180|190|370
この架空例では、P12-R03とP13-R02が1行の途中で分割された可能性があります。ただし、まだ自動結合しません。
Column Contractを固定する
ページをまたいで同じ表として扱うなら、Columnの意味が一致している必要があります。
表は横にスクロールできます
| Column | 意味 | 型 | 単位 | 必須 |
|---|---|---|---|---|
| region | 地域名 | text | — | Yes |
| h1 | 上期 | number | 千円 | Yes |
| h2 | 下期 | number | 千円 | Yes |
| total | 合計 | number | 千円 | Yes |
| source_page | 原文Page | integer | — | Yes |
Header表記が「上期」「H1」などページで変わっても、意味が同じと確認できれば正規化できます。意味が不明なら別Columnとして保持します。
繰り返しHeaderをDataとして数えない
PDFでは各ページ上部に同じHeaderが再掲されることがあります。抽出器がHeaderを通常行として返すと、CSVに「地域 / 上期 / 下期 / 合計」というData rowが何度も入ります。
Header候補は、文字列一致だけでなく、列位置・型・前後関係を見て除外します。異なるHeaderが現れた場合は、表構造変更の可能性として止めます。
行継続は複数条件で判定する
Page末尾の行と次Page先頭を結合する条件を先に決めます。
たとえば次を同時に満たす場合だけ「継続候補」にします。
-
前Page最終行に必須Columnの欠落がある
-
次Page先頭行に識別子がない
-
次Page先頭行の値が欠落Columnへ自然に入る
-
Column数と型が一致する
-
原本画像で視覚的に同一行と確認できる
どれかが曖昧ならAUTO_MERGEせずREVIEWへ回します。
架空例:分割行を結合する
P12-R03が「関東|300|空欄|空欄」、P13-R02が「空欄|空欄|320|620」だったとします。原本で行罫線が連続し、次Page先頭に新しい地域名がないなら、統合後は「関東|300|320|620」とできます。
一方、P13-R02に「関東支店」と書かれているなら、同じ行とは限りません。AIに意味補完させず、別Recordか継続かを人が確認します。
空欄と0を分ける
表抽出ではBlankが0へ変換されると意味が変わります。未入力、該当なし、値0は別です。
Raw段階では空欄を空欄のまま保持し、原文に「—」「N/A」等がある場合もその表記を別FieldまたはNoteに残します。数値計算のために0へ変換するのは、意味を確認した後です。
Merged Cellに注意する
複数行にまたがるCategory名がMerged Cellで表示されている表では、2行目以降のCategoryが空欄として抽出されることがあります。
上の値を自動でFill Downする前に、Merged Cellが本当に複数行へ適用されるか原本を確認します。別Groupへ切り替わる境界では特に誤結合が起きやすくなります。
脚注・単位を表本体と一緒に保存する
「単位:百万円」「*速報値」「注:一部地域を除く」といった情報が表の外側に置かれている場合、Cellだけ抽出すると条件が消えます。
Table-level metadataとしてunit、note、footnote、periodを保存し、該当する行・Columnと紐づけます。Pageごとに単位が変わっていたら結合を止めます。
SubtotalとTotalの重複を確認する
ページ末尾にSubtotal、次ページ先頭に同じSubtotalが再掲される資料があります。両方をDataとして残すと二重計上になります。
row_typeをDATA / SUBTOTAL / TOTAL / HEADER / NOTEに分類し、集計時にどれを足すかを明示します。Subtotalを消す場合もRaw Extractionには残します。
型変換はStitching後に行う
抽出直後に「1,200円」を数値1200へ変えたり、日付を標準形式へ直したりすると、OCR誤りや単位違いを見落としやすくなります。まずRaw値とNormalized値を分けます。
raw_valueには原文表記、normalized_valueには計算用の値を入れ、変換Ruleを残します。変換できない値を空欄や0へ落とさず、PARSE_REVIEWとして止めます。
AIへの依頼文例
「以下は同一PDFの複数pageから抽出したtableです。まず結合せず、各rowをHEADER / DATA / CONTINUATION_CANDIDATE / SUBTOTAL / TOTAL / NOTE / REVIEWに分類してください。
出力:source_page / source_row / normalized_columns / row_type / continuation_target / confidence_reason / review_reason。
ルール:空欄を0へ変えない。HeaderをDataにしない。pageをまたぐ行は条件が明確な場合だけ候補化し、判断不能はREVIEW。脚注・単位を保持する。」
その後、人がREVIEWを確認してからStitchingを実行します。
統合後もProvenanceを残す
最終表にはoriginal_sourceの情報を残します。行が2ページから結合されたなら「p.12+p.13」のように複数Locatorを持たせます。
値だけのCSVにすると、後から誤りを見つけても原文へ戻れません。少なくともsource_page、source_row、review_statusは保持します。
検算1:Row Countを比較する
RawのDATA行数と統合後のRecord数を比較します。継続行を1件にまとめた分だけ減るはずで、理由なく大量に減ったら結合しすぎです。
逆にHeaderやSubtotalをDataへ混ぜるとRecord数が増えます。Count差をChange Logとして残します。
検算2:Subtotal / Totalを照合する
原本にSubtotalやTotalがある場合、統合したData行を再計算し一致するか確認します。
一致しない場合は、行欠落、重複、単位違い、数値OCR誤り、Subtotal自身を再加算した、などを疑います。合計が合わない状態で先へ進みません。
検算3:境界Pageを重点確認する
全行を目視するのが重い場合も、Page末尾と次Page先頭は必ず確認します。ここが最も行継続・Header重複・脚注漏れが起きやすいからです。
各境界で「最後の2行+最初の2行」を原本と照合するだけでも、Stitching事故をかなり見つけやすくなります。
検算4:Keyの重複と欠落を見る
地域名、商品コード、契約番号など一意性を期待するKeyがあるなら、統合後にduplicateとmissingを確認します。
重複があっても即削除せず、原本で別期間・別Categoryの正当な重複かを確認します。Key QAは、表が見た目上きれいでも行を誤結合していないかを見つける手掛かりになります。
Output例
表は横にスクロールできます
| region | h1 | h2 | total | source | status |
|---|---|---|---|---|---|
| 東北 | 120 | 130 | 250 | p.12 | VERIFIED |
| 関東 | 300 | 320 | 620 | p.12+p.13 | VERIFIED |
| 関西 | 180 | 190 | 370 | p.13 | VERIFIED |
数字は説明用の架空例です。実データでは原本照合前にVERIFIEDへしません。
止めるべきケース
次の場合は自動結合を止めます。
-
Page間でColumn数が変わる
-
単位が変わる
-
Header意味が変わる
-
識別子のない行が複数候補へつながる
-
OCRで数字が読めない
-
Merged Cellの範囲が不明
-
Totalが合わない
止めることは失敗ではありません。誤った表を完成させるより、REVIEW状態を残す方が安全です。
AIものさしの判断
複数ページ表の整理は「抽出」と「結合」を一度にやらないのがポイントです。Page単位のRawを残し、Column Contractと行継続Ruleを決めてからStitchingし、最後にRow CountとTotalを検算します。
最初は2ページ分だけでPilotしてください。Header除外、分割行1件、Subtotal1件を正しく扱えるか確認し、source_pageを保持したまま統合する。この最小Testを通してから全ページへ広げれば、見た目だけ整った誤表を作るリスクを下げられます。
引用・データ出典
公式情報を編集部が見た内容です。Hands-on未実施の記述は本文かここに分けています。
確認日:2026-10-09
Google Cloud:Document AI Form Parser(新しいタブで開く)
Google Cloud:Handle processing response(新しいタブで開く)
Google Cloud:Layout parser Quickstart(新しいタブで開く)
Google Cloud:Process documents with Gemini layout parser(新しいタブで開く)
