Type 1 フォントと TrueType フォント

Type 1 フォント
ここからは、各フォントタイプごとの、フォント定義方法を解説していきます。

まずは、Type 1 フォントです。

Type 1 フォントは、1 byte の文字コード (256 個) に対して、それぞれグリフが割り当てられます。
グリフは、PostScript 言語によって、3次ベジェ曲線で記述されます。

256 文字しか使えず、横書きしかサポートしていないため、欧文フォントで使われます。

※現在では、埋め込み Type 1 フォントを使うことはほぼないと思いますので、使用例については省略しています。
標準 Type 1 フォント
PDF では、デフォルトで、14 個の標準 Type 1 フォントが用意されています。

Times-Roman Times-Bold Times-Italic Times-BoldItalic
Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique
Courier Courier-Bold Courier-Oblique Courier-BoldOblique
Symbol ZapfDingbats

Type 1 フォントの PostScript 名にこれらを指定すると、各アプリケーションで、それぞれ代替フォントが使われます。
Type 1 フォントのフォント辞書
Typename(必須) オブジェクトのタイプ。常に /Font
Subtypename(必須) フォントタイプ。Type 1 フォントの場合、/Type1
BaseFontname(必須) フォントの PostScript 名。
標準 Type 1 フォントの名前か、Type 1 フォントの FontName エントリの値。
FirstCharinteger(標準フォント以外で必須) 最初の文字コード。
PDF 1.5 以降では、標準フォントに対して設定するのは非推奨。
LastCharinteger(標準フォント以外で必須) 最後の文字コード
Widthsarray(標準フォント以外で必須。間接参照が望ましい)
(LastChar - FirstChar + 1) 個分の配列。
要素は、各文字コードのグリフ幅 (テキスト空間の 1/1000 単位)。
先頭の要素の文字コードは FirstChar となる。
FirstChar〜LastChar の範囲外の文字コードでは、FontDescriptor エントリ内の MissingWidth の値が使用される。
FontDescriptordictionary(標準フォント以外で必須。間接参照)
フォントの詳細情報を記述する辞書
Encodingname or dictionary文字エンコード。
定義済みである /MacRomanEncoding, /MacExpertEncoding, /WinAnsiEncoding か、または、これらとのエンコーディングの違いを指定するエンコーディング辞書。
ToUnicodestream(PDF 1.2) 文字コードを Unicode 値にマッピングする CMap ファイルを含むストリーム

標準フォントを使う場合は、以下の定義だけで使用できます。

6 0 obj
<< /Type /Font
   /Subtype /Type1
   /BaseFont /Helvetica 
>>
endobj
FontDescriptor エントリの辞書
フォント辞書の FontDescriptor エントリでは、フォントに関する詳細な情報を、辞書で指定します。
(常に間接参照。標準フォント以外では必須です)

Type 1 フォントだけではなく、他のフォントタイプでも必要になります。
これらのフォントスタイルなどの情報は、指定フォントが使用できない場合に、代替フォントを探す時の情報としても使われます。

※グリフにおける座標値や幅を指定する場合、PDF 内では、常に 1 em = 1000 であるものとして、値を設定します。実際のフォントで 1 em = 1024 などとなっている場合は、n / 1024 * 1000 というようにして、値を 1 em = 1000 に合わせます。

Typename(必須) オブジェクトのタイプ。常に /FontDescriptor
FontNamename(必須) フォントの PostScript 名。
この辞書を参照するフォント辞書、または CIDFont 辞書の、BaseFont エントリの値と同じであること。
FontFamilybyte string(PDF 1.5) 優先フォントファミリ名を指定するバイト文字列。
たとえば、"Times Bold Italic" の場合、FontFamily は "Times"。
FontStretchname(PDF 1.5) 文字の幅の名前。
UltraCondensed、ExtraCondensed、Condensed、SemiCondensed、Normal、SemiExpanded、Expanded、ExtraExpanded、UltraExpanded
FontWeightnumber(PDF 1.5) 文字の太さの値。
100、200、300、400 (normal)、500、600、700 (bold)、800、900
Flagsinteger(必須) 特性のフラグ。符号なし 32bit 整数値で指定。

