グラフィックス状態スタックは、PDFコンテンツストリームが現在のグラフィックス状態パラメータを一時的に保存および復元できるようにする、後入れ先出し(LIFO)データ構造です。
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
で定義されているように、このメカニズムにより、複雑なグラフィックス操作を入れ子にして相互に分離することができ、レンダリングコンテキストに恒久的な影響を与えることはありません。このスタックはq(プッシュ)およびQ(ポップ)オペレータを使用して操作され、これらはPDFコンテンツストリームで最も頻繁に使用されるオペレータの一つです。
グラフィックス状態スタックは、PDFプロセッサが管理する内部メモリ構造であり、コンテンツストリーム処理中の特定の時点におけるグラフィックス状態の完全なスナップショットを保存します。グラフィックスのレンダリング方法を制御するアクティブなパラメータセットであるグラフィックス状態そのものとは異なり、スタックは後で復元できるこれらのパラメータの以前のバージョンを保持します。スタック上の各エントリには、現在の変換マトリックス(CTM)、カラースペース、線幅、ストロークおよび塗りつぶしの色、クリッピングパス、その他のレンダリングパラメータを含む、すべてのグラフィックス状態パラメータの完全なコピーが含まれています。スタックは、処理される各ページまたはform XObjectごとに独立して動作し、入れ子になったコンテキスト内でのグラフィックス状態の変更が分離された状態を保つことを保証します。
PDF生成または操作を行う開発者にとって、グラフィックス状態スタックを理解することは、いくつかの理由で不可欠です。第一に、グラフィックス操作を副作用なしにカプセル化できるようにすることで、モジュール式で再利用可能なコンテンツの作成が可能になります。一時的な変換、色、またはクリッピングパスを適用し、その後以前の状態をクリーンに復元できます。第二に、q/Qオペレータの適切な使用は、グラフィックス状態の汚染を防ぎます。これは、ある描画操作からの意図しないパラメータ変更が後続の操作に影響を与えることを指します。第三に、スタックはform XObjectや入れ子になったコンテンツを扱う際に重要です。異なるグラフィカル要素間で状態の分離を維持するためです。最後に、バランスの取れたqとQオペレータは、PDF/UAコンプライアンスやその他のPDF標準の要件であることが多く、アクセシビリティとドキュメント品質のためにスタック管理が重要になります。
Image XObjectは、画像データとそれに関連する属性(寸法、色空間、圧縮設定など)をカプセル化するPDFの外部オブジェクトの一種です
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。これらのオブジェクトはコンテンツストリームの外部で定義され、ページ上に画像を表示する必要がある場合にDoオペレーターを使用して参照されます。Image XObjectを使用することで、画像データを複製することなく、複数のページで同じ画像を効率的に再利用できます。
Image XObjectは、ラスター画像データとその特性を指定する辞書を含むPDFファイル内のストリームオブジェクトです。コンテンツストリーム内に画像データを直接埋め込むインライン画像とは異なり、Image XObjectはPDFのオブジェクト階層に格納される間接オブジェクトであり、ページのResources辞書から名前によって参照されます
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。XObject辞書には、それがImage XObjectであることを識別するために値が/Imageである/Subtypeエントリと、/Width、/Height、/ColorSpace、/BitsPerComponentなどの必須エントリが含まれます。実際の画像データはストリームコンテンツを形成し、DCTDecode(JPEG)、FlateDecode、JBIG2Decodeなどのさまざまなフィルターを使用して圧縮される場合があります。
Inline imageとは、PDF content stream内で特定の演算子シーケンス(BI、ID、EI)を使用して直接定義されるラスター画像であり、独立したimage XObjectとして保存されるのではなく、content stream内に埋め込まれます。
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
によれば、inline imageは小さな画像をよりシンプルに含めることができますが、image XObjectと比較すると柔軟性に制限があります。このアプローチでは、完全な画像データを他のcontent streamの命令とともにインラインで埋め込むため、グラフィックス操作内で自己完結型となります。
Inline imageとは、独立した間接オブジェクトやディクショナリエントリを作成せずに、画像データをPDF content stream内に直接エンコードする手法です。画像はBI(Begin Inline Image)演算子で始まり、画像プロパティを定義する一連のキーと値のペアが続き、その後実際の画像データの前にID(Image Data)演算子が配置され、最後にEI(End Inline Image)演算子で終了します。
Limit decodeは、開発者がPDFコンテンツストリームの処理を特定のオペレータ位置で一時停止または制限できる、特殊なデバッグおよび検査機能です。PDF仕様
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
では定義されていませんが、この機能はPDF開発ツールやライブラリで広く実装されており、コンテンツストリームのレンダリング方法の詳細な分析を容易にします。開発者はグラフィックスオペレータの逐次実行をステップ実行することで、レンダリングの問題を診断したり、複雑なページ構造を理解したりできます。
Limit decodeは、PDFコンテンツストリームのデコードおよびレンダリング処理中に、どの程度まで処理を進めるかを制御する開発者向け機能です。PDF文書のコンテンツストリームには、ページ上のテキスト、グラフィックス、その他の視覚要素を定義するオペレータのシーケンスが含まれています
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。limit decodeパラメータを設定することで、開発者はPDF処理ツールに対して、特定の数のオペレータの後、またはストリーム内の特定のオペレータインデックスで実行を停止するよう指示できます。これは、すべてのオペレータを順次完了まで処理する標準的なPDFレンダリングとは異なります。不正な形式のコンテンツで停止するエラーハンドリングメカニズムとは異なり、limit decodeは検査目的で意図的に有効なオペレータ位置で一時停止します。この機能は、コンテンツストリームオペレータと文書構造の関係を理解することが不可欠な、複雑なTagged PDFのコンテンツ構造
(
Citation: PDF Association, 2023
PDF Association(2023). Retrieved from
https://pdfa.org/resource/tagged-pdf-best-practice-guide-syntax/
)
を扱う際に特に有用です。
Line widthは、PDFコンテンツストリーム内でストローク処理されるパスの太さを定義するグラフィックス状態パラメータです
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。これにより、線、曲線、図形の輪郭がページ上でレンダリングされる際の太さが決定されます。Line widthはユーザー空間単位で測定され、別のline width演算子によって変更されるまで、以降のすべてのストローク処理に適用されます。
Line widthは、PDF文書内でストローク処理されるパスに対して垂直方向の太さを指定します。これはベクターグラフィックスの外観を制御する基本的なグラフィックス状態パラメータの1つです。幅はユーザー空間単位(デフォルトでは通常1/72インチ)の非負の数値として表現されます。Line widthが0の場合は、出力デバイス上でレンダリング可能な最も細い線を示し、これはデバイスの解像度によって異なる場合があります。図形の内部を塗りつぶすfill処理とは異なり、line widthはストローク処理、つまりパスの輪郭に沿って描画する処理にのみ影響します。Line widthはユーザー空間内で一定であり、変換マトリックスがグラフィックス状態全体に適用されない限り、変換によって自動的にスケーリングされることはありません
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。
LineTo演算子(略称l)は、PDFコンテンツストリーム内のパス構築演算子であり、現在の点から指定された座標まで直線セグメントを追加します
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。この演算子はPDFにおけるベクターグラフィックスの基本要素であり、複雑な図形、境界線、幾何学的図形の作成を可能にします。他のパス構築演算子と共に、LineToはPDF文書内のすべての可視的な線ベースグラフィックスの構成要素となります。
LineTo演算子は、PDFコンテンツストリーム内で小文字のlとして表され、2つのオペランド(ユーザー空間におけるx座標とy座標)を取ります。構文はx y lであり、この演算子は現在の点(MoveToなどの前のパス演算子によって確立された点)から点(x, y)まで直線を描画します。描画せずに位置を移動するだけのMoveTo演算子とは異なり、LineToは実際に現在のパスに可視的な線セグメントを追加し、そのパスが後で線描画または塗りつぶしされたときに表示されます。この演算子は現在の点を指定された(x, y)座標に更新し、後続のパス演算子がその位置から継続できるようにします。LineToはパス構築段階の一部であり、完全なパスにパス描画演算子(strokeやfillなど)が適用されるまで、可視的なものは何もレンダリングされません。
PDFの生成や操作を行う開発者にとって、LineTo演算子はベクターグラフィックスをプログラム的に作成するために不可欠です。この演算子の理解は、図形、境界線、表、カスタムグラフィックスを含むPDFコンテンツを生成する際に極めて重要であり、線描画に対する正確な制御を提供します。JavaまたはWebアプリケーションでPDFライブラリを使用する開発者は、レンダリングの問題をデバッグしたり、カスタム描画ルーチンを実装したり、PDFファイルサイズを最適化したりする際にLineToを理解する必要があります(ベクターパスはラスター画像よりもコンパクトです)。この演算子のシンプルさと効率性により、幾何学的図形にはビットマップグラフィックスを埋め込むよりも好ましく、結果としてファイルサイズが小さくなり、どの拡大レベルでもきれいにスケーリングされる解像度非依存のグラフィックスが得られます。
MoveTo演算子(PDFコンテンツストリームではmで表記)は、指定された座標に新しいサブパスを開始する基本的なパス構築演算子であり、視覚的な描画を行いません。
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
で定義されているように、この演算子はグラフィックス状態の現在点を再配置し、後続のパスセグメントの構築を開始します。これは、紙の上でペンを持ち上げて新しい位置に置き、描画を開始する前の動作に似ています。
MoveTo(m)は、PDFコンテンツストリームにおけるパス構築演算子で、2つのオペランド(x座標とy座標)を取り、ストロークや塗りつぶしのグラフィックスを作成せずに新しい現在点を確立します。この演算子は後置記法でx y mと記述され、xとyは現在のユーザー空間座標系における座標を表す数値です。LineTo(l)などの線描画演算子とは異なり、MoveToは前の現在点と新しい位置の間に視覚的な線分を作成しません。代わりに、既存のサブパスを終了し、指定された座標で新しいサブパスを開始します。この演算子は、分離されたパスセグメント、複数のコンポーネントを持つ複雑な図形の作成、および単一のパスオブジェクト内での後続描画操作の開始点の配置に不可欠です。
PDF生成や操作を行う開発者にとって、MoveTo演算子の理解は、正確なベクターグラフィックスの作成とパス構築ロジックの制御において重要です。この演算子により、複数の分離された図形を含む複合パスの作成が可能になります。例えば、内部に穴を持つ文字(「O」や「P」など)や、別々のコンポーネントを持つ複雑なイラストレーションを、すべて単一のパス定義内で表現できます。PDFコンテンツをプログラム的に生成する際、MoveToを適切に使用することで、グラフィックスが正しくレンダリングされ、塗りつぶし操作が適切なワインディングルールで意図通りに機能し、クリッピングパスが正しく動作することが保証されます。PDFライブラリ、レンダリングエンジン、コンテンツ生成ツールを構築する開発者は、PDF仕様で定義されたパスベースのグラフィックスの全範囲をサポートするために、MoveToの処理を実装する必要があります。
Operandは、PDFコンテンツストリーム内でoperatorの前に現れる値または値の並びであり、そのoperatorが機能を実行するために必要なパラメータを提供します。PDFが使用するPostScriptベースの構文
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
では、operandは前置記法で記述されます。つまり、それらを消費するoperatorよりも前にスタック上に配置される必要があります。このoperandとoperatorのペアリングは、PDFコンテンツストリーム内のすべてのグラフィックスおよびテキストコマンドの基本構造を形成します。
Operandは、PDFのoperatorにパラメータを与えるデータ値であり、どのようなアクションを実行すべきか、またどのような特性で実行すべきかを定義します。Operatorは通常、特定のアクションをトリガーする短いアルファベットのトークンですが、operandはそれとは異なり、数値、文字列、名前、配列、または必要な入力データを提供するその他のPDFオブジェクトになり得ます。例えば、100 200 mというコマンドでは、数値100と200がx座標とy座標を指定するoperandであり、mが現在位置をその場所に移動するoperatorです。
Operandは実行可能なコマンドではなく受動的なデータである点で、operatorとは異なります。また、operandはコンテンツストリーム内でoperatorのパラメータとして機能する値を特に指すため、一般的な文脈におけるPDFオブジェクトとも区別されます。必要なoperandの数と型は、PDF標準の各operator仕様によって厳密に定義されており、誤った数や型のoperandを提供すると、不正なコンテンツストリームになります。
Operandの理解は、プログラムによるPDFコンテンツの生成、既存PDFの解析、またはPDFレンダリングエンジンの実装など、PDFコンテンツストリームを扱う開発者にとって不可欠です。正しいoperandの順序により、PDFビューアが描画コマンド、テキストの配置、グラフィックス状態の変更を適切に解釈できるようになります。Operandの値や順序に誤りがあると、レンダリングの失敗、歪んだ出力、または検証に失敗するドキュメントにつながる可能性があります。
オペレータ(Operator)は、PDFにおける基本的な命令であり、コンテンツストリーム内でグラフィックス操作、テキストレンダリング、状態変更を定義します。オペレータは、スタックからオペランドを消費し、パスの描画、テキストの表示、グラフィックス状態の変更などの特定のアクションを実行する、1文字または複数文字のキーワードとして指定されます
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。これらの命令は、PDF文書内のすべての視覚的コンテンツの基本的な語彙を形成します。
PDFオペレータは、コンテンツストリームに現れるコマンドキーワードであり、PDFプロセッサに特定の操作を実行するよう指示します。オペレータは後置記法の構文に従い、オペランド(パラメータ)がオペレータ自体の前に配置されます。例えば、100 200 mというシーケンスでは、数値100と200がオペランドであり、m(moveto)がこれらの値を消費してグラフィックスパス内の現在点を設定するオペレータです。
オペレータは、辞書や配列などの他のPDFオブジェクトとは異なり、データ構造ではなく実行可能な命令です。オペレータは大文字と小文字を区別し、PDF仕様で指定された通りに正確に記述する必要があります
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。一般的なオペレータのカテゴリには、パス構築オペレータ(m、l、c、re)、パス描画オペレータ(S、s、f、B)、テキストオペレータ(Tf、Tj、TJ)、グラフィックス状態オペレータ(q、Q、cm、gs)があります。
パスは、PDF における基本的なグラフィックスプリミティブであり、接続または非接続のセグメントの連続によって図形の輪郭を定義します
(
Citation: N.A., 2020
(N.A.).
(2020).
Document management — Portable document format — Part 2: PDF 2.0
.
International Organization for Standardization
Retrieved from
https://www.iso.org/standard/75839.html
)
。パスは、moveto (m)、lineto (l)、curveto (c) などのパス構築演算子を使用して構築され、ページ上に線や曲線を描きます。定義されたパスは、ストローク、塗りつぶし、またはクリッピング境界として使用され、PDF 文書内でコンテンツがどのように表示されるかを制御できます。
PDF におけるパスは、直線とベジェ曲線で構成される 1 つ以上の図形の数学的記述です。ピクセル単位で図形を定義するラスターグラフィックスとは異なり、パスは解像度に依存しないベクターベースの記述です。パスは 1 つ以上のサブパスで構成され、各サブパスは新しい現在点を確立する moveto 操作で始まり、その後に線分(lineto)、3 次ベジェ曲線(curveto)、または矩形を描画する操作が続きます。パスは開いた状態(始点と終点が異なる)または閉じた状態(closepath 演算子が終点を始点に明示的に接続する)のいずれかになります。パスは、stroke (S)、fill (f)、clip (W) などのペイント演算子が適用されて可視化または機能化されるまでは、抽象的な幾何学的エンティティとして存在します。