True TrueTypeフォント名とPDFエクスポート

Ursula Le Guinの著書「The Seaside of the Seaside」では、魔法はウィザードが機能するものの「本当の名前」の知識を要求しました。 どんなプログラマーも、そのアイデアが健全であることに同意すると思います。 URL、UUID、およびオブジェクトの他の一意の識別子は、私たちが常に対処するものです。 そして、魔法使いの世界のように、これらの本当の名前を見つけるのはそれほど簡単ではありません。 少なくともフォント名についてはそうです。



私たちのソフトウェア製品では、テキストブロックのPDFへのエクスポートを実装する必要がありました。 独自のAdobe PDF Library(http://datalogics.com/products/pdfl/)およびアドオンDLI(Datalogics Library Interface)アドオンがエクスポートに使用されます。 私はこれらのライブラリを掘り下げることはしません。だれにも興味がないと思います。 しかし、私が遭遇した問題はPDFエクスポートの実装に共通していると思います。



各フォント(Arialなど)には、レギュラー、ボールド、斜め、ボールド斜めの4つの異なるスタイルがあります。 つまり Arial、Arial Bold、Arial Italic、およびArial Bold Italic。 各スタイルは、個別のTTFファイルまたはTTCファイルの個別のセクションに保存されます。 また、斜めまたは太字のフォントをPDFファイルに印刷する場合は、対応する関数の呼び出しで「Arial Italic」または「Arial Bold」を明示的に指定する必要があります。 ただし、エクスポートするテキストブロックでは、そのフォントが「Arial」であり、太字と斜体の属性が個別に設定されていることが示されています。 そして、EnumFontsFamiliesExは「Arial」という名前のみを返し、それだけです! Q必要な「Arial Italic」文字列を取得するにはどうすればよいですか?



明らかな解決策(フォント名に「斜体」の行を単に割り当てる)は、常に機能するとは限りません。 たとえば、フォント「Lucida Sans Typewriter」では機能しません。 「Lucida Sans Typewriter Italic」を渡すと、PDFライブラリはエラーをスローします。



決定の鍵は、HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fontsです。 このキーの内容を調べるだけで、「Lucida Sans Typewriter Oblique」を送信する必要があることが明らかになります。 その後、すべてが動作します。

このキーのエントリの形式はどこにも文書化されていませんが、明らかなようです:



「Arial(TrueType)」=「arial.ttf」

「Arial Italic(TrueType)」=「ariali.ttf」

「Arial Bold(TrueType)」=「arialbd.ttf」

「Arial Bold Italic(TrueType)」=「arialbi.ttf」

「バタン&バタンチェ&グングス&グングスチェ(TrueType)」=「batang.ttc」

...

「Mangal(TrueType)」=「mangal.ttf」

「Mangal Bold(TrueType)」=「mangalb.ttf」

「メイリオ&メイリオイタリック&メイリオUI&メイリオUIイタリック(TrueType)」=「メイリオ.ttc」

「メイリョボールド&メイリョボールドイタリック&メイリョUIボールド&メイリョUIボールドイタリック(TrueType)」=「meiryob.ttc」

「MSゴシック&MS PGothic&MS UIゴシック(TrueType)」=「msgothic.ttc」

...

「ルシダサンズタイプライターレギュラー(TrueType)」=「LTYPE.TTF」

「Lucida Sans Typewriter Bold(TrueType)」=「LTYPEB.TTF」

「Lucida Sans Typewriter Bold Oblique(TrueType)」=「LTYPEBO.TTF」

「Lucida Sans Typewriter Oblique(TrueType)」=「LTYPEO.TTF」



TTCコレクションの場合、それらに含まれるフォントは「&」で示されていることがわかります。



共通のフォント名とフォント名の対応を確立するアルゴリズムは次のとおりです。各フォント名について、残りがEnumFontsFamiliesExから受け取った名前に一致するまで、末尾から1つの単語を切り取ります。 さらに、切り取られた単語は、「太字」、「Ilalic」、「Semibold」、「Oblique」という単語と一致するかどうかがチェックされ、このスタイルに対応する属性が記憶されます。 たとえば、「Lucida Sans Typewriter」ファミリーの場合:



ルシダサンズタイプライターレギュラー->ルシダサンズタイプライター

ルシダサンズタイプライターボールド-> ルシダサンズタイプライター

Lucida Sans Typewriter Oblique-> Lucida Sans Typewriter

Lucida Sans Typewriter Bold Oblique-> Lucida SansタイプライターBold- > Lucida Sansタイプライター



フォント「Lucida Sans Typewriter Bold Oblique」を太字および斜体で印刷する場合、このフォントがフォントに対応し、この名前をPDFライブラリに転送することがわかります。



ただし、ここでもう1つ問題があります。 たとえば、フォント「Mangal」には太字の面(「Mangal Bold」)しかありませんが、傾斜はありません。 このフォントに属性 "oblique"を設定できますが、この場合、Windows GDIは画面に表示されるときに既存のスタイルを独立して歪めます。 PDFにエクスポートするときは、自分で行う必要があります。 PDFライブラリを使用すると、テキスト出力の変換マトリックスを指定できます。 たとえば、私の場合、次のようになりました。



ASFixedMatrix fontSkew;

if(bSimulateItalic)

{

ダブルアングル= 15;

fontSkew.a = fixedOne; // Xスケール

fontSkew.b = fixedZero; //回転と傾斜

fontSkew.c = FloatToASFixed(tan(_PI * angle / 180)); //回転と傾斜

fontSkew.d = fixedOne; // yスケール

fontSkew.h = 0; // x変換

fontSkew.v = 0; // y変換

dlpdfcontentfontskew(...、&fontSkew);

}



大胆にシミュレートするための美しいソリューションは見つかりませんでした。 太字にする必要がある行を、わずかにずらして数回印刷します。 視覚的にはすべてが正常に見えますが、PDFファイル内のテキストが重複しているのはイライラします。



しかし、これで終わりではありません。 開発中の製品には日本語版があります。 したがって、アジアのフォントを使用した正しい作業には特別な注意が払われます。 そして、さらに2つの問題が発生します。



最初の問題から始めましょう(歴史的にはすべて2番目の問題から始まりましたが、ストーリーの一貫性のために簡単です)。 Googleは、フォント「MS Pゴシック」は実際にはMSゴシックであると言っています。 日本語ロケールがシステムに設定されている場合、彼は日本語名を取得することがわかります。 さらに、レジストリではもちろん、彼はMSゴシックという名前のままです。 これは、EnumFontsFamiliesExの通常の動作です。 ドキュメントの引用は次のとおりです。「多くの東アジア言語のフォントには、英語名とローカライズされた名前の2つの書体名があります。 「システムロケールがフォントの言語と一致しない場合、EnumFonts、EnumFontFamilies、およびEnumFontFamiliesExは英語の書体名を返します。」



ところで、「MS Pゴシック」が「MSゴシック」であることがわかった場合、これは少なくとも英語名がレジストリに保存されている場合の2番目の問題も解決します。 「MS Gothic」という名前をPDFライブラリに転送するだけで機能します。 この通信を確立することは残っています。

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fontsのほとんどのスタイルでは、EnumFontsFamiliesExからフォント名をマップしました。 しかし、一部のスタイルでは、ペアが見つかりませんでした。 それでも-レジストリには「MS Gothic」があり、EnumFontsFamiliesExは「MS Pゴシック」を返しました。

この場合、TTF / TTCファイルを独立して解析し、対応する日本語名をそこに見つけるだけです。



TTC / TTFファイルの解析は簡単なタスクです。 実際のサンプルでは、​​「ttf2eot」 プロジェクトcode.google.com/p/ttf2eotのソースコードを取得できます。 TTF / TTC形式自体は、MicrosoftのWebサイト( www.microsoft.com/typography/otspec)で詳細に文書化されています。 TTFのすべてのデータはビッグエンディアン形式で保存されているため、使用する前にすべての数値とUnicode文字列を変換する必要があることに注意する必要があります。



残念ながら、私は自分のコードをレイアウトする権利がないので、ここで何を探すべきかを書きます。



「名前」テーブルwww.microsoft.com/typography/otspec/name.htmに興味があります。 次を含むレコードを選択します。







見つかった名前の1つは、EnumFontFamiliesExの名前と一致します。



たとえば、meiryob.ttcを調べた「Meiryo Bold Italic」スタイルの場合、EnumFontFamiliesExの名前「メイリオ」がこのスタイルに対応していることがわかります。



このスタイルが大胆で斜めになっているかどうかはまだわかりません。 このアイデアはフォントからもこの情報を取得するように頼みますが、実験的に判明したように、フォントファイル内のこれらの属性は正しくない可能性があります。 したがって、上記で既に行ったように、アウトラインの名前(「Meiryo Bold Italic」)から取得します。 残りがTTFファイルから抽出された名前に一致するまで単語を切り取り、EnumFontFamiliesExの出力からは切り取りません。



したがって、「メイリオ」という名前の斜めの太字のテキストブロックをエクスポートする場合、「Meiryo Bold Italic」という名前をPDFライブラリに転送します。 利益!



All Articles