6

PDF コンテンツを GDI デバイス コンテキスト (正確には 24 ビット ビットマップ) にレンダリングしようとしています。PDF ストリームを PDF オブジェクトに解析し、コンテンツ ディクショナリから PDF コマンドをレンダリングすることは、フォント レンダリングを含め、うまく機能します。

埋め込まれたフォントは、FontFile ストリームから解凍され、 を使用して「ロード」されAddFontMemResourceExます。現在、一部の埋め込みフォントは、'name' テーブルなど、GDI が必要とする一部の TrueType テーブルを削除しています。このため、TrueType サブセット フォントをテーブルに解析してフォントを変更し、データが欠落している/欠落しているテーブルをできるだけ正しい情報で再生成するように変更しようとしました。

Microsoft Font Validatorツールを使用して、生成されたフォントがどの程度「正しい」かを確認します。maxp テーブルの場合、通常、最大値が大きすぎる (サブセットである) か、xAvgCharWidthフィールドが「OS/2」テーブルの計算値と等しくないなど、いくつかのエラーが発生しますが、これは停止しません。他の埋め込みフォントを使用できるようにします。PDFCreator を使用して埋め込まれたフォントは、問題のあるものです。

質問:

  1. GDI がフォント ファイルを使用できるようにするために、フォント ファイルに何を変更する必要があるかを判断するにはどうすればよいですか?
  2. フォントファイルのまだ何が問題なのかを知ることができる他のフォント検証ツールはありますか?

必要に応じて、元のフォント ファイルと変更したフォント ファイルをどこかにダウンロードできるようにします。

これまでに行った変更:

  • 「head」、「hhea」、「maxp」、および「OS/2」セクションがあることを確認してください。
  • シンボル フォントがある場合は、「OS/2」セクションの Panose フィールドと Unicode フィールドをクリアします。
  • WInAscent/Desc と TypoAsc/Desc がゼロの場合は、正しい値を入力してください。
  • 上/下付き/下線の位置とサイズの許容値を入力します。
  • 残っているすべてのグリフをスキャンして、head に X/Y の最小値/最大値を入力します。
  • 名前セクションを元の PDF ファイルの情報で再構築します。
4

2 に答える 2

4

ほぼ1年遅れましたが、答えを見つけました:

'cmap' テーブルと 'name' テーブルのフォントの種類 (シンボルかどうか) は同じでなければなりません。そのため、cmap に 3,0,4 cmap (MS、シンボル、セグメント デルタ コーディング) があり、名前テーブルに 3,1,$0409 (MS、Unicode、enUS) エントリが含まれている場合、フォントは読み込まれません。

「シンボル cmap」の存在によって、フォントが Windows によってシンボル フォントと見なされるかどうかが決まるようです。「OS/2」のフラグは問題ではないようです。

したがって、「Microsoft Font Validator」を使用してフォントが正しいと思われる場合は、シンボル/ユニコード フィールドが「cmap」テーブルと「name」テーブルに並んでいるかどうかを確認してください。

于 2011-06-15T19:50:04.653 に答える
3

GDI+ のAddMemoryFontを使用すると、たとえば、メモリ フォントのエラーのステータスを確認できます。NotTrueTypeFont

GDI の 1 つのオプションは、 TTLoadEmbeddedFontを使用して埋め込まれたフォントをドキュメント/フォームにロードし、エラー メッセージから返されたエラーを確認することです。これよりも多くの情報を提供する唯一の関数はCreateFontPackage / MergeFontPackageとそのエラー コードですが、あなたの状況でどのように使用できるかわかりません。

これ以外に、PDFCreator のソース コードを確認する機会はありましたか (商用ではなくオープン ソースを使用していると仮定して)。

于 2010-06-18T02:35:46.327 に答える