PDF 構文 ファイル構造 (概要)
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
1.PDFファイル構造 ‐概要‐
PDFデータは1バイト(8ビット)のシーケンスで構成されています。 複数のバイトデータをグループ化たものをトークンとし、それらを組み合わせて更に上位の意味のある組み合わせとしています。 あらかじめ決められたトークンはASCII文字で構成されており、それらを区切る文字(ホワイトスペースなど)もASCII文字です。 そのため、PDFファイルを文書編集アプリケーション(PDFビュワーでなく)で開くとその多くの部分をASCII文字で確認できます。
PDF構文の説明は実際のPDFと比較しながら確認してください。 手元にあるPDFファイル(パスワードで暗号化されていないもの)を文書編集アプリケーションで開いてください。 もし、手元にそれらがないのであればHelloWorld.pdfデータをクリックしてください、データとして表示されます。 こちらでは同じPDFデータ(Helloworld.pdf)が通常どおりに表示されます。
以下は、PDFデータの大まかな構成要素です。
PDF文書のバージョン
開いた文書の先頭を見てください、以下のような行があるはずです。この部分を"File Header"といいます。
%PDF-1.7
数字の“1.7”の部分は、1.0,1.1,1.2,1.3,1.4,1.5,1.6,2.0 のいずれかとなっているかもしれません。詳細は、「2.1 ヘッダー」を参照してください。
PDFデータの終端
データの最後の行を見てください。以下の行(終了マーカー)があります。
%%EOF
これもコメントですがPDFデータの終端を表す特殊な意味を持っています。
その終端の前にはPDFのインダイレクトobjectがPDFデータのどの位置(オフセット)に配置されているかを表したクロスリファレンス・テーブルおよびそのオフセットが置かれています。
%%EOFは、PDFの更新によって追加で記載されます。
PDFファイルの終端に一番近い位置に記載された%%EOFがそのPDFファイルの最新のものです。
クロスリファレンス・テーブル
PDFデータに含まれる各オブジェクトのオフセット位置を示したテーブルで(多くの場合は)PDFデータの終端に近い位置に置かれています。
詳細は、「2.3 クロスリファレンス・テーブル」を参照してください。
以下はクロスリファレンス・テーブルの例です。
xref 0 8 0000000000 65535 f 0000000017 00000 n 0000000376 00000 n 0000000117 00000 n 0000000266 00000 n 0000000544 00000 n 0000000447 00000 n 0000000610 00000 n
ご注意ください、PDFによってはこのようなテーブルが直接記載されていない場合があります。
その場合クロスリファレンスの情報は名前付き(番号で識別された)オブジェクトに格納され多くの場合圧縮されたデータで記載されています。
圧縮されたデータは特別にクロスリファレンス・ストリームといいます。
PDF Imager-LP(無償版)でクロスリファレンス・テーブルを表示するソースコード(クロスリファレンス・ストリームのデータも表示します。)
C# | C/C++ | Python |
クロスリファレンス・ストリーム
クロスリファレンスの情報は名前の付いたオブジェクトのストリーム(ストリームを含んだオブジェクトを2.6ストリーム オブジェクトといいます)に格納することができます。
この情報を含んだオブジェクトを8.クロスリファレンス・ストリーム(Cross-Reference Stream)といいます。
このクロスリファレンス・ストリームには上記のクロスリファレンス・テーブルと同様の内容が格納されています。
クロスリファレンスのオフセット
PDFの終端である"%%EOF"の直前に以下のように置かれています。
startxref 665 %%EOF
startxrefの次行に記された数値はクロスリファレンスが置かれた位置をファイルの先頭からのオフセット値で表しています。 その位置を探すと、クロスリファレンス・テーブルもしくは、クロスリファレンス・ストリームが見つかります。
PDF Imager-LP(無償版)でクロスリファレンステーブルの位置(オフセット)を表示するソースコード
C# | C/C++ | Python |