PDF 構文 クロスリファレンスストリーム
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
10.クロス・リファレンス ストリーム - Cross-Reference Stream
クロス・リファレンス ストリームはストリームオブジェクト(Stream Object)に含まれていてその内容はクロス・リファレンス テーブルと同様です。
このストリーム オブジェクトのディクショナリにはトレイラー(Trailer)情報が含まれています。
以下にクロス・リファレンス ストリームの例を示します。
ここでは、HelloWorld.pdfを例にしています。このPDFの内容はこちらです。
... objects ... 9 0 obj % Cross-reference stream << /Type /XRef % Cross-reference stream dictionary /Size ... /Root ... >> stream ... % Stream data containing cross-reference information endstream endobj ... more objects ... startxref byte_offset_of_cross-reference_stream % Points to object 9 %%EOF
PDF Imager-LP(無償版)でクロスリファレンス ストリームオブジェクトを表示するソースコード
C# | C/C++ |
10.1 クロス・リファレンス ストリーム ディクショナリ
クロス・リファレンス ストリーム(Cress-Reference Stream)ディクショナリには以下に示す項目が通常のストリーム オブジェクト(Stream Object)のディクショナリおよびトレイラー(Trailer)ディクショナリの項目に追加して記載されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"XRef"を指定 |
Size | integer | (必須)PDF文書に含まれているオブジェクトの総数 Trailerディクショナリの"Size"と同じ意味です。 |
Index | array | (オプション)2つの整数の組が0個以上含まれます。 組の内最初の整数はサブセクションで表される最初のオブジェクトオブジェクト番号で次がそのサブセクションに含まれるオブジェクトの総数です。 |
Prev | integer | (必要な場合がある)更新前のクロスリファレンス ストリームのバイトオフセット(ファイルの先頭からのオフセット) この値はTrailerディクショナリの"Prev"と同じ意味です。 |
W | array | (必須)クロスリファレンスの各要素のサイズ(バイト数)を表しています。 この要素の詳細はクロス・リファレンス ストリーム データを参照してください。 この配列の要素数は(PDF-1.5からPDF-1.7において)3です。 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
上記の表で示された項目はすべてダイレクト オブジェクトでなければなりません(「インダイレクト オブジェクトの参照指定はできない」という意味です)。array(IndexやW)で指定する場合でもその要素はダイレクトオブジェクトでなければなりません。
クロスリファレンス ストリームは暗号化してはいけません。
以下はHelloWorld.pdfのクロス・リファレンス ストリーム ディクショナリです。
9 0 obj << /Type /XRef /Length 40 /W [ 1 2 1 ] /Info 6 0 R /Root 7 0 R /Size 10 /ID [<1775615b6d180ff72f4473d56aaa72bf><c446479d244d5815a119bac7e56e7757>] >> stream ... binary ... endstream endobj
このPDFでは、W要素の指定によって、streamのバイナリデータを1バイト、2バイト、1バイト(合計4バイト)を1つのフィールドとして解釈しなければなりません。
10.2 クロス・リファレンス ストリーム データ
クロス・リファレンス ストリーム データは3つの要素で構成されたフィールドの集合です。各フィールドに含まれる要素のバイトサイズはクロスリファレンス ディクショナリのW配列で指定されます。
クロスリファレンス ストリームは1つ以上のフィールドで構成されます。
各フィールドの最初の要素でそのタイプを示します(以下の表参照)。タイプは3種類が規定されています。タイプによってそれに続く2要素の意味が異なります。
各タイプにおける3要素の意味を以下に記します。
タイプ | 要素の位置 | 要素の意味 |
---|---|---|
0 | 1 | 要素のタイプ 指定された"0"はフリーな(使用していない)オブジェクトのリストを表します。 クロスリファレンス テーブルの"f"の要素と同様の意味です。 |
2 | 次のフリーなオブジェクトの番号 | |
3 | 再使用する場合の世代番号 | |
1 | 1 | 要素のタイプ 指定された"1"はこのオブジェクトが圧縮されていないことを示します。 クロスリファレンス テーブルの"n"の要素と同様の意味です。 |
2 | ファイルの先頭からのオフセット値 | |
3 | オブジェクトの世代番号 | |
2 | 1 | 要素のタイプ 指定された"2"はこのオブジェクトが圧縮されていることを示します。 |
2 | オブジェクト ストリームが格納されたオブジェクトの番号 | |
3 | オブジェクト ストリーム内でその位置を示すインデックスの番号 |