golden-luckyの日記

ツイッターより長くなるやつ

PDFから「使える」テキストを取り出す(第1回)

PDFからテキストを取り出すのは、意外と大変です。 それにはいくつかの理由があるのですが、もっとも根本的な点で真っ先に解決が必要になるのは、人間が雑に文字としてみなしている絵(「グリフ」)をコンピューターで扱えるような「文字」にする方法です。

これには2つのアプローチが考えられます。

  1. PDFビューワーでファイルを開いた状態から何とかしてテキストを読み取る
  2. PDFファイルの中身を解析してテキストを抜き出す

このうち2つめの話は明日以降にして、今日は1つめの話をします。

PDFビューワーでファイルを開いた状態から何とかしてテキストを読み取る方法

この方法は、言ってみれば、人間もしくは人間のように振る舞うソフトウェアによりPDFビューワーの表示を「視覚的に読む」ということです。 これはPDFの本来の使い道に即した手法です。 PDFというのは、グリフ(文字の形)をページ上に表示するための汎用の仕組みだからです。

ここで厄介なのが、グリフは文字そのものではない、という点です。 「文字そのもの」と書くと哲学的に聞こえますが、ここでは「さまざまなコンピューター環境の間でやり取りして文字としての意味が保たれるようなもの」くらいの意味だと思ってください。 ようするに、「コンピューターで扱えるように表現されてる文字」です。

このように「文字」を定義すると、「PDFからテキストを取り出す」という目標は、「PDFファイルをビューワーで開いたときに表示される絵から、文字を手に入れる」と言い換えられます。 「文字」をもうちょっと狭く、「なんらかの符号化方式でUnicode文字集合のどれかを表してる情報」だとすれば、「PDFファイルからUTF-8のテキストデータを手に入れる」と言ってもかまわないでしょう。

さて、なんでこんな回りくどい話をしてるんでしょうか。 それは、「人間がPDFをビューワーで開いて読む」というのが、コンピューターにとってはそんなに自明な話ではないことを強調したいからです。 人間は通常、PDFを目で読むわけですが、そのときは「文字」、つまりコンピューターで扱えるような表現としての文字を抜き出しているわけではありません。 そして、PDFはもともと人間が目で見るドキュメントのために作られたデータフォーマットなので、そもそもコンピューターで扱えるような文字を取り出しやすいようにはできていないのです。

人間がPDFを読むように、コンピューターでPDFのページに表れる「グリフ」をいい感じに「文字」にする方法があれば、PDFからテキストを取り出せます。 そのための方法としていま利用できるのは、いわゆるOCRくらいでしょう。

ちなみに、PDFビューワーで開いて文字列を選択してコピペする、みたいな方法は、コンピューターでコピペの操作の対象になるのがそもそも「グリフ」ではなく「文字」なので、人間がPDFを読むのとはまったく違う作業です。 PDFからコピペしたら意図した文字とは違う文字しか取れなかった、という経験がある人も多いと思いますが、これはまさにPDFに表れている「グリフ」は「文字」ではないことによります。 ちなみに、フォントが埋め込まれているかどうかはまた別の話で、フォントは埋め込まれているけど意図通りにコピペできない、みたいな例もよくあります。

というわけで人間のようにグリフから文字を取り出すにはOCRするしかないと思うのですが、これには物理装置の認識精度みたいな手元のパソコンで気軽に手を出しにくい要素も絡むので、あまりちゃんと調査してません。 ただOCRかどうかに限らず、「人間のようにPDFのグリフから文字を取り出す」手法は画像解析やAIの応用が進めばかなり未来がある方法だと思うので、いつか取り組みたいと思います。

PDFの仕様について(ちょっと脇道)

ところで、PDFのビューワーといえばAdobeAcrobatなんですが、これはみんなが想像している以上にすごいツールです。 PDFファイルをできるだけ正しく閲覧するには、現時点ではAdobe社の技術に頼るしかありません。

で、いま「PDFファイルをできるだけ正しく」と言いましたが、正しいとか正しくないとか言えるのは、PDFに国際的に標準化された仕様があるからです。 国際標準化機構、つまりISOによる現在の最新のPDFに関する仕様はISO 32000-2:2017で、これはPDF 2.0というバージョン名で呼ばれています。

ただ正直なところ、PDF 2.0に準拠して生成されたPDFはぼくの周りにでは滅多に見かけません。 なにより、ISO 32000-2:2017の仕様書はISOから購入しなければならず、ぼくはこれを購入してないので、PDF 2.0についての話はこれでおしまいです。 以降、PDFといったら、それはPDF 1.x系列に準拠したPDFのことを指します。

そのPDF 1.x系列は、最終バージョンがPDF 1.7で、これはISOの標準化としてはISO 32000-1:2008に相当します。 それより前、つまりPDF 1.6よりも若いバージョンの仕様は、ISOによって標準化されたものではなく、Adobeによるプロプラな仕様でした。

そもそもPDFは、「さまざまなシステムで同じ見た目で表示できるドキュメント形式」を目指してAdobeが開発したファイル形式です。 PostScriptと同じことができる軽量で高速なドキュメント形式として考案されたらしいんですが、いつの間にかPostScriptそのものより多機能になってしまいましたね…。 Acrobat以前の歴史はわりと面白いので、みんなこの記事を読むといいと思います。

ありがたいことに、AdobeではPDFの仕様に対するリファレンスを無償で配布してくれています。 PDF 1.7についてAdobeが配布しているのは、PDFリファレンスの「第6版」です。 1.7なら第7版になりそうなものなんですが、PDFのバージョンを1.2にしたときにAdobeではPDFリファレンスを第2版にせず第1.1版にしたので、それからずっと1ずれてしまっています。

というわけで、現時点のPDFについて何か調べたいと思ったら、ISO 32000:1:2008であるところのPDF 1.7の仕様を網羅したPDFリファレンス第6版にあたることになります。 PDF形式で配布されているので、必要に応じてAcrobatで開いて見てもいいんですが、1310ページもあると紙でめくったほうが目的の情報に素早く行き当たるので、当社ではすべて印刷してパラパラ眺められるようにしています。

f:id:golden-lucky:20191201001415j:plain

明日は「PDFファイルの中身を解析してテキストを抜き出す」について書ければと思います。