AI活用

スキャンしたPDFの文字が読み取れない・pdftotextが空のとき:pdftoppmで画像化してAIに読ませる5手順

スキャンしたPDFの文字が読み取れない・pdftotextが空のとき:pdftoppmで画像化してAIに読ませる5手順

おはようございます。まさきんです。

習い事の体験でもらったチラシを、スマホでスキャンしてAIに読ませようとしました。ところがPDFから文字がまったく取れませんでした。家庭の紙をデジタル化する人なら一度は当たる話だと思うので、見分け方と対処をメモしておきます。

※記事公開時点の情報です。最新の条件は公式サイトでご確認ください。

POINT
  • スキャンしたPDFの文字が読み取れないときは、まず pdftotext の出力が空かどうかを見る
  • 空なら pdftoppm -r 200 -png でページを画像にして、AIには画像で渡す
  • 原因は「画像だけのPDF」「OCRの層が粗い」「文字コードの対応がない」の3種類が考えられる
  • 解像度はAIに渡すなら150〜200dpi、OCRをかけ直すなら300dpiが目安
  • 金額や日付の数字は、最後に必ず紙の原本で確かめる

スキャンしたPDFの文字が取れなかった

使ったのは Adobe Scan です。習い事のチラシを撮って、PDFで保存しました。開いてみると見た目はきれいです。文字も選択できそうに見えました。

そのPDFを pdftotext というコマンドにかけました。PDFから文字だけを取り出す道具です。結果は空でした。使える文字が1行も出てきません。

そこでページを画像に変えてAIに渡しました。内容はふつうに読み取れました。

なお、これは僕の1枚のチラシでの話です。アプリの不具合だと言いたいわけではありません。スキャンアプリのPDFではこういうことが起こり得る、という整理として読んでください。

PDFには「見える層」と「文字の層」がある

スキャンしたPDFは、紙を撮った写真が土台です。その上に、OCRで読み取った文字が透明な層として重なります。OCRは画像の文字をデータに変える処理ですね。

画面に見えているのは写真の方です。検索やコピーで使われるのは透明な文字の層です。なので、見た目がきれいでも文字の層が使えないことがあります。

AIにPDFを渡すときも、この2層が関係します。文字の層だけを読む道具だと、層が空なら何も伝わりません。ここが今回のつまずきの正体だと思っています。

症状の見分け方は3つ

エンジニアでなくても確かめられる順に並べます。

  1. PDFを開いて文章をドラッグする。選択できない、または貼り付けると文字化けする
  2. pdftotext をかける。出力が空か、改ページの記号だけになる
  3. pdffonts をかける。フォントが1行も出てこない

1つ目はアプリだけで試せます。コピーしてメモ帳に貼るだけです。ここで空や文字化けなら、文字の層は当てにしない方がよいかもしれません。

原因として考えられる3種類

僕は自分のチラシがどれに当たるかを特定していません。なので、一般論としての整理です。

種類中身コピペした結果pdffonts の表示
画像だけのPDF文字の層がそもそも無い選択できないフォントが出ない
OCRの層が粗い層はあるが誤認識が多い別の文字や欠けた文になるフォントは出る
文字コードの対応がない文字とUnicodeの対応表が無い、または崩れている記号や空白になるuni の列が no のことがある

3つ目は少し補足が要ります。pdffonts の公式マニュアルには uni という列の説明があります。ToUnicode という対応表がPDFにあれば yes になる列です。

ただ、マニュアルには注意書きもあります。対応表が無くても文字に変換できないとは限らない、という内容です。なので uni が no でも即アウトではありません。手がかりの1つくらいに見ておくのがよいと思います。

pdftotext のマニュアルにも、近い話がBUGSの欄に書かれています。エンコーディングが崩れたフォントを含むPDFがある。その場合はOCR以外に文字を取り出す方法がない。そういう趣旨です。道具の側も「取れないPDFはある」と認めているんですね。

poppler の入れ方

pdftotext や pdftoppm は poppler というソフトに含まれています。PDFを扱う定番の無料ツールです。

環境入れ方補足
macOSbrew install popplerHomebrew が必要
Ubuntu / Debiansudo apt install poppler-utilsパッケージ名は poppler-utils
WindowsWSL の Ubuntu に上の apt で入れる公式サイトはソースの配布が中心

Windows は少し手間です。poppler の公式サイトが配っているのはソースコードで、各OS向けは配布元のパッケージを使う形になっています。僕なら WSL で Ubuntu を入れて、そこで apt を使うと思います。

入ったかどうかは次で確かめられます。

pdftotext -v

バージョンの番号が出ればOKです。

対処の手順

