このBlogは移転しました。今後は aish.dev を御覧ください。

Apache PDFBox日本語対応パッチ

Apache PDFBox はPDFファイルの操作や内容の抽出などを行うオープンソースのライブラリで、最初にリリースされてからの歴史も長く、結構メジャーなライブラリである。InfoPileで利用しているApache Tika プロジェクトでも標準のPDF読み込み機能として採用されている。

しかし、残念なことにPDFBoxはCJKなテキストをほとんどサポートしておらず、日本語PDFではほとんど使い物にならない。他のPDFライブラリに切り替えるのも手だが、他に日本語が扱えるJava製ライブラリが存在するのかどうか不案内だし、切り替えると Tika まで直しにかからないといけなくなってしまう。というわけで素直にPDFBoxの日本語対応にチャレンジしてみた。PDFとかPostScriptとかあんまり詳しい方ではないけど、なんとかなるだろう。

調べてみると、今年の春頃に日本語対応にチャレンジされた方 がいて、いったんはacceptされたものの既存のテストケースでエラーが出てしまう、ということでrevertされてしまっていた。この路線でもうちょっとがんばれば何とかなりそうではある。

上記のパッチで問題となっているのはType0フォントでエンコーディングがIdentity-Hと指定されており、でもTO_UNICODEテーブルが指定されてないのでPDFBoxではどうやってテキストデータをUnicodeに変換して良いのか分かりません、というケースだ。これは多分PDFの仕様的にはテキストを抽出できなくても文句言うなよ、という状態だと思うので、素直にできません、といってしまいたいところだ。が、最近のPDFでフォントを埋め込んでいるPDFはこんな感じになってしまっているのが多いようで、無視してしまうわけにもいかない雰囲気。

元のパッチでは無条件でIdentity-HをAdobe-Japan1-UCS2に変換してしまっており、これではテストでエラーが出てしまっても仕方ないだろう。と言って、じゃあどうやって変換テーブルの名前を持ってくればよいのだろうか?

手詰まりっぽい空気を感じながら他のPDFライブラリを参考にしてみると、Python製のPDF読み込みライブラリ pdfminerというのを発見した。こちらではType0フォントの場合、実際に使用するフォントのCID情報からRegistryとOrderingを取り出し、使用する変換テーブルを決定していた。これと参考にPDFBoxにも似たような処理を追加すると、おお、なんか良い感じになった!

いくつかPDFを試していると、フォント情報に文字幅をちゃんと埋め込まないPDF生成ツールがあるのを発見した。このツールで作成されたPDFに限って抽出されたテキストが変な感じになってしまう。PDFBoxに文字幅情報が無い場合の処理を追加すると、ちゃんと読めるようになったっぽい。

そんなこんなで作成した日本語対応のPDFBox、Bazzarリポジトリこちら

     bzr branch lp:~aishimoto/+junk/pdfbox-ja

でブランチを取得できる。

現状では十分なテストを行っておらず、ネットで拾ってきたPDFで試しただけなので、どの程度使えるのかまだ未知数だ。PDF使いの皆様、是非ともこのブランチをお試しの上、結果を報告していただきたい。ある程度のフィードバックが集まったら本家にパッチを登録したいと思う。