PDF 構文 フォント
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
6.フォント
フォントはPDF文書にディクショナリとして記載されます。
フォントディクショナリにはフォントタイプ、PostScript名、エンコーディング、指定のフォントが有効でない場合替わりとなりうるフォントの情報が記載されます。
フォントプログラムはPDF文書にストリームとして埋め込むことができますので、いずれの環境でも意図した字体で文書を表示できるようになります。
フォントタイプはフォントディクショナリのSubtypeエントリの記載内容によって区別できます。
PDFで定義されているフォントタイプは以下のとおりです。
タイプ | サブタイプ値 | 内容 |
---|---|---|
Type0 | Type0 | コンポジットフォント(Composite font) 子孫(Dedcendant)であるCIDFontのGlyph(グリフ;字形)で構成されたフォント |
Type1 | Type1 | Type1フォント技術を使ってGlyphが定義されたフォント |
Type1 | MMType1 | マルチマスター フォント Type1フォントを拡張したもので、ひとつのフォントからさまざまな書体スタイルを生成できます。 |
Type3 | Type3 | PDFのグラフィック記述子によるストリームでグリフを定義するフォント |
TrueType | TrueType | TrueType(またはOpenType)フォント形式に基づくフォント |
CIFFont | CIFFontType0 | Type1フォント技術に基づいてグリフが記述されたCIDFont |
CIFFont | CIFFontType2 | TrueTypeフォント技術に基づいてグリフが記述されたCIDFont |
Type0フォントはCompositeフォントといい、他のタイプをSimpleフォントといいます。
"CIFFont"はフォントのように集合体であるため上記の表に記載されていますが、これはフォントではありません。
そのため、直接使用することはできず、Type0のコンポーネントとしてのみ使用します。
PDF Imager-LP(無償版)でPDF文書のフォント名を取得するソースコード
C# | C/C++ | Python |
6.0 Simpleフォント
Simpleフォント(Type0以外のタイプ)は以下のプロパティがあります。
- テキスト描画演算子で指定された文字列から得られた1バイトコードによってグリフが選択されます。
コードからグリフへのマッピングは、フォントのエンコーディングと呼ばれます。このエンコードは変更されることがあります。 - 各グリフには水平方向の変異や幅を含むメトリックがあります。Simpleフォントは横書きモードだけをサポートします。
- Type0フォント、タグ無しPDF文書のType3フォント、標準のType1フォントを除いた全てのフォントディクショナリにはFontDescriptorが含まれます。
FontDescriptorにはフォント全体のメトリックやその他のフォント属性が記載されます。
6.1 Type1フォント
Type1フォントのディクショナリには以下の項目が記載されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Font"を指定 |
Subtype | name | (必須)"Type1"を指定 |
Name | name | (オプション)リソースディクショナリでこのフォントを参照する名前 PDF2.0では非推奨 |
BaseFont | name | (必須)フォントのPstScript名 |
FirstChar | integer | (標準14フォント以外必須)Widths配列に記載される先頭の文字コード |
LastChar | integer | (標準14フォント以外必須)Widths配列に記載される最後の文字コード |
Widths | array | (標準14フォント以外必須)文字の幅を記載した配列 FirstCharからLastCharまでのGlyph幅を記載 |
FontDescriptor | dictionary | (標準14フォント以外必須)Glyph幅以外のフォントメトリックを記述 |
Encoding | nameまたは dictionary | (オプション)組込エンコーディングと異なる場合のフォントの文字エンコーディング |
ToUnicode | stream | (オプション)文字コードをUnicode値にマップするCMapファイルを含むストリーム |
6.1.1 標準14フォント
Standard 14 Fontsと言われ、以下の14個のフォントです。
Times-Roman | Helvetica | Courier | Symbol |
Times-Bold | Helvetica-Bold | Courier-Bold | ZapfDingbats |
Times-Italic | Helvetica-Oblique | Courier-Oblique | |
Times-BoldItalic | Helvetica-BoldOblique | Courier-BoldOblique |
標準14フォントのフォントのディクショナリにはFirstChar、LastChar、FontDescriptor項目は含まれません。
だだし、これらの項目と共にフォントプログラムを埋め込むことで、標準フォントを上書きすることができます。
注意: PDF2.0では上記項目の記載は必須となりました。
6.1.2 マルチマスター フォント
Multiple master font形式はType1フォント形式を拡張したもので、単一のフォントプログラムからさまざまな書体スタイルを生成できるフォントです。
マルチマスター フォントのディクショナリでは、Subtype項目にMMType1が指定さます。
BaseFont項目のPostScript名に空白が含まれている場合はそれが下線("_";Underscore)に置き換えられます。
6.2 TrueType(OpenType)フォント
TrueTypeフォントまたはOpenTypeフォントのディクショナリは以下を除いてType1のディクショナリと同じです。
- Subtype項目の値は"TrueType"です。
- Encoding項目にはいくつかの制限があります。
- BaseFont項目は以下のいずれかです。
- TrueTypeまたはOpenTypeフォントプログラムの"name"テーブルに記載されたPostScript名
- PostScript名が無い場合は、ホストOSでの名称
6.3 Type3フォント
Type3フォントは、PDFでサポートされている他のフォントとは違います。Type3のフォント ディクショナリはフォントを定義します。
他のフォント ディクショナリはフォントに関する情報が記載されているだけで、実際のグリフの説明はフォント プログラムを参照します。
Type3フォントのグリフは PDFグラフィック演算子のストリームによって定義されます。これらのストリームはキャラクター名に関連付けられます。
Type3フォントは Type1フォントよりも柔軟です。これはグリフの説明に任意のPDFグラフィック演算子が含まれているためです。
ただし、Type3フォントにはヒンティング メカニズムがありません。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Font"を指定 |
Subtype | name | (必須)"Type3"を指定 |
Name | name | (オプション)リソースディクショナリでこのフォントを参照する名前 PDF2.0では非推奨 |
FontBBox | rectangle | (必須)フォント境界ボックス グリフ座標系で表される四角形 |
FontMatrix | array | (必須)グリフ空間を表示の空間に写像させるためのマトリックス |
CharProcs | dictionary | (必須)キーが文字列で、値がその文字を描画するコンテンツストリームであるディクショナリ |
Encoding | nameまたはdictionary | (必須)このフォントの完全な文字エンコーディングを指定 |
FirstChar | integer | (必須)フォントのWidths配列で定義された最初の文字コード |
LstChar | integer | (必須)フォントのWidths配列で定義された最後の文字コード |
Widths | array | (必須)配列の各要素はFirstCharに配列インデックスを加えた文字コードのグリフ幅 |
FontDescriptor | dictionary | (タグドPDFで必須)グリフ幅以外のフォントのデフォルトのメトリック |
Resources | dictionary | (オプション)このフォントのグリフ記述に必要なフォントや画像などの名前付きリソースのリスト |
ToUnicode | stream | (オプション)文字コードをUnicode値にマップするCMapファイルを含むストリーム |
6.4 Compositフォント(Type0フォント)
Composit(複合)フォントは、Type0フォントともいわれ、CIDFontフォントのようなオブジェクトからグリフが取得されるフォントです。
Type0フォントはルートフォントで関連するCIDFontはその子孫です。
Compositフォントでテキストを表示する場合はSimpleフォントとは違った動作をします。
Simpleフォントの場合表示される文字列の各バイトは1つのグリフを選択します。
しかし、複合フォントの場合h1つまたは複数のバイトのシーケンスをデコードして子孫のCIDFont からグリフを選択できます。
この機能はCJK(中国語、日本語、韓国語)フォントなどで非常に大きな文字セットの使用をサポートします。
また、複雑なエンコーディング要件を持つフォントの編成を簡素化します。
6.4.1 CID-Keyedフォント
CID-Keyedフォントは ①マルチバイト文字エンコーディング、②多数のグリフを含むフォント、および③他のフォントから取得したグリフを組み込んだフォントを定義するための便利で効率的な方法を提供します。
これらの機能により 中国語、日本語、韓国語(CJK)などの大きな文字セットを持つ言語のフォントを使ってテキストを表現する際に柔軟に対応できます。
CID-keyedフォント アーキテクチャはCMapおよびCIDFontファイルと呼ばれる特定のフォント プログラムの外部表現と組み合わせて使用するための規則と共に指定します。
PDFはCID-Keyedフォント アーキテクチャ全体をサポートしておらず、PDFから独立しています。
CMap(Characterマップ)ファイルは、グリフを識別するために使用される文字コードとCID番号との対応を指定します。これは、単純なフォントのエンコーディングの概念に相当します。
Simpleフォントでは最大256個のグリフを一度にエンコードしてアクセスできるのに対し、CMapでは複数バイト コードから数千のグリフへのマッピングを大きなCID-Keyedフォントで記述できます。
たとえば、日本語Shift-JISの記述はその一例です。
PDFではCMapとCIDFontはCIDSysemInfoディクショナリによって表されます。
CMapおよびCIDFontプログラム自体は名前で参照するか、ストリーム オブジェクトとしてPDFファイルに埋め込むことができます。
CID-Keyedフォントはグリフの説明を含むCIDFontとCMapを組み合わせたもので、 Type0フォントとして表されます。
これには値がCMapディクショナリであるEncodingエントリが含まれ、そのDescendantFontsエントリはCMapが結合されたCIDFontディクショナリを参照します。
6.4.2 CIDSystemInfoディクショナリ
CIDFontディクショナリとCMapディクショナリにはCIDSystemInfoエントリが含まれています。
CIDSystemInfoディクショナリにはCMapに関連付けられたCIDFontが想定する文字コレクション、つまりCIDFontが使用するCID番号の解釈が指定されています。
文字コレクションはCIDSystemInfoディクショナリで指定された、Registry、Ordering、Supplementで一意に識別されます。なお、RegistryとOrderingが同じ場合は互換性があります。
CIDFontのCIDSystemInfoエントリにはCIDFontの文字コレクションを指定します。
CMapのCIDSystemInfoエントリではコードを単一の文字コレクションに関連付けるか複数の文字コレクションに関連付けるかによって、単一の辞書または辞書の配列のいずれかを指定します。
キー | タイプ | 値 |
---|---|---|
Registry | ASCII string | (必須)文字コレクションの発行者を識別する文字列 (Adobe など) |
Ordering | ASCII string | (必須)指定したレジストリ内の文字コレクションを一意に指定する文字列 (Japan1 など) |
Supplement | interger | (必須)文字コレクションの補足番号 元の文字コレクションの補足番号は0です。文字コレクションに追加のCIDが割り当てられるたびに、補足番号が増加します。 Supplementは文字コレクション内の既存のCIDの順序を変更しません。 この値は文字コレクション間の互換性を判断する際には使用されません。 |
6.4.3 CIDFont フォント
CIDFontフォントプログラムにはCIDを文字セレクタとしてアクセスされるグリフ記述が含まれています。
CIDFontには以下の2種類があります。
- Adobe Type 1 フォント形式に基づいてグリフが記述された Type 0 CIDFont
- TrueTypeフォント形式に基づいてグリフが記述された Type 2 CIDFont
ディクショナリのType値は"Font"ですが、CIDFontは実際にはフォントではありません。
Encodingエントリがなく、PageディクショナリのResources要素に記載されるFontディクショナリに含めることができず、ContentsストリームでのTf演算子(フォントを選択する演算子)のオペランドとして使用できません。
CIDFontディクショナリは以下のとおりです。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Font"を指定 |
Subtype | name | (必須)"CIDFontType0"または"CIDFontType2"を指定 |
BaseFont | name | (必須)CIDFontのPostScript名 Type 0 CIDFontの場合、通常CIDFontプログラムのCIDFontNameエントリ値です。 Type 2 CIDFonts の場合、単純なTrueTypeフォントのBaseFontと同じ方法で派生します。 |
CIDSystemInfo | dictionary | (必須)CIDFont の文字コレクションを定義するエントリを含むCIDSystemInfoディクショナリ |
FontDescriptor | dictionary | (必須)グリフ幅以外の CIDFont のデフォルトのメトリックを記述するFontDescriptorディクショナリ |
DW | integer | (オプション)CIDFont内グリフ幅の既定値 省略時の値:1000 |
W | array | (オプション)CIDFontの各グリフの幅 |
DW2 | array | (オプション;縦書きの場合のみ)縦書きの既定のメトリックを指定する2つの数値の配列 既定値:[880−1000] |
W2 | array | (オプション;縦書きの場合のみ)CIDFontグリフの縦書きメトリック 既定値:なし |
CIDToGIDMap | streamまたは name | (オプション;Type 2 CIDFontsの場合のみ)CIDからグリフ インデックスへのマップ 値がストリームの場合、ストリーム内のバイトにはCIDからグリフ インデックスへマップされた値が含まれます。 CIDToGIDMapが名前の場合、それはIdentityでなければならず、CIDからグリフ インデックスへマップされる値がIDであることを示します。 既定値:ID |
6.4.4 CMap
CMapは文字コードから文字セレクターへのマッピングを指定します。
PDFでは文字セレクターは常にCIDFont内のCIDです(PostScript CMapは名前またはコードを使用する場合があります)。
CMapはSimpleフォントのエンコーディング ディクショナリに類似した機能を提供します。
CMapは特定のCIDFontを直接参照しませんが、CID-Keyedフォントの一部として統合され、Type0フォントディクショナリとして表されます。
また、PDFは特殊なタイプのCMapを使って文字コードをUnicode値にマップします。
CMapはそれが統合されるCIDFontのWriting Mode(HorizontalまたはVertical)を指定しなければなりません。
Writing Modeはそのフォントのグリフが描画される際のメトリックを決定します。
CMapは次のいずれかで決定されます。
- 事前定義されたCMapを識別する名前オブジェクトとしてISO32000-2:2020 「Table 116 - Predefined CJK CMap names」(ページ335)を参照してください。
- コンテンツがCMapファイルであるストリームオブジェクトとして
CMapがストリームオブジェクトとしてPDF文書に埋め込まれる場合はストリームオブジェクト ディクショナリの項目に以下が追加されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"CMap"を指定 |
CMapName | name | (必須)CMapの名前。 CMapファイルのCMapNameの値と同じでなければなりません。 |
CIDSystemInfo | dictionary | (必須)CMapに関連付けられたCIDFontの文字集合を定義するエントリを含むディクショナリ このエントリの値はCMapファイルのCIDSystemInfoの値と同じでなければなりません。 |
WMode | integer | (オプション)このCMapと組み合わせるCIDFontのWriteing Mode(書き込みモード) 値は水平の場合は0(デフォルト)、垂直の場合は1です。 |
UseCMap | nameまたは stream | (オプション)事前定義されたCMapの名前、またはCMapを含むストリーム このエントリが存在する場合、参照元のCMapは参照先のCMapとは異なる文字マッピングのみを指定する必要があります。 |
6.5 Type0 フォント
Type0のフォントディクショナリは以下のとおりです。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Font"を指定 |
Subtype | name | (必須)"Type0"を指定 |
BaseFont | name | (必須)フォント名 子孫がType 0 CIDFontの場合はハイフンで以下を結合したものにしなければなりません。 ・CIDFontのBaseFonto名 ・Encoding要素(もしくは、CMapのCMapName要素)で指定されたCMap名 子孫がType 2 CIDFontの場合はCIDFontのBaseNameと同じにしなければなりません。 |
Encoding | name | (必須)事前定義されたCMapの名前、または文字コードをフォント番号とCIDにマップするCMapを含むストリーム |
DescendantFonts | array | (必須)このType0フォントの子孫であるCIDFontディクショナリを指定する1要素の配列。 |
ToUnicode | stream | (オプション)文字コードをUnicode値にマップするCMapファイルを含むストリーム |
6.6 Font descriptor
Font descriptorは個々のグリフのメトリックとは異なりSimpleフォントまたはCIDFont全体のメトリックおよびその他の属性を指定します。
これらのフォント メトリックはPDF描画処理においてSubstitute(代替)フォントを合成したり、フォントプログラムが利用できない場合に類似のフォントを選択したりできるようにする情報を提供します。
Font descriptorはフォントプログラムをPDFファイルに埋め込むためにも使用します。
Font descriptorはその要素にさまざまなフォント属性を指定されたDictionaryです。
以下は全てのFont descriptorに共通の要素です。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"FontDescriptor"を指定 |
FontName | name | (必須)フォントの PostScript名 このFont Descriptorを参照するフォントまたはCIDFontディクショナリのBaseFontと同じ |
FontFamily | byte string | (オプション)フォントファミリ名を指定するバイト文字列 |
FontStretch | name | (オプション)フォントのStretch値 UltraCondensed、ExtraCondensed、Condensed、SemiCondensed、Normal、SemiExpanded、Expanded、ExtraExpanded、またはUltraExpandedのいずれか |
FontWeight | number | (オプション)完全修飾フォント名またはフォント指定子のウェイト(太さ)値 存在する場合の値は100、200、300、400、500、600、700、800、900のいずれか |
Flag | interger | (必須)フォントのさまざまな特性を定義するフラグ |
FontBBox | rectangle | (必須;Type3を除く)グリフ座標系で表現されたフォントの境界ボックス |
ItalicAngle | number | (必須)垂直線から反時計回りで表される、フォントの斜体表現角度 右に傾斜するフォントの場合値は負数 |
Ascent | number | (必須;Type3を除く)このフォントのグリフが到達するベースラインからの最大高さ |
Descent | number | (必須;Type3を除く)このフォントのグリフが到達するベースラインより下の最大深度 値は負数 |
Leading | number | (オプション)連続するテキスト行のベースライン間の間隔 デフォルト値:0 |
CapHeight | number | (必須;Type3を除く)ベースラインから測定された大文字の上部の垂直座標 |
XHeight | number | (オプション)ラテン文字を含むフォントのベースラインから測定された小文字の上部の垂直座標 デフォルト値:0 |
StemV | number | (必須;Type3を除く)フォント内グリフの主な垂直Stemの水平方向の太さ(値は正数) 値0はStemの太さが不明であることを示す |
StemH | number | (オプション)フォント内グリフの主要な水平Stmの垂直方向の太さ(値は正数) 値0はStemの太さが不明であることを示す。デフォルト値:0 |
AvgWidth | number | (オプション)グリフの平均幅 デフォルト値:0 |
MaxWidth | number | (オプション)グリフの最大幅 デフォルト値:0 |
MissingWidth | number | (オプション)フォントディクショナリのWidths配列で幅が指定されていない文字コードに使用する幅 デフォルト値:0 |
FontFile | stream | (オプション)Type1 フォントプログラムを含むストリーム |
FontFile2 | stream | (オプション)TrueType フォントプログラムを含むストリーム |
FontFile3 | stream | (オプション)ストリームディクショナリのSubtype要素によって指定された形式のフォントプログラムを含むストリーム |
CharSet | ASCII string または byte string | (オプション)フォントサブセットで定義されている文字名をリストする文字列 |
以下はCIDFontの場合にFont descriptorに追加できる要素です。
キー | タイプ | 値 |
---|---|---|
Style | dictionary | (オプション)グリフのスタイルを記述するエントリを含むディクショナリ |
Lang | name | (オプション)フォントの言語を指定する名前 |
FD | dictionary | (オプション)キーがCIDFont内のグリフのクラスを識別するディクショナリ 各値はそのクラスのグリフのメインのFont descriptorディクショナリに対応する値を上書きする |
CIDSet | stream | (オプション;PDF2.0では廃止)CIDFontファイルに存在するCIDを識別するストリーム |