PDF stream object offset
PDFストリームオブジェクトオフセット(PDF stream object offset)は、PDFファイル内の特定のストリームオブジェクトの開始位置を示すバイト位置です。
PDFストリームオブジェクトオフセット(PDF stream object offset)は、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パーサーやプロセッサがこれらに効率的にアクセスするためには、ファイル内の正確な位置が重要です。オフセット値はPDFファイルの先頭から測定され、通常はクロスリファレンステーブルまたはクロスリファレンスストリームに記録されます。
PDFストリームオブジェクトオフセットは、PDFファイルの先頭からストリームオブジェクトの定義が始まる正確なバイト位置を表す整数値です。オブジェクト定義の開始位置(オブジェクト番号と世代番号を含む)を指す間接オブジェクトオフセットとは異なり、ストリームオブジェクトオフセットは特にstreamキーワードとそれに続くバイナリまたはエンコードされたデータを含むオブジェクトを特定します。このオフセットは、オブジェクト宣言自体ではなくストリーム内の実際のデータバイトを指すストリームコンテンツオフセットとは区別されます。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
)
では、ファイル全体を順次解析することなく任意のオブジェクトへのランダムアクセスを可能にするために、これらのオフセットがファイルのクロスリファレンス構造内で正確に維持される必要があります。
ストリームオブジェクトは、辞書のみのオブジェクトとは異なり、辞書の後にstreamキーワード、次にバイト列、最後にendstreamキーワードで構成されます。クロスリファレンステーブルに記録されるオフセットは、通常、辞書定義の前にあるオブジェクト番号から始まる、この構造全体の先頭を指しています。
PDF生成、解析、または操作ライブラリを扱う開発者にとって、ストリームオブジェクトオフセットの理解は、いくつかの理由から不可欠です:
パフォーマンスの最適化:オフセットを介したストリームオブジェクトへのランダムアクセスにより、PDFプロセッサはファイル全体をメモリにロードすることなく特定のリソース(画像やフォントなど)を抽出できます。これは、Webアプリケーションやモバイルアプリケーションで大きなPDFドキュメントを扱う際に重要です。
インクリメンタル更新:ファイル全体を書き直すことなくPDFを変更する場合、開発者は新規または変更されたストリームオブジェクトを追加し、変更されていないオブジェクトの既存のオフセット情報を保持しながら、新しいオフセットでクロスリファレンステーブルを更新する必要があります。
ファイルの整合性:オフセット値が不正確だと、PDFリーダーがストリームオブジェクトを見つけてデコードしようとする際に失敗し、コンテンツの欠落、レンダリングエラー、またはドキュメント全体の障害が発生します。検証ツールは、ファイル構造を検証するために正確なオフセットに依存しています。
線形化:線形化(高速Webビュー)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 ) は、コンテンツをオブジェクトのコレクションとして整理し、各オブジェクトはオブジェクト番号と世代番号で識別されます。ストリームオブジェクトは、複数のステップを経て特定されます:
クロスリファレンステーブルでの保存:クロスリファレンス(xref)テーブルまたはクロスリファレンスストリームは、オブジェクト番号とファイル内のバイトオフセット間のマッピングを維持します。ストリームオブジェクトを含む各間接オブジェクトについて、テーブルは従来のxrefテーブルでは10桁の10進数として、xrefストリームでは整数エントリとしてオフセットを保存します。
オフセットの計算:PDFプロセッサがストリームオブジェクトにアクセスする必要がある場合、クロスリファレンステーブルでオブジェクト番号を検索してオフセットを取得し、ファイル内のそのバイト位置にシークします。パーサーは、n g objというパターン(nはオブジェクト番号、gは世代番号)を見つけることを期待します。
ストリーム構造:オフセット位置では、ストリームオブジェクトは次の構造に従います:
12 0 obj
<< /Length 534 /Filter /FlateDecode >>
stream
[バイナリデータ]
endstream
endobj
この例では、オフセットは「12 0 obj」の「1」を指しています。
インクリメンタル更新とオフセット管理:PDFがインクリメンタルに更新される場合、新しいストリームオブジェクトが新しいオフセットでファイルに追加され、新しいクロスリファレンスセクションが追加されます。元のオフセットは変更されていないオブジェクトに対して有効なままであり、新しいxrefセクションには変更または新規のストリームオブジェクトのオフセットが含まれます。これにより、PDFリーダーは複数のxrefセクションをたどって完全なオブジェクトマップを構築できます。
オフセットの検証:PDFプロセッサを実装する開発者は、オフセットが有効なオブジェクト定義を指していることを検証し、複数のオブジェクトが単一のストリームを共有し、ファイルベースではなくインデックスベースのオフセットを使用する圧縮オブジェクトストリームなどのエッジケースを処理する必要があります。
- クロスリファレンステーブル(Cross-reference table) – PDFファイル内のインデックス構造で、オブジェクト番号をバイトオフセットにマッピングし、任意のオブジェクトへのランダムアクセスを可能にする
- 間接オブジェクト(Indirect object) – ドキュメントの他の部分から参照可能な番号付きPDFオブジェクトで、クロスリファレンステーブル内のオフセットを介して位置が特定される
- ストリーム辞書(Stream dictionary) – ストリームオブジェクトの辞書部分で、長さやフィルタ情報などのストリームに関するメタデータを含む
- 線形化PDF(Linearized PDF) – Webブラウザでページ単位のダウンロードと表示を可能にするために、オブジェクトとそのオフセットを配置した特別に整理されたPDFファイル構造
- オブジェクトストリーム(Object stream) – ファイルレベルのオフセットではなく内部インデックスを使用して、他のオブジェクトの圧縮されたコレクションを含む特殊なタイプのストリームオブジェクト
- (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