流れは5段階です。4つ目までで、ほとんどの紙は片づくと思います。

手順1: pdftotext で空かどうか確認

まず文字の層が使えるかを見ます。ファイル名は例として flyer.pdf にしています。

pdftotext -layout flyer.pdf flyer.txt
wc -c flyer.txt

-layout は元の見た目の配置をなるべく保つオプションです。チラシのように段組みが多い紙では付けた方が読みやすくなります。wc -c はファイルの大きさを数えるだけのコマンドです。

数字が0や1桁なら、文字は取れていません。僕のチラシはここで空でした。逆に、ちゃんと文章が出てくるならそのまま使えます。画像にする必要はありません。

ページを絞るなら -f と -l を使います。最初と最後のページ番号ですね。

pdftotext -f 1 -l 2 -layout flyer.pdf -

最後の - は、ファイルに書かず画面に出す指定です。

手順2: pdffonts と pdfimages で中身を見る

ここは省いてもかまいません。ただ、原因の見当がつくので僕はやっておきたい派です。

pdffonts flyer.pdf
pdfimages -list flyer.pdf

pdffonts はPDFの中のフォントを一覧にします。見出し行しか出ないなら、文字の層は無いと考えてよさそうです。pdfimages -list は中の画像を一覧にします。ページごとに大きな画像が1枚ずつあれば、スキャン由来のPDFですね。

手順3: pdftoppm でページを画像にする

文字が取れないなら、ページごとの画像に変えます。

pdftoppm -r 200 -png flyer.pdf page

これで page-1.png、page-2.png のようなファイルができます。-r は解像度で、単位はdpiです。指定しないと150になります。-png を付けないとPPMという扱いにくい形式で出るので、ここは忘れない方がよいです。

1ページだけ欲しいときはこうします。

pdftoppm -r 200 -png -f 1 -l 1 -singlefile flyer.pdf flyer

-singlefile を付けると、番号なしの flyer.png が1枚だけできます。

手順4: AIには画像で渡す

できたPNGを、そのままAIのチャットに添付します。僕のケースでは、これで内容を読み取れました。

頼み方は具体的にした方が結果が安定します。例えばこんな文面です。

添付はチラシをスキャンした画像です。
日時・場所・持ち物・料金・申込期限を表にしてください。
読めなかった箇所は推測せず「判読不能」と書いてください。

最後の1行が大事だと思っています。AIは読めない字をそれらしく埋めてしまうことがあるからです。

PDFのまま渡すのはだめなのか

だめではありません。Claude の開発者向けドキュメントには、PDFの各ページを画像に変換する処理が書かれています。ページから抽出した文字と画像の両方を渡す仕組みです。Gemini のドキュメントにも、PDFを画像として理解する旨の説明があります。

なので、アプリにPDFを直接入れれば読めることも多いはずです。困るのは、文字の抽出だけを使う経路に乗ったときですね。自作のスクリプトで pdftotext の結果だけを渡す場合がそうです。

ページ数が多いPDFも注意が要ります。Claude のヘルプには、ページ数が多いと文字だけの処理になる旨の記載があります。迷ったら画像にして渡す、を既定にしておくと安心ではないでしょうか。

家計まわりの紙をAIに読ませる場面は、これからも増えると思います。料金表を比べる作業は通信費の見直しでも同じでした。

契約しなくても必ず100ポイントもらえるシミュレーション スマホ料金も、料金表を並べて見直してみる

押すと楽天のログインページが開きます。ログイン後にキャンペーン内容が表示されます。

手順5: 必要ならOCRmyPDFで層を付け直す

PDFそのものを検索できる形で残したい。そういうときは、文字の層を付け直す方法があります。OCRmyPDF という無料のツールです。

公式ドキュメントによると、スキャンした画像のPDFに文字の層を足して検索できるようにするものです。OCRの中身には Tesseract というエンジンを使っています。

brew install ocrmypdf
brew install tesseract-lang
ocrmypdf -l jpn --redo-ocr flyer.pdf flyer-ocr.pdf

-l jpn は日本語で読ませる指定です。指定しないと英語として扱われます。日本語の紙ではここを忘れると、結果がかなり崩れると思います。Ubuntu なら言語のデータは tesseract-ocr-jpn のような別パッケージで入れます。

--redo-ocr は、ほかのソフトが付けたOCRをやり直す指定です。うまくいかなければ --force-ocr があります。ただ、こちらは全ページを画像に作り直します。画質が落ちる可能性がある、と公式にも書かれています。

とはいえ、精度には限界があります。ドキュメント自身が、商用のOCRに及ばない場合があると書いています。チラシを1枚読むだけなら、画像をAIに渡す方が早いかな。

