PDF 構文 クロスリファレンスストリーム

PDF構文 (PDF Syntax ISO 32000-2)

PDF1.7は、ISO技術委員会によって2008年1月に“ISO 32000-1規格”として承認されました。2017年7月にはPDF2.0の規格ISO3200-2が承認され、2020年12月にはそれが第二稿に更新されました。
ここでは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)ディクショナリの項目に追加して記載されます。

キータイプ
Typename(必須)"XRef"を指定
Sizeinteger(必須)PDF文書に含まれているオブジェクトの総数
Trailerディクショナリの"Size"と同じ意味です。
Indexarray(オプション)2つの整数の組が0個以上含まれます。
組の内最初の整数はサブセクションで表される最初のオブジェクトオブジェクト番号で次がそのサブセクションに含まれるオブジェクトの総数です。
Previnteger(必要な場合がある)更新前のクロスリファレンス ストリームのバイトオフセット(ファイルの先頭からのオフセット)
この値はTrailerディクショナリの"Prev"と同じ意味です。
Warray(必須)クロスリファレンスの各要素のサイズ(バイト数)を表しています。
この要素の詳細はクロス・リファレンス ストリーム データを参照してください。
この配列の要素数は(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要素の意味を以下に記します。

タイプ  要素の位置要素の意味
01要素のタイプ
指定された"0"はフリーな(使用していない)オブジェクトのリストを表します。
クロスリファレンス テーブルの"f"の要素と同様の意味です。
2次のフリーなオブジェクトの番号
3再使用する場合の世代番号
11要素のタイプ
指定された"1"はこのオブジェクトが圧縮されていないことを示します。
クロスリファレンス テーブルの"n"の要素と同様の意味です。
2ファイルの先頭からのオフセット値
3オブジェクトの世代番号
21要素のタイプ
指定された"2"はこのオブジェクトが圧縮されていることを示します。
2オブジェクト ストリームが格納されたオブジェクトの番号
3オブジェクト ストリーム内でその位置を示すインデックスの番号

ご質問 ・ お問い合わせ

 メールで support@TrustSS.co.jp 宛てに、または 質問のページからお送りいただくようお願いします。
ご要望も受け付けております。


PDF Toolsライト

PDF 構文解説

(ISO32000-2より)

PDF Tools製品概要