Extend GStateリファレンス
PDFの構造はバージョンを重ねる毎に積み上げていくかたちで拡張されてきました。そのためビュワーの実装時期により表示結果が異なるということが生じます。基本的にはAcrobatで見るべきなのですがブラウザでの表示などの問題もありますので難しい問題があります。
今回はそういった部分にかかわりの深いExtGState(グラフィクステートパラメータ辞書)についてお届けします。
まず、ExtGStateってなんだ?って事で順を追って見ていきましょう。
上に示した例では矩形が2つあり、上に乗っかっている青い方が不透明度50%に設定されている状態です。このドキュメントの構造をAcrobatで確認していきます。
Contentsって部分がPDFのページコンテンツが記述される部分です。ところが、この部分には記述されない描画情報があります。このデータのように不透明度が設定されたオブジェクトの不透明度情報はContents部分には記述されずグラフィクスステートパラメータ辞書(ExtGState)と呼ばれる部分に記述され参照されます。このグラフィクスステートパラメータ辞書はオプションとして取り扱われる情報です。また、グラフィクスステートパラメータ辞書は他の部分と異なり逆ポーランド記法では記述されずキーと価(エントリー)が対になったデータの塊として用意されます。
一度グラフィクスステートパラメータ辞書が適用されるとそれ以降のコンテンツストリームは新たなグラフィクスステートパラメータ辞書が適用されるまでその影響を受け続けます。
このように透明度処理のような比較的新しい機能はExtGStateに情報が含められます。PDFを理解する上でこの辞書構造について熟知しておく必要があります。
注意の必要な語句について
PDFでは構造によっていくつかの記述ルールがあります。今回の解説に含まれる「エントリー」は辞書オブジェクトにパラメータと対で記述される情報です。この様な辞書内で利用されるエントリーはキーと値のペアで構成されます。一方、Contentsストリーム上で実際にページ構造を記述する情報はオペレーターとそのオペランドを記述する事により構成されます。
これらエントリーのキーやコンテンツストリームのオペレーターは重複したものが存在します。例えば、「K」はAdditional Action DictionaryのキーやCMYK Stroke Colorのオペレーターとして使用されます。PDFの内部構造を見る場合、その部分がどういった構造なのかを把握し間違わない様に注意が必要です。
書き込まれる値について
以降に示す各エントリが持つパラメータはいくつかのデータ型が存在します。
- Real 実数
- Integer 整数
- boolean 真偽値
- name 文字列(他の辞書等を参照する際のID等)
- array 配列(配列の内容は他のパラメーター等を盛り込むことも出来ます。)
- function 関数
- dictionary 辞書(サブディクショナリ)
パラメータ
Type name
オプショナルとして設定されていますが、当該辞書がグラフィックステートパラメーター辞書として機能するためには必須のプロパティです。「ExtGState」で固定となります。
LW(Real)
(PDF 1.3)線幅
LC(integer)
(PDF 1.3) 線端形状
LJ(integer)
(PDF 1.3)角の形状。
ML(number)
(PDF 1.3) マイターリミット
D(array)
(PDF 1.3)破線パターン
RI(name)
(PDF 1.3)指定されるレンダリングインテント名称
OP(boolean)
PDF1.2以前では塗り及び線に対してオーバープリントを設定します。
PDF1.3以降は塗りと線に対するオーバープリント指定が分けられ大文字のOPプロパティは線に対するオーバープリントフラグとなります。グラフィックステートパラメーター辞書内にOPのみが存在する場合、塗りと線に対して同じ設定を適用します。グラフィックステートパラメーター辞書内にopが存在する場合は個々の情報を利用します。
op(boolean)
(PDF 1.3)塗りに対するオーバープリントフラグ
OPM(integer)
(PDF 1.3) オーバープリントモード
Font(array)
(PDF 1.3) ExtGStateと同じリソース階層に存在するFont辞書への参照とテキストスペース単位での比率を配列としたものがプロパティとなります。このパラメータはTfコマンドのオペランドに対応します。
BG(function)
DeviceRGBからDeviceCMYKへの変換の為の黒生成関数。
BG2(function or name)
(PDF 1.3)値が関数ではなく「Default」という名前を取る場合があることを除いてBGと同じです。これは、ページの冒頭で有効だった黒生成機能を示し、BGとBG2の両方が同じグラフィックスステートパラメーター辞書に存在する場合はBG2が優先されます。
UCR(function)
DeviceRGBからDeviceCMYKへの変換を行う際に利用するundercolor removal関数。
UCR2(function, name)
(PDF 1.3)値が関数ではなく「Default」という名前を取る場合があることを除いてBGと同じです。これは、ページの冒頭で有効だったundercolor removal関数を示し、UCRとUCR2の両方が同じグラフィックスステートパラメーター辞書に存在する場合はUCR2が優先されます。
TR(function, array)
トランスファー関数の定義。単一のトランスファー関数又は個別プロセスカラーに適用される関数配列
TR2(function, array, name)
(PDF 1.3) 値が関数ではなく「Default」という名前を取る場合があることを除いてTRと同じです。これは、ページの冒頭で有効だったトランスファー関数を示し、TRとTR2の両方が同じグラフィックスステートパラメーター辞書に存在する場合はTR2が優先されます。
HT(dictionary, stream, or name)
(オプション)ハーフトーン辞書またはストリーム又は「Default」。Defaultはページの開始時に有効だったハーフトーン辞書を示します。
FL(Real)
(PDF 1.3)平坦度。
SM(Real)
(PDF 1.3)平滑度。
SA(boolean)
自動ストローク調整を適用フラグ。
BM(name, array)
(PDF 1.4)(オプション; PDF 1.4)透明度を含むイメージングモデル上で使用される現在のブレンドモード
SMask(dictionary, name)
(PDF 1.4) 現在のソフトマスク。透明度を含むイメージングモデル上で使用するマスクの形状またはマスクの不透明度の値を指定します。
※ソフトマスクは「ソフトクリップ」と呼ばれることがあります。gsオペレータで変更すると、古い値が新しい値に完全に置き換えられます。クリッピングパスパラメータを利用した場合2つを交差させる事ができますが、ソフトマスクではその様な挙動を取らないので注意が必要です。
CA(Real)
(PDF 1.4)現在のストロークに対するアルファ定数。透明度を含むイメージングモデル上での線の操作に使用されるシェイプもしくは不透明度の値を指定します。
ca(Real)
(PDF 1.4) 現在のストロークに対するアルファ定数。透明度を含むイメージングモデル上での塗りの操作に使用されるシェイプもしくは不透明度の値を指定します。
AIS(boolean)
(PDF 1.4)アルファ定数やソフトマスクをどう解釈するかの指定用フラグ。AISは「Alpha is Shape」の略で、trueの場合はExtGState辞書に含まれるソフトマスクとアルファ定数をシェイプとして取り扱う。falseの場合は不透明度として解釈する。
TK(boolean)
(PDF 1.4)テキストノックアウトフラグ。透明度を含むイメージングモデル上でのテキストオブジェクト内で重複するグリフの表現を決定します。
構造サンプル
ここに示すのはグラフィックステートパラメータ辞書及びその呼出元の構造見本です。AcrobatDC Proで内部構造を表示させた場合、objオペランドは「<<>>」アイコンで表示されます。その他「/」アイコンは文字列のID、「[ ]」は配列と、データ型によってアイコンが使い分けられます。内部構造の実際のデータはコンテンツストリームに収められています。
10 0 obj //Pageオブジェクト
<< /Type /Page /Parent 5 0 R /Resources 20 0 R //リソース参照 20 0 /Contents 40 0 R >>
endobj
20 0 obj //Pageオブジェクトより参照されるリソース
<< /ProcSet [ /PDF /Text ] /Font << /F1 25 0 R >> //Font参照 25 0
/ExtGState << /GS1 30 0 R //GS1(30 0)グラフィックステートパラメーター辞書参照 /GS2 35 0 R // GS2(35 0)グラフィックステートパラメーター辞書参照 >>
>>
endobj
30 0 obj (GS1)グラフィックステートパラメーター辞書
<< /Type /ExtGState /SA true /TR 31 0 R //トランスファー関数参照 >>
endobj
31 0 obj //トランスファー関数
<< /FunctionType 0 /Domain [ 0.0 1.0 ] /Range [ 0.0 1.0 ] /Size 2 /BitsPerSample 8 /Length 7 /Filter /ASCIIHexDecode >>
stream
01 00 >
endstream
endobj
35 0 obj //(GS2)グラフィックステートパラメーター辞書
<< /Type /ExtGState /OP false /TR 36 0 R //トランスファー関数参照 >>
endobj
36 0 obj //トランスファー関数
<< /FunctionType 0 /Domain [ 0.0 1.0 ] /Range [ 0.0 1.0 ] /Size 21 /BitsPerSample 8 /Length 63 /Filter /ASCIIHexDecode >>
stream
FF CE A3 7C 5B 3F 28 16 0A 02 00 02 0A 16 28 3F 5B 7C A3 CE FF >
endstream
endobj
PDFのオブジェクト構造について
objキーワードはendobjキーワードと対でオブジェクト構造を構成し、Object番号とGeneration番号の2つの整数値を取ります。Object番号は一意の値となり、各種参照に利用されます。オブジェクトが内包するコンテンツ等の情報は<<〜>>の内側に記述されます。
基本構造
10 0 obj
<< 〜>>
endobj
また、PDFファイルではデータストリームが順序立てて並べられているわけではありません。多くのオブジェクトではリソース部分に記述されたリファレンス情報への参照等を行います。その際に利用されるのがRオペレーターで、2つのオペランドを利用して参照先を特定します。
10 0 obj //Pageオブジェクト
<< /Type /Page /Parent 5 0 R
/Resources 20 0 R //リソース参照 20 0
/Contents 40 0 R
>>
endobj
20 0 obj //Pageオブジェクトより参照されるリソース
<<
/ProcSet [ /PDF /Text ]
/Font << /F1 25 0 R >> //Font参照 25 0
/ExtGState
<<
/GS1 30 0 R //GS1(30 0)グラフィックステートパラメーター辞書参照
/GS2 35 0 R // GS2(35 0)グラフィックステートパラメーター辞書参照
>>
>>
endobj