AIにPDFを貼る人へ|『人』が64回、別の文字だった。30秒の3手
PDFをAIに貼ると何が壊れるかを手元で実測。画像PDFは0文字、文字入りPDFでも「人」が別の文字にすり替わり、表は列ごとに分解される。貼る前の30秒チェック3手つき。
手元のMacにあるPDFを12本まとめて調べたら、そのうち3本の中で「人」という字が、人ではありませんでした。
見た目はまったく同じです。印刷しても同じ。でもコンピュータから見ると別の文字で、「担当者は3人」とAIに貼って「人数を数えて」と頼んでも、その「人」は検索に一度も引っかかりません。3本の中だけで、そういう字が439個ありました。
PDFをAIに投げるのは、いまや毎日の作業です。請求書、議事録、提案書、行政の様式。ところがPDFは「見えているもの」と「渡っているもの」が一致しないファイル形式で、しかもズレたことが画面上では一切分かりません。今日は手元でひととおり測ったので、何がどう壊れるかと、貼る前の30秒の確認手順を置いていきます。
まず、事故は2通りしかないと切り分ける
PDFで起きる事故は、細かく見ると無限にありそうに見えますが、入口で2つに分かれます。
ルート①:文字が入っているPDF。文字は届くが、届いた文字が別物になっている。 ルート②:画像だけのPDF。文字が1つも入っておらず、コピペすると0文字。
やっかいなのは、この2つが画面上でまったく見分けられないことです。今日はこれを実際に作って確かめました。同じHTMLから、Chromeの印刷機能で「文字入りPDF」を1本、同じ見た目を画像1枚に焼いた「画像PDF」を1本、A4・1ページで用意しました。
- 文字入りPDF:285,862バイト
- 画像PDF:316,729バイト
画像PDFのほうが大きいのです。「容量が小さいほうが画像っぽい」という直感はここで裏切られます。開いたときの見た目も同じ。違いが出るのは、テキストを取り出した瞬間だけでした。
- 画像PDFから取り出せた文字数:0文字(2種類の取り出し方のどちらでも0)
なお、ChatGPTやClaudeの「ファイルをアップロード」機能に画像PDFを渡した場合は、向こう側でOCR(画像からの文字認識)がかかるので読めることが多いです。0文字になるのは、あなたが自分でコピペして貼っているときと、自作の自動化・社内ツールに流し込んでいるとき。この記事が問題にしているのは、その2つの経路です。
ルート①の被害A:『人』が『⼈』にすり替わっている
ここからがルート①、つまり「文字はちゃんと入っているPDF」の話です。むしろこちらのほうが厄介でした。
検証用PDFから2つのやり方でテキストを取り出して、1文字ずつ照合しました。
- pdftotext(popplerという定番ツール):663文字、すり替わりゼロ
- pypdf(Pythonのライブラリ。AIに読ませる自動化でよく使われる):685文字、うち25文字が別の文字
別の文字、というのは「康熙部首(こうきぶしゅ)」という、漢字辞典の見出しに使うために別枠で用意されたUnicodeの文字です。「一」に対して「⼀」(U+2F00)、「工」に対して「⼯」(U+2F2F)、「日」に対して「⽇」(U+2F47)というふうに、見た目はほぼ同じで番号だけが違う。検証用PDFの中では14種類が混ざっていました。
これが何を壊すのか。取り出したテキストの中を、ふつうの漢字で検索してみました。
語 pdftotext pypdf
第一 1件 0件
解約抑止 4件 0件
工数 4件 0件
面談 1件 0件
月次 2件 0件
比率 1件 0件
方針 1件 0件
自動生成 2件 0件
目 1件 0件
10語のうち9語が、片方ではゼロヒット。 目で見れば確かにそこに書いてあるのに、検索では存在しないことになっています。AIに「解約抑止の施策について要約して」と頼んだとき、その語がテキスト中に見つからないまま処理される、ということです。
そして重要なのは、これが特殊なPDFの話ではないことでした。手元の実物のPDF12本・59ページを同じやり方で調べたところ:
- 3本(12本中の25%)に、見た目が同じ別の文字が合計439個
- その3本では、本文の3.5%〜4.5%がその文字
- 種類は34種。内訳の上位は「人」64個、「方」40個、「一」33個、「見」31個、「用」30個、「手」26個
- 同じ3本を pdftotext で取り出すと、すり替わりは0個
つまり「PDFが壊れている」のでも「ツールが悪い」のでもなく、どちらで取り出したかで結果が変わる。そして自分の手元がどちらの経路なのかは、貼ったテキストを調べるまで分かりません。上位に画数の少ない字が並んでいるのも嫌なところで、「人」「方」「一」「見」「用」「手」は、業務文書でいちばんよく使う漢字です。「担当者」「人数」「使用方法」「見積」——このあたりが軒並み検索から消えます。
ルート①の被害B:表の1行が、17行に散らばる
もうひとつ、同じPDFで測ったのが表です。検証用PDFには5列×5行の表を1つ入れました。「施策/指標/前年同期/今期/差分」という、業務資料そのままの形です。
取り出した結果は、こうなりました。
- 「解約率」は24行目、その右隣にあったはずの「8.4%」は41行目。17行離れた
- 「CPA」と「32,400円」も17行、「獲得件数」と「1,240件」も17行、「月次レポート作成」と「4.5時間」も17行
- 表は列ごとに縦一列に並び直され、5行×5列=25セルのうち、元の行を復元できるものは0個
- その途中に、ページ番号「1/1」が29行目、フッターの「社外秘 Play+ 内部資料 …」が46行目として割り込んだ
- 本文4段落のうち、3段落目と4段落目は表の後ろ(31〜39行目)に回り、読み順が入れ替わった
「解約率は5.1%に下がった」という1行の事実が、AIに届く時点では 「解約率」という語 と 「5.1%」という数字 が離れた場所に置かれた別々の断片になっている。これが、9月11日に書いた「AIに表の合計を出させると数字がずれる」の、さらに手前で起きていることです。あのときは計算の問題だと思っていましたが、そもそも表が表の形で届いていなかったケースがかなり混ざっていたはずです。
図解:1枚の資料が、AIにはこう届く
【あなたが見ているPDF】
ヘッダ:社内資料|上期レビュー 1/1
本文① 本文③
本文② 本文④
┌ 表 ─────────────────
│ 施策 |指標 |前年同期|今期
│ 解約抑止|解約率 |8.4% |5.1%
└───────────────────
フッタ:社外秘 Play+ 内部資料
↓ コピペ/自動抽出
【AIに届いているテキスト】
本文① → 本文② → 施策・解約抑止・獲得単価圧縮…
→ 指標・解約率・CPA… → 1/1 ← ページ番号が割り込む
→ 本文③ → 本文④ → 前年同期・8.4%・32,400円…
→ 社外秘 Play+ 内部資料 ← フッタが割り込む
→ 今期・5.1%… → 差分・-3.3pt…
● 「解約率」と「8.4%」は17行離れている
● 「解約抑止」の「止」は別の文字(⽌)のことがある
● 本文③④は表の後ろに回り、読み順が変わっている
貼る前の30秒、3手
ここまでを踏まえた確認手順です。全部で30秒、道具の追加インストールは不要です。
手1:0文字かどうかを見る(5秒) PDFを開いて Cmd+A → Cmd+C。空のメモに Cmd+V。何も貼られなければルート②(画像PDF)。この場合、コピペで渡すのは意味がないので、アップロード機能に切り替えます。
手2:すり替わりを数える(10秒) コピーした状態のまま、ターミナルに次の1行を貼ってEnter。macOSは python3 が最初から入っているので、追加インストールは要りません。
pbpaste | python3 -c "import sys;t=sys.stdin.read();k=[c for c in t if 0x2E80<=ord(c)<=0x2FDF];print('総文字数',len(t),'すり替わり',len(k),''.join(sorted(set(k))))"
すり替わりが0なら、その経路は安全です。1以上なら、そのまま次の1行でクリップボードごと直せます。
pbpaste | python3 -c "import sys,unicodedata;sys.stdout.write(unicodedata.normalize('NFKC',sys.stdin.read()))" | pbcopy
実測では、これで康熙部首は25個→0個、ゼロヒットだった9語は9語とも復活しました。NFKCという正規化は「見た目が同じ字を1つに寄せる」処理で、この用途にはぴたりと合います。
手3:表の1行を目で追う(15秒) 貼ったテキストで、表の見出し語をひとつ選び、そのすぐ下に対応する数字が来ているか見ます。「解約率/CPA/獲得件数」のように列名が縦に連続していたら、その表は行が消えています。この状態でAIに数字を聞くのは、切り刻んだ表を渡して「元に戻して読んで」と言っているのと同じです。
それでも渡すときの、渡し方の順位
3手で問題が見つかったとき、どう渡すか。上から順に試すのが早いです。
① 元データがあるなら、元データを渡す。 スプレッドシートやCSVが手元にあるなら、PDFを経由しない。表の行はそこでしか保たれていません。
② Webページ版があるなら、そちらをコピペする。 同じ内容がHTMLで公開されているケースは意外と多く、段組も表も壊れません。
③ PDFしかないなら、表と本文を分けて渡す。 表は手で打ち直すか、スクリーンショットを別途添える。本文は手2で直してから貼る。
④ 画像PDFは、アップロード機能に渡して「最初の行をそのまま書き写して」と1回聞く。 書き写せたならOCRが効いています。ここで確認を入れないと、読めていないまま話が進みます。
面倒に見えますが、実際にやるのは手1と手2だけで15秒です。それで「渡っていない資料について、それらしい要約が返ってくる」という一番こわい事故は防げます。
まとめ
- PDFの事故は2通り。1文字も届いていないか、届いた文字が別物か。
- 画像PDFは見た目でも容量でも見分けられない。今日の実測では、画像PDFのほうが3万バイト大きかった。
- 文字入りPDFでも、取り出し方によって見た目が同じ別の漢字が混ざる。手元の実物12本中3本、計439個。最多は「人」の64個。
- 表は列ごとに縦に分解され、同じ行だった語と数字が17行離れた。ヘッダ・フッタ・ページ番号も本文に割り込む。
- 貼る前の30秒(0文字チェック → すり替わりチェック → 表の1行を追う)で、ほぼ全部見つかります。
今日いちばん覚えて帰ってほしいのは、「AIが読み間違えた」と思っていたものの一部は、読ませる前にこちらが壊していたということです。AIの精度を上げる前に、渡しているものを1回だけ見てみてください。
同じ場面、ありませんか。PDFを貼って要約させたのに、資料にある固有名詞が要約に一度も出てこなかった、というやつです。あれはたぶん、AIが無視したのではなく、届いていません。
役に立ったら♡やブックマークをどうぞ。この手の実測記事はこのサイトに毎日ためています。
#AI活用 #生成AI #業務効率化 #PDF #仕事術
この記事は note にも掲載しています(初出: note版 2026-09-16)。