解像度の目安

-r の数字をいくつにするかは、渡す相手で変えます。A4の紙で計算するとこうなります。

解像度A4の画素数(おおよそ)向いている使い方
150dpi(既定)1240 × 1754ふつうの大きさの文字をAIに読ませる
200dpi1654 × 2339小さい注意書きがあるチラシ
300dpi2480 × 3508TesseractなどのOCRにかける

大きくすれば良いわけではありません。Claude のドキュメントには、上限を超える画像は処理の前に縮小されると書かれています。Gemini も大きなページは最大3072 × 3072に縮小する、と説明しています。上げすぎても捨てられるだけなんですね。

一方で Tesseract の公式ドキュメントは、300dpi以上の画像でうまく働くとしています。なので僕の目安は2つです。AIには150〜200で、OCRには300にします。

小さい字が読めないときは、解像度を上げるより切り出す方が効くかもしれません。料金表の部分だけを別の画像にして渡す、というやり方です。

数字は必ず原本で確かめる

画像で読めたからといって、数字まで正しいとは限りません。

同じ日、体験説明の録音も文字起こししていました。こちらは金額の聞き取り違いがありました。該当の箇所だけ切り出して、精度の高いモデルでやり直して確定しています。経緯はWhisperが金額の数字を間違えた話に書きました。

紙でも音でも、AIが出した数字は下書きです。月会費や申込期限のような数字は、最後に紙の原本と見比べる。これだけは省かない方がよいと思います。

個人情報の入った紙を渡すときの注意

学校や習い事の紙には、名前や連絡先が載っていることがあります。AIに渡す前に、少しだけ立ち止まりたいところです。

注意
  • 名前・住所・電話番号・顔写真が写っていないかを先に見る
  • 要らない部分は、画像を切り取ってから渡す
  • 使っているAIサービスのデータの扱い(学習に使われるかの設定)を一度確認しておく
  • ほかの家庭の名前が載った名簿や連絡網は、そもそも渡さない

画像にしておく利点はここにもあります。PDFのままだと一部を隠すのが面倒です。画像なら、スマホの写真アプリで切り取るだけで済みます。

もう1つ。PDFには作成日時やアプリ名などの情報が入っていることがあります。画像に変えるとそれが外れるので、渡す情報を減らす意味でも悪くないと感じています。

スキャンするときのコツ

後工程が楽になるのは、結局は撮り方です。一般的に言われていることを並べておきます。

最後の項目は Adobe Scan の公式ヘルプで確認しました。テキスト認識は既定でオンになっています。環境設定の「保存した PDF でテキスト認識を実行する」でオフにもできます。

認識する言語は、既定だと端末の言語になるそうです。環境設定の「テキスト認識言語」で変えられます。対応言語には日本語も入っています。端末を英語で使っている人は、ここを日本語にしておくとよいかもしれません。

ヘルプには、ページ数が多いスキャンではOCRが実行されない旨も書かれています。上限は無料と有料で違うようです。何十ページもまとめて撮る人は、公式の最新の記載を見ておいてください。

よくある失敗・落とし穴

見た目で判断してしまう。 画面できれいに読めても、文字の層が使えるとは限りません。コピペを1回試すだけで分かります。

-png を付け忘れる。 pdftoppm はそのままだとPPM形式で出します。AIのチャットに添付できないことが多いので、PNGかJPEGを指定します。

解像度を上げすぎる。 600dpiで出すとファイルが大きくなります。アップロードの上限に当たったり、結局縮小されたりします。

OCRの言語を指定しない。 OCRmyPDF は指定が無いと英語として読みます。日本語の紙では -l jpn が必要です。

AIの読み取りをそのまま予定に入れる。 日付や金額は原本と見比べてから登録した方が安全です。プリントを予定に落とす流れは学校のプリントをカレンダーとリマインダーに登録する仕組みに書いています。

よくある質問

Q. スキャンしたPDFの文字が読み取れないのはなぜですか?

文字の層が無いか、あっても使えない状態になっていると考えられます。代表的なのは3つです。画像だけのPDFと、OCRの誤認識。それに文字コードの対応が無い場合です。どれに当たるかは pdftotext と pdffonts である程度見当がつきます。

Q. pdftotext が空でもエラーにならないのはなぜですか?

文字の層が無いPDFは、壊れているわけではないからです。取り出す文字が無いので、空の結果を正常に返します。エラーが出ないぶん、自動処理では気づきにくいですね。

Q. コマンドを使わずに済ませる方法はありますか?

あります。PDFを開いた画面をスクリーンショットで撮れば、それが画像です。スマホなら元の写真をそのままAIに渡すのも手だと思います。枚数が多いときだけコマンドが楽になります。

