PDFとの格闘で、CIDからUnicodeへのマップを作る | HMDT Blog

PDFとの格闘で、CIDからUnicodeへのマップを作る


引き続き、PDFと格闘中。

PDFの内部データ触るには、CGPDF系の関数を使えばいい。その辺りは、iOSが提供してくれるので、ありがたく使わせてもらう。

そこまではいいんだけど、PDFから取得できるテキストデータは、CIDの形になっている。表示するだけならいいんだけど、コピーや検索するには、これをUnicodeに変換しないといけない。CIDからUnicodeへの変換が、ない。だいたいみんな、ここでひっかかる。

たぶん、Appleは持っているはず。PDFでコピーできるから。OS Xでは、PDF Kitを使えばテキスト取得できる。でも、iOSではない。

ないものは作ったれー!ということで、CIDからUnicodeへのマップを作っております。非常に原始的に、Adobe-Japanの仕様書を見て、対応するUnicodeの値を調べて、テキストエディタで記入する。

こんな方法しかないのかー!?やってみると、縦書き文字なんかもあるから、機械的にできないところもある。手でやるしかないのかー。

しかし、これさえ出来上がれば、PDFのコントロールは完全に我が手に。なるはず。

    • K
    • 2013年 1月22日

    フォントが持ってるCMAPは触れないんでしたっけか?

    • K
    • 2013年 1月22日

    失礼、逆変換かぁ。

    • mkino
    • 2013年 1月22日

    触れますよ。正確に言うと、フォントのテーブルのタグを指定して、
    cmapの生データを取り出す事はAPIでできます。
    そっから先は手作業です。

    今回は、ある程度のところまではcmapでやって、
    それで不十分なところを手作業で補完してます。

    • mkino
    • 2013年 1月22日

    あぁ、はい、逆変換です。

    だから、もっと正確に言うと、
    cmapでUnicode to Glyphの変換が得られるので、
    それをもとにGlyph to Unicodeのマップを作成。

    ただし、UnicodeとGlyphの間は1対1関係ではないので、
    cmapからは漏れるGlyphがある。
    それを手作業で補完。

    ってことですね。

    • norihto
    • 2013年 1月22日

    PDFの中にToUnicodeのcmapがあると思います。
    Adobeの定義したエンコードに準拠しないケースもあるので、ToUnicode cmapが格納されているときはこちらを参照した方が確実です。仕様書の Extraction of Text Content に記述されています。

      • mkino
      • 2013年 1月22日

      ToUnicodeのcmapがない場合があります。
      というか、日本語のPDFで埋め込まれているもの、見た事ないです。
      何にせよ、埋め込まれていないPDFが存在する以上、
      どうにかして対応することになります。

        • norihto
        • 2013年 1月22日

        ToUnicodeはAppleの開発者向け日本語ドキュメントのPDFには含まれているようです。
        https://developer.apple.com/jp/devcenter/ios/library/japanese.html

          • mkino
          • 2013年 1月22日

          ありました!ありがとうございます。
          ちゃんとあるじゃないか。

          でも、あるやつはいいんですけど、ないやつもどうにかせんとはいかんです。

            • norihto
            • 2013年 1月22日

            がんばってください!

  1. 2013年 1月23日
    トラックバック先 :PDFとの格闘はToUnicodeへ | HMDT Blog