PDFからテキストを抽出する方法|抽出が要るPDFと、要らないPDF
「PDFからテキストを抽出したい」という要件は、実は2つのまったく違う作業をひとまとめにした言い方です。どちらなのかで手間が10倍変わります。
- 文字がデータとして入っているPDF:取り出すだけ。数秒で終わる
- ページ全体が画像になっているPDF:画像から文字を読み取る処理が要る。精度は元画像次第
私はArchiveSealというWebページ保存用のChrome拡張機能を開発していて、PDFの中身をどう持たせるかを実装側から扱ってきました。ここでは判別のしかたと、それぞれの取り出し方、そしてそもそも抽出が要らない残し方まで整理します。
まず3秒で判別する
PDFを開いて、本文の文字をマウスでドラッグしてみてください。
- 文字が青く反転して選択できる → 文字データが入っている
- 反転しない、または四角い画像ごと選択される → ページが画像
これで作業の種類が決まります。判別の詳しい理屈はPDFの文字検索のやり方|できるPDFとできないPDFの違いに書きました。
選択できるPDFなら、抽出という言葉を使うほどの作業は要りません。選択できるPDFからの取り出し方
3通りあり、量で選びます。
| 量 | 方法 |
|---|---|
| 数行 | ドラッグして Ctrl + C(Macは ⌘ + C)でコピー |
| ページ単位・全文 | ビューアの「テキストとして書き出し」「名前を付けて書き出し」機能 |
| 複数ファイルを一括 | 変換ツールやコマンドラインのライブラリで処理する |
書き出したテキストは、改行やレイアウトが元のとおりには並びません。段組みのある資料では列がまざることがあります。表を含む資料なら、テキストではなく表形式で書き出せる機能を使ったほうが早いです。
選択できないPDF(画像PDF)の場合
こちらは、画像から文字を読み取る処理——OCRが必要になります。スキャンした書類、スクリーンショットを貼って作ったPDF、FAXから起こした資料などが該当します。
OCRに対応したツールはいくつもあります。オンラインで完結するもの、PDF編集ソフトの機能として持つもの、クラウドサービスのAPIとして提供されるものがあり、用途と機密性で選ぶことになります。精度は元画像の解像度・字体・傾きに左右されるので、重要な資料では読み取り結果を必ず目視で確認してください。
なお、私が開発しているArchiveSealはこの読み取り処理には対応していません。画像から文字を推測する機能は持っていないので、手元にすでにある画像PDFを扱う場面では、OCRに対応した別のツールを使ってください。
スクリーンショット由来のPDFがなぜ画像になるのかはスクショをPDFに変換する方法で扱っています。
元がWebページなら、抽出せずに済む
ここが一番言いたいところです。
OCRは「絵になってしまった文字を推測し直す」作業です。最初から絵にしなければ、推測は要りません。Webページには、はじめから文字がデータとして存在しています。ブラウザが表示しているのは、その文字を並べた結果です。にもかかわらず、画面を撮って画像にしてからPDFにすると、自分で文字を絵に変えてしまうことになります。あとからOCRで戻すのは、その往復ぶんの精度を捨てているだけです。
したがって、Webページを後から読み返す・引用する・検索する予定があるなら、保存の時点で文字が残る方法を選ぶのが最短です。方法の比較はWebページをPDFで保存する方法にまとめました。
実装の話:文字をどう残しているか
ArchiveSealでの扱いを、実装の側から具体的に書きます。
保存の流れは、まずページのDOMから本文を取り出し、あわせて画面の見た目を画像として取得する、という2本立てです。DOMから取った文字は推測ではなく元データそのものなので、読み取り精度という概念がありません。
そのうえで、Pro版のPDFでは、取り出した文字を画像の上に「見えないテキスト」として、元の位置の座標に合わせて重ねます。目には画像しか見えませんが、PDFビューアの検索機能や文字選択は、その見えない層を拾います。無料版のPDFは画像のみで、この層は入りません。
実装で一度つまずいた点も書いておきます。この見えない層の文字サイズを小さくするほど多くの行を詰め込めるのですが、1ptを下回ると Chrome内蔵のPDFビューアが日本語を検索の対象から外すことが分かりました。macOSのプレビューでは0.5ptでも検索できていたため、ビューアによって結果が変わる状態になっていたのです。現在は1ptを下限にしていて、Preview・Chrome・Acrobatのいずれでも拾えるようにしています。
「PDFにテキストが入っている」ことと「どのビューアでも検索できる」ことは、同じではありません。なお、この種のテキストレイヤー付きPDFを作れるツールは他にもあります。たとえばFireShotも有料版でテキストレイヤーを持つPDFを出力できます。違うのは方式で、ArchiveSealはDOMから本文を取り出す設計を採っています。
検索が効かないときの切り分けはPDFが検索できないときの原因と対処にまとめています。
よくある質問
PDFからテキストを抽出するにはどうすればいいですか?
まず本文をドラッグして選択できるか試してください。選択できるPDFは文字がデータとして入っているので、コピーするか、ビューアの「テキストとして書き出し」機能を使えば取り出せます。選択できないPDFはページ全体が画像なので、画像から文字を読み取る処理(OCR)に対応したツールが必要になります。
書き出したテキストの改行や順番が崩れます。
PDFは文字を配置した結果を持つ形式で、文章の構造を保持しているわけではないためです。とくに段組みのある資料では、隣り合う列の文字がまざって並ぶことがあります。表を含む資料であれば、テキストではなく表形式で書き出せる機能を使うほうが手戻りが少なくて済みます。
ArchiveSealでPDFからテキストを取り出せますか?
画像から文字を読み取る処理には対応していないため、手元にすでにある画像PDFを扱うことはできません。ArchiveSealが行うのは保存の側で、Webページを保存する際にページのDOMから本文を取り出します。手持ちの画像PDFを扱う場合は、OCRに対応した別のツールをお使いください。
Webページのテキストだけを取り出したいときはどうしますか?
Webページには最初から文字がデータとして存在するので、画像化を経由しないことが要点です。画面を撮って画像にしてからPDFにすると、自分で文字を絵に変えてしまい、あとからOCRで推測し直すことになります。後で読み返す・引用する予定があるなら、保存の時点で文字が残る方法を選んでください。
PDFにテキストが入っていれば、どのビューアでも検索できますか?
必ずしも一致しません。ArchiveSealの開発中に、画像の上に重ねる見えないテキストの文字サイズが1ptを下回ると、Chrome内蔵のPDFビューアが日本語を検索の対象から外すことが分かりました。macOSのプレビューでは同じファイルが検索できていたため、ビューアによって結果が変わる状態になっていました。現在は1ptを下限にしています。
まとめ
- 最初にドラッグして選択できるかを確かめる。ここで作業の種類が決まる
- 選択できるならコピーか書き出しで終わり。改行と段組みの崩れだけ注意する
- 選択できない画像PDFはOCRが要る。ArchiveSealはこの処理には対応していない
- 元がWebページなら、画像化を経由しなければ抽出そのものが要らない
- 「テキストが入っている」と「どのビューアでも検索できる」は別。1ptの下限のような実装差がある
抽出は、絵にしてしまったあとの後始末です。残す段階で決めておけば発生しません。