bit 0: FixedPitch (固定幅フォント)
bit 1: Serif (明朝体)
bit 2: Symbolic (Adobe 標準ラテン文字セットのサブセットでない場合)
bit 3: Script (筆記体)
bit 5: NonSymbolic (Adobe 標準ラテン文字セットまたはそのサブセット)
bit 6: Italic (斜体)
bit 16: AllCap (小文字が含まれていない)
bit 17: SmallCap (大文字と小文字の両方が含まれる)
bit 18: ForceBold (太字レンダリングを強制)
FontBBoxrectangle(Type 3 フォント以外で必須)
すべてのグリフが収まる最小矩形。
ItalicAnglenumber(必須) 斜体の角度。
垂直からの反時計回りの度数。通常は 0。
Ascentnumber(Type 3 フォント以外で必須) ベースラインからの最大高さ
Descentnumber(Type 3 フォント以外で必須) ベースラインから下の最大距離
Leadingnumber行間。default = 0
CapHeightnumber(Type 3 フォントを除き、ラテン文字を含むフォントで必須)
水平な大文字 (E など) のベースラインからの高さ
XHeightnumber水平な小文字 (z など) のベースラインからの高さ。
default = 0
StemVnumber(Type 3 フォント以外で必須)
文字の垂直方向の軸幅。

CFF フォントでは、Private DICT の StdVW の値。
それ以外では、明確な指定方法はありませんが、とりあえず 0 でも問題ないようです。
StemHnumber文字の水平方向の軸幅。default = 0
AvgWidthnumberフォント内のグリフの平均幅。default = 0
MaxWidthnumberフォント内のグリフの最大幅。default = 0
MissingWidthnumberフォント辞書の Widths エントリの配列で、幅が指定されていない文字コードに対して使用する幅。
default = 0
FontFilestreamType 1 フォントのストリーム
FontFile2stream(PDF 1.1) TrueType フォントのストリーム
FontFile3stream(PDF 1.2) ストリーム辞書の Subtype エントリで指定された形式のフォントプログラムを含むストリーム
CharSetASCII string or byte string(PDF 1.1。Type 1 フォントのみ)
フォントサブセットで定義された文字名を列挙した文字列。

※この文字列内では、各名前の前にスラッシュ '/' が必要です。
名前は任意の順序で指定できます。
.notdef は常にフォントサブセットに存在すると想定されているため、省略する必要があります。
このエントリがない場合、フォントサブセットの唯一の表示は、FontName エントリ内のサブセットタグです。
Type 0 (CIDFont) での追加エントリ
Styledictionaryスタイルの辞書。
スタイル名と値を定義する (フォントの "OS/2" テーブル内の情報)。

現在は /Panose エントリのみで、値は 12 byte のバイナリデータ。
1バイト目は sFamilyClass の上位バイトのファミリークラス ID。
2バイト目は sFamilyClass の下位バイトのサブクラス ID
3バイト目以降は、panose の 10 byte。
Langnameフォントの言語 (Encoding エントリで言語が指定されていない場合)。
RFC 3066 で定義されているコード。
FDdictionaryグリフの各クラスごとに FontDescriptor 辞書を指定する。
キーはグリフのクラス名、値はそのクラスの FontDescriptor 辞書 (メインの FontDescriptor 辞書の値を上書きする)。

たとえば、ラテン文字グリフと漢字のグリフでは、異なる属性が必要な場合があるため、グリフの種類ごとに FontDescriptor 辞書の値を上書きさせる。
CIDSetstreamフォント内に存在する CID を、ビットデータで指定するストリーム。