Q. PNGとJPEGはどちらがよいですか?

文字が中心の紙ならPNGが無難です。JPEGは圧縮で文字のふちがにじむことがあります。ただ、ファイルが大きすぎるときは -jpeg に変えると軽くなります。

Q. PyMuPDF など別の道具でもよいですか?

かまいません。僕はドリルの一括スキャンと仕分けでは PyMuPDF で画像にしています。やっていることは同じで、ページを画像に変えるだけです。手元にある道具で十分だと思います。

Q. OCRmyPDF は必ず使うべきですか?

いいえ。AIに内容を読ませるだけなら画像で足ります。PDFを保管して後から検索したい、という目的があるときの選択肢です。

Q. 手書きの文字も読めますか?

AIの画像の読み取りなら、読めることは多いです。ただ、くせ字や薄い鉛筆書きは誤読が増えます。Tesseract のような従来型のOCRは、手書きは得意ではないとされています。

Q. スマホだけで完結できますか?

できます。スキャンアプリから画像(JPEG)で書き出して、AIのアプリに渡せば同じことです。PDFにする必要があるのは、複数ページを1ファイルにまとめたいときくらいかもしれません。

参考にした公式情報

まとめ

スキャンしたPDFは、見た目と文字の層が別物です。pdftotext が空なら、悩まずに pdftoppm で画像にする。僕の手元ではそれで読めました。原因の特定は後回しでも困らないと思います。

紙の情報がデータになると、比べる作業が楽になります。習い事の月会費も、スマホの料金も同じですね。数字を並べて見るだけで、判断はだいぶ軽くなるのではないでしょうか。

契約しなくても必ず100ポイントもらえるシミュレーション 通信費も、数字を並べて見直してみる

押すと楽天のログインページが開きます。ログイン後にキャンペーン内容が表示されます。

本記事にはアフィリエイト広告を含みます。当サイトのリンクを経由して商品・サービスへお申し込みいただいた場合、提携先企業から成果報酬を受け取ることがあります。 また、運営者は楽天グループに所属する社員であり、紹介プログラムを通じた報酬を受け取る場合があります。記事内容・評価は広告の有無にかかわらず、運営者の実体験と調査に基づき作成していますが、 上記の関係性をご理解のうえお読みください。詳しくは免責事項・アフィリエイト表記をご覧ください。

楽天モバイルの通信エリア・電波状況について気になることがある方は、公式の電波改善・調査依頼フォームからご相談いただけます。

ABOUT THE AUTHOR
まさきん

楽天グループ勤務・デジタルマーケター(FP資格保有)

40代前半、共働き・四児の父。楽天グループでデジタルマーケターとして勤務するかたわら、ファイナンシャルプランナー(FP)の資格を活かして家計管理と資産形成にも力を入れている。

プロフィールを見る

関連記事

RELATED
Gemini(Google AI Pro)のファミリー共有は家族5人まで。設定手順と範囲 AI活用

Gemini(Google AI Pro)のファミリー共有は家族5人まで。設定手順と範囲

Google AI Proは管理者のほか家族5人まで共有できます。Geminiアプリとストレージは共有でき、YouTube Premium Liteは管理者のみ。Flowの上限は家族で分け合います。設定手順と子どものアカウントの扱いを公式ヘルプで整理しました。

2026.10.13 · 読了 13分
AIサブスクの請求日と家計簿がずれる3つの理由|Claudeはアップグレードで請求日が変わる AI活用

AIサブスクの請求日と家計簿がずれる3つの理由|Claudeはアップグレードで請求日が変わる

Claudeは月の途中でMaxへ上げると請求サイクルがリセットされ、その日が新しい請求日になります。ドル建ての円換算はカード会社にデータが届いた時点で決まり、明細や家計簿の反映は数日遅れます。領収書メールを正本に月を決める5つの手順をまとめました。

2026.10.13 · 読了 13分
freee会計の未処理明細を月1回の消込便に。毎月5日7:30・3区分・上限15件で人に回す設計 AI活用

freee会計の未処理明細を月1回の消込便に。毎月5日7:30・3区分・上限15件で人に回す設計

freee会計の未処理明細が18件ほど、週次の確認6回ぶん動かないまま残っていました。毎月5日の朝7:30に自宅Macで動かす消込便の設計と、確定できる分は月1件・迷う明細は1件ずつ上限15件で人に回す線引きをまとめます。

2026.10.12 · 読了 13分
楽天モバイルに乗り換えで最大14,000ポイント 契約しなくても必ず100ポイントもらえるシミュレーション →
いますぐエントリー →