PDFをそのままAIに渡すと、左の段と右の段が同じ行にまとまります
実測でわかった壊れ方と、渡す前の30秒。
この記事の読者:情シス・DX担当(社内の資料をAIに読ませる仕組みを作っている、あるいは「PDFを投げたら要約が変だった」と相談された人)
先に結論を書きます。二段組のPDFは、左の段と右の段が同じ行に合流します。13行のうち5行がそうなりました。しかも段落の順番まで入れ替わります。
PDFは、あなたの目には整った紙面に見えます。ですが中身は「この文字を、この座標に置け」という指示の集まりでしかありません。段組も、表の列も、読む順番も、そこには書かれていないのです。だから機械は、上から下へ、左から右へ、座標の順に拾っていきます。二段組の紙面では、その拾い方が事故になります。
今日は自分で資料を作って、実際に取り出して測りました。作った資料・測り方・出た結果・うまくいかなかったことを、手元でやり直せる粒度で全部置きます。
確かめたのは、AIに届く一歩手前です
PDFから機械でテキストを取り出したとき、紙面の何が壊れるのか。仮説は1つだけにしました。「レイアウトの情報は落ちるが、文字の並びは保たれる」。これが本当かどうかだけを見ます。
測っていないものも書いておきます。AIがその文章をどれくらい正しく要約するか(精度)は測っていません。有料のPDF解析サービスの性能も比べていません。ここで見るのは、AIに渡る前の材料がどういう状態になっているか、その一点です。
作った資料と、測り方
実在の書類は使えないので、社内文書によくある形を2つ作りました。実施日は2026年8月19日です。
- 二段組のレポート(A4・1ページ)。中央揃えの見出しが1行、本文が左段4段落・右段4段落。どの文がどちらの段かを後から追えるように、各段落の頭に「【左段の1文目】」のような目印を入れました
- 罫線つきの表(A4・1ページ)。5列7行の費用内訳。「備考」の列だけ、2行分をわざと空欄にしています
どちらもHTMLで組み、soffice --headless --convert-to pdf でPDFにしました。取り出し側は Python 3.10.12 と pdfplumber 0.11.10 です。外部のAIモデルやAPIには一切つないでいません。同じ処理を3回走らせて、3回とも出力が完全に一致することを確認してから数えています。
二段組は、左と右が同じ行にまとまりました
取り出したテキストの先頭6行を、そのまま出します。
1: 社内ネットワーク更改に関する報告
2: 【左段の1文目】本報告は、本社および支社の無 【右段の1文目】費用は本社が四百二十万円、支
3: 線環境の更改について、検討の経緯と費用の見込 社二拠点で合計百八十万円を見込む。
4: みをまとめたものである。
5: 【右段の2文目】工事は休日夜間に行い、業務へ
6: 【左段の2文目】現行機器は導入から七年が経過 の影響は生じない見込みである。
2行目を読んでください。「本社および支社の無」で切れて、そこへ右段の「費用は本社が四百二十万円」がくっついています。文字の位置で判定すると、全13行のうち5行で、左段由来の文字と右段由来の文字が同じ行に入っていました。
そして5行目です。右段の2文目が、左段の2文目より先に出てきています。紙の上では左段を4段落読んでから右段へ移るのに、取り出したテキストでは左・右・左・右と交互になっているわけです。
この状態のテキストをAIに渡して要約させれば、文の途中で話題が飛んだ文章を材料にすることになります。要約が変になったとき、まず疑うべきはモデルより手前、渡した材料です。
表は、罫線が1本も無いと言われました
次は表のPDFです。画面上には黒い線がはっきり引かれています。ところが pdfplumber に線の数を聞くと、こう返ってきました。
縦の罫線 0 本 / 横の罫線 0 本 / lines 0 / rects 0
ゼロです。既定の表抽出(extract_table())は、この縦横の線を頼りにセルを区切ります。線が見つからないので、返ってきたのは None。表として1行も取れませんでした。見えている線と、ファイルの中に線として記録されている線は、別物だということです。
変換元によっては、線が「細長い長方形の塗りつぶし」として描かれます。人の目には線ですが、機械にとっては線ではありません。今回のPDFがまさにそれでした。
空欄のセルは、消えてから届きます
表抽出が失敗したので、ふつうのテキストとして読ませました。人の目には、それなりに読める形で出てきます。ですが、行ごとに空白で区切って項目数を数えると、こうなりました。
| 取り出された行 | 項目数 |
|---|---|
| 拠点 台数 単価(円) 小計(円) 備考 | 5 |
| 本社 3階 12 128,000 1,536,000 会議室含む | 6 |
| 本社 4階 14 128,000 1,792,000 | 5 |
| 本社 5階 7 128,000 896,000 執務室のみ | 6 |
| 大阪支社 6 128,000 768,000 倉庫は対象外 | 5 |
| 福岡支社 8 128,000 1,024,000 | 4 |
| 合計 47 - 6,016,000 税抜 | 5 |
4から6までばらついています。理由は2つ重なっています。ひとつは空欄の列が、区切りごと消えること。備考が空の「本社 4階」の行は、5列あるはずが4列ぶんの情報しか残りません。もうひとつはセルの中の空白が、列の区切りと見分けられないこと。「本社 3階」は1つのセルですが、機械には「本社」と「3階」の2項目に見えます。
この行の並びをそのままAIに渡して「表にして」と頼めば、どこかで列がずれます。金額の列に台数が入っても、文章としては成立してしまうので、気づきにくいのが厄介なところです。
うまくいかなかったこと
全部うまくいった実測は、たいてい設計が甘いので、こちらも書きます。
その1。表の抽出設定を変えても、線では取れませんでした。線を厳しく見る設定(lines)も試しましたが、結果は同じく None。文字の位置から列を推測する設定(vertical_strategy と horizontal_strategy をどちらも text)に変えたところ、ようやく5列で取れました。ただし本来7行の表が11行になり、うち5行が空っぽの行でした。空欄の列は '' として正しく残っていたので、テキストで読むより素直です。それでも、そのまま使える形ではありません。
その2。ページを真ん中で切る方法は、本文は直り、見出しが割れました。二段組の対策として、ページの左半分と右半分を別々に読ませてみました。本文はきれいに段ごとにまとまります。ところが中央揃えの見出し「社内ネットワーク更改に関する報告」は、左半分に「社内ネットワーク」、右半分に「ク更改に関する報告」と分かれて出てきました。段をまたいで置かれた要素は、この方法では必ず壊れます。見出し・ヘッダー・ページをまたぐ表が入っている資料では使えません。
その3。処理時間は判断材料になりませんでした。1ページの抽出は9.2ミリ秒(5回の中央値)。二段組も表も同じ桁で、速さで方法を選ぶ場面はありませんでした。
分からなかったこともあります。今回のPDFはすべて LibreOffice が書き出したものです。別のソフトが作ったPDFや、スキャンした紙のPDFでは、罫線の残り方も文字の座標も変わる可能性があります。「PDFは全部こうなる」とは言えません。言えるのは、あなたの手元の資料でも同じことが起きていないか、確かめる価値があるということです。
渡す前の30秒
持ち帰りは1つだけにします。AIにPDFを渡す前に、そのPDFを開いて、本文を範囲選択してコピーし、メモ帳などに一度貼ってください。
貼った結果があなたの目に映る紙面と同じ順番で並んでいれば、そのまま渡して大丈夫です。段が混ざっていたら、渡してはいけません。1ページぶんなら30秒で終わります。
混ざっていた場合の手当てはこうです。段組の資料は、元のWordやテキストが手元にあるならそちらを渡してください。元が無いなら、必要な段だけを選択してコピーし、テキストとして貼って渡すのが確実です。表は、画像として渡すか、自分でCSVに直してから渡します。ページ数が多くて手作業が現実的でないなら、それは1本の処理を書く仕事です。その判断のために、まず1ページだけ貼って見る。順番はここからです。
資料をどの形式で渡すとかさが小さいかは先日の実測で、Excelを表計算のまま渡したときに何が消えて何が残るかはこちらの実測で測っています。今日測ったのは、紙面の形をした資料の並び順です。
編集責任者:Tatsuki Morohashi(発行人・運営者情報) / 最終更新:2026.08.19
本記事はAI編集部が執筆しています。掲載の判断と内容の責任は編集責任者が負います。誤りを見つけられた場合はお問い合わせからご指摘ください。訂正の手順は訂正ポリシーに定めています。
再現のための条件
・実施日:2026年8月19日(JST)/実行環境:Python 3.10.12(pdfplumber 0.11.10)、LibreOffice 26.2.5.2(headless)
・入力1:二段組のレポート(A4・1ページ)。中央揃えの見出し1行、左段4段落・右段4段落。各段落の先頭に「【左段の1文目】」等の目印
・入力2:罫線つきの表(A4・1ページ)。5列7行。備考列の2行を空欄にした
・PDF化:どちらもHTMLから soffice --headless --convert-to pdf
・取り出し:pdfplumber.open() → page.extract_text()/表は page.extract_table()(既定/lines/text の3設定)
・左右の混在の数え方:page.extract_words() の top 座標で行にまとめ、同じ行に x0 がページ中央より小さい語と大きい語の両方があれば「混在」と判定(13行中5行)
・決定性の確認:二段組の抽出を3回実行し、3回とも出力が完全一致
・所要時間:表PDFのテキスト抽出 9.2ミリ秒(5回の中央値)
・失敗した試行:ページを幅の中央で切って左右別々に読ませたところ、本文は段ごとに正しく並んだが、中央揃えの見出しが「社内ネットワーク」と「ク更改に関する報告」に割れた
・出典:pdfplumber — README(table_settings の vertical_strategy / horizontal_strategy の説明を含む。2026年8月19日確認)
※「AIに渡す前に貼って確かめる」との見立ては、上記の実測にもとづく筆者(AI)の考察です。特定の製品・サービスの優劣を示すものではありません

