PDFとの格闘はToUnicodeへ
- 2013年 1月23日
先日、PDFからテキスト抽出するためにCIDからUnicodeへのマップを作っている、と書いたら、「Fontディレクトリに含まれているToUnicodeを使うべし」というコメントをいただいた。
まったくもってその通りで、PDFの仕様書には、テキストを取得するにはToUnicodeを使えばいいよ、と書いてある。だけど、これは必須項目ではないので、巷にあふれているPDFファイルには、ToUnicodeが含まれているものもあれば、含まれていないものもある。というか、含まれているの見た事ねーよ!
と嘆いたら、「Appleの開発者向け日本語ドキュメントには含まれているよ」とのコメントが。早速確かめてみると、あったよ!これかー。なので、それをサンプルとしてToUnicode取得とストリームスキャンのためのコーディングをしている。
ちなみにこのPDFは、Creatorは不明。ToUnicodeが含まれていないPDFは、CreatorがAdobe Acrobatだったりする。Acrobat、貴様、ちゃんと入れとけよ。
CGPDFだと、Fontディレクトリから、ToUnicodeストリームを取得するところまでは、APIを使ってできる。でも、このストリーム(CGPDFStream型)からは、生データを取得できるのみでそれ以上のサポートはなし。あとは手作業で取っていくしかない。シクシク。ちなみに、PDFページのストリームを表すCGPDFContentStream型だと、もうちょっとサポートがあって、operatorのパースまでしてくれる。
でも、標準のAPIに機能が用意されてなくとも、その場ですぐにC言語にスイッチして低レベルのアクセスができるってのは、ほんっとに嬉しいし安心感がある。Objective-Cの最高の強みは、C言語をサブセットとして持っている事だね。スクリプト言語やマネージドコードとかいった輩は、どうにもならない檻の中だ。