このエントリが存在する場合、CIDSystemInfo によって指定された文字コレクションのグリフのサブセットのみが含まれる。
省略した場合、サブセットを示すのは、FontName エントリのサブセットタグのみ。

ストリームのデータは、各ビット位置が CID に対応したバイトデータ (上位ビットから下位ビット順)。
最初のバイトの最上位ビットは CID 0 に対応し、次のビットは CID 1 に対応します。
TrueType フォント
PDF では、TrueType フォントを埋め込んで使用することができます。
また、OS にインストールされている TrueType フォントも、フォント名を指定することで使用できます。

ここで説明しているのは、1 byte の文字コードで表現できるグリフを使う場合です。
日本語フォントなどで、256 個以上の文字を使う場合は、Type 0 フォントで定義する必要があります。
フォント辞書
Typename(必須) オブジェクトのタイプ。常に /Font
Subtypename(必須) フォントタイプ。
TrueType フォントの場合、/TrueType
BaseFontname(必須) フォントの PostScript 名。
TrueType フォント内の name テーブルで定義されている PostScript 名を指定します。

フォント内にそのような定義がない場合は、各 OS によって認識されるフォント名を指定します。
(この時、名前に半角空白が含まれる場合は削除します)
(また、OS と同じエンコーディングの文字列で指定する必要があります)

太字と斜体のスタイルを追加指定する場合は、フォント名の後に ',' (カンマ) を記述し、その後に以下のいずれかのスタイル名を追加します。
Bold, Italic, BoldItalic
例: /NewYork,Bold
FontDescriptordictionary(必須。間接参照) フォントの詳細情報を記述する辞書
Encodingname or dictionary文字エンコード。

シンボリックリンクフォントでない通常フォントの場合は、
/MacRomanEncoding または /WinAnsiEncoding を指定し、配列では指定しないでください。

記号などのシンボリックリンクフォントの場合は、このエントリを省略してください。
また、その場合、FontDescriptor 辞書の Flags エントリで Symbolic フラグを設定してください。

シンボリックリンクフォントの場合、cmap テーブルには、「platformID = 1 (Macintosh)、encodingID = 0」のサブテーブルが含まれている必要があります。
また、「platformID = 3 (Windows)、encodingID = 0 (Symbol)」のサブテーブルを含めることもできます。

処理内部では、TrueType の cmap テーブルの情報を元に、各文字コードがグリフ名にマッピングされます。
FontDescriptor 辞書
FontDescriptor エントリで指定する情報の中には、必須とされているエントリがいくつかありますが、ほとんどの値は、フォントファイルから直接読み取ることができるため、省略したとしても、実際には問題なく動作する場合があります。(各ビューアにもよります)

とりあえず、最低でも「Type, FontBBox」のエントリがあれば、表示できるようです。
ただ、通常の PDF 作成時は、必須のエントリをできるだけ設定しておいてください。

TrueType を埋め込む場合は、FontFile2 エントリで、フォントが埋め込まれたストリームを指定します。
FontFile2 ストリーム
TrueType フォントを埋め込む場合は、ストリームデータ内に、TrueType フォントをまるごとセットします。
(TTC,OTC などのフォントコレクションの場合は、個々のフォントを単体で埋め込みます)

その場合、ストリーム辞書の追加エントリとして、Length1 に、元のファイルサイズ (フィルタデコード後の全体サイズ) を指定する必要があります。
埋め込みの使用例
% フォント辞書
6 0 obj
<< /Type /Font
   /Subtype /TrueType
   /BaseFont /Virgo01
   /FontDescriptor 7 0 R
>>
endobj

% FontDescriptor 辞書
7 0 obj
<< /Type /FontDescriptor
   /FontBBox [0 -434 2048 1854]
   /FontFile2 8 0 R
>>
endobj

% TrueType フォントストリーム
8 0 obj
<< /Length 10000  % フィルタ適用後のサイズ
   /Filter /FlateDecode
   /Length1 16240 % 元のサイズ
>>
stream
...font file...
endstream
endobj