AcrobatProで埋め込まれたフォントの構造を確認する

まいどおなじみTenです。つい先日まで自治会の会長さんというやつをやっていたのですけど、ドキュメントの整備や広報の配布作業とかで手を取られてあっぷあっぷでした。ドキュメント整備からも開放されたのでそろそろエクステンション作りたいなって思っています。まずはIllustrator向けのカラーフォントエディタを作りたいと思います。
まあ、それはおいておいて、先日はAcrobatのPDF内部構造の参照機能を見ていただいたんですけど、Acrobatさんには他にも面白い機能がありますので、今回はそちらをご紹介する次第です。
まず、例によってPDFの内部構造を覗き見してみます。

このようにフォントが埋め込まれていて色々と情報が見えるのがおわかりいただけるかと思います。ここで見えているCFFというのはCompact Font Formatの略称で、Postscript系フォントの中核をになうテーブルとなります。CFFにある情報だけで最低限フォントとして扱う事のできるデータとなっていますのでフォントの埋め込みにはこのCFFが利用されます。
Postscript系フォントの埋め込みデータ
CFFという形式でミニマムなフォントが埋め込まれるというのは先に説明したとおりです。これがどのように埋め込まれているのかを見てみましょう。
まずプリフライトパネルのメニューからフォントの内部構造を参照します。

メニューを選択してCFFアイコンのところを展開します。

では、細かく見ていきます。

Headerにはフォントのバージョン情報等が含められています。

NameIndexにはポストスクリプトフォント名が記述されます。

フォントの細かい設定類は、TopDictに集約されています。このTopDictにCIDFontVersionが含まれるフォントはCID Keyed Fontです。CIDフォントの場合、エンコーディングとは直接紐付かないのですが、CFFとして埋め込まれる場合はCharsetIndexにCIDのリストが記述されます。多くの場合CIDベースのフォントであればAdobe-Japan1に準拠します。サブセットとして抜き出されたCIDとUnicodeの対応がCharsetに記述されます。

この例ではCharsetはフォーマット1の単純に1:1でCIDとUnicodeが紐づくかたちで記述されています。
FDArrayとFDSelectの働き
FDSelectとFDArrayに関してはCIDKeyedフォントがヒント情報を取り扱う際に利用されるものです。

CIDはグリフをグループ分けし、そのグループ毎に同一のサブルーチンを参照できるように構成されています。この例では「かな」と「アルファベット」がそれぞれグループ分けされ適切なFDArrayの項目を参照するように構成されています。
Charstring
Charstringはグリフそのものが記述されたテーブルです。CharstringのフォーマットはType2フォーマットが利用されます。

該当のグリフを選択すると右側にCharstringを解釈したものが描画されます。オペレータにはヒントに関連するstem,hintに関するものと実際に曲線を構成するmove,line,curve関連のものがあります。これらはType2書式に則って処理されます。
右側に表示されるプレビューでは各ポイントに付随するハンドルも表示されます。CFFの場合、表示はIllustrator等のベジェ曲線と全く同じものになります。
ちなみに…
TrueTypeフォントだと…

このように3次のベジェ曲線でデータが用意されています。曲線の構成に制限がありますので、品質を向上させるために2048unit/emが利用可能になっています。(Postscript系では1000unit/em)
続いてバリアブルフォントの例を見てみましょう。

これはMinionのバリアブルです。バリアブルフォントの場合、フォントフォーマットがCFF2に変更されています。これはバリアブルな仕組みを実装するためにCFFを拡張したもの(廃止された実装も多いのですが)なんですけど、このCFF2を処理できるアプリケーションはごく限られたものです。そのため、PDFにフォントを埋め込む際にCFF2からCFFへの変換が行われます。なので、埋め込まれたフォントにはバリアブル機能が残されずAcrobat上でフォントウエイトを変更できません。というかAcrobat自体がバリアブルフォントに対応していません。また、CFFに変換されたフォントはIllustratorで開いても、書き出し時に変換された事で元のフォントとは認識されないためアウトライン化されてしまいます。

こちらは日本語対応の源ノ角ゴシックのバリアブルフォントです。漢字などの複雑な文字では欧文の様に複合化された状態ではなくパーツごとに作成されたものを重ねる事でグリフを表現しています。この状態をサポートするためにCFFではワインディング規則であった複合パスの仕様がCFF2では奇遇規則に変更されています。
以上の様にAcrobatでは埋め込まれたフォントについて詳細に確認することが出来ます。これを利用して意図しない文字化けやフォントのバージョンによる問題の検証などが可能となっています。これらの情報はフォントの構造を学ぶ際にも有用な情報です。ぜひご活用ください。