23 | 1月 | 2013 | HMDT Blog

カテゴリー : 2013年 1月23日

PDFとの格闘はToUnicodeへ


先日、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言語をサブセットとして持っている事だね。スクリプト言語やマネージドコードとかいった輩は、どうにもならない檻の中だ。