PDF 構文 ファイル 解析手順

PDF構文 (PDF Syntax ISO 32000-1)

PDF1.7はISO技術委員会によって2008年1月に“ISO 32000-1規格”として承認されました。(2017年7月にはPDF2.0の規格ISO3200-2が承認されています。)
ここでは32000-1規格で説明されているPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。

0.PDFファイル 解析手順

PDFデータは1バイト(8ビット)のシーケンスで構成されています。 このシーケンスを複数のASCII文字で構成されたバイトデータの組み合わせ(キーワード)として解析します。
なお解析手順はHelloWorld.pdfデータを使って説明します。

PDF構造の概要は、こちらを参照してください。

0.1 PDFファイルを通常のエディターで開く

PDFデータを通常のエディターで開くとHelloWorld.pdfデータのように表示されます。

ただしPDFデータのバージョンなどによっては、クロスリファレンステーブルが圧縮データ(クロスリファレンス ストリーム)で格納されていて文字化けしたように見える場合がありますので注意してください。

0.2 PDFファイル終端を探す

PDFファイルは以下の「%%EOF」の行で終端されます。

%%EOF

ただし、この行以降に文字などのデータがあっても無視される仕様ですので「%%EOF」の行は必ずしもファイルの最後ではありません。

0.3 クロスリファレンス テーブルへのオフセット値

「%%EOF」行の前2行には以下のように「startxref」キーワードが記載された行と数字だけが記された行が必ずあります。

startxref
665
%%EOF
指定されたPDFファイルの"startxref"を解析します。
(このブラウザでは機能しません。)

この数値はファイルの先頭からのバイト数を表していて、その位置にクロスリファレンスを表す「xref」キーワードが記載されていることを示しています。

0.4 トレイラー ディクショナリ

「startxref」行の前には以下のように「trailer」キーワードが記載された行に続いて、ディクショナリ(「<<」と「>>」で囲まれキーと値のペアが複数個内包されたもの)があります。
PDFファイル終端の一般形は以下のとおりです。

trailer
  << key1 value1
     key2 value2
     ...
     keyn valuen
  >>
startxref
Byte_offset_of_last_cross-reference_section
%%EOF

以下は、その具体例です

trailer
  <<
    /Size 8
    /Info 6 0 R
    /Root 7 0 R
    /ID [<1775615b6d180ff72f4473d56aaa72bf><1775615b6d180ff72f4473d56aaa72bf>]
  >>
startxref
665
%%EOF
指定されたPDFファイルの"trailer"から"%%EOF"までを解析します。
(このブラウザでは機能しません。)

このtrailerディクショナリ(詳細は「2.4トレイラー」を参照してください)にはPDFを構成するオブジェクト ツリーのルートやPDFの概要が記されたオブジェクトへの参照が示されています。
PDFデータを解析する場合はまずルートオブジェクトを探します。Rootキーとペアとなる値「7 0 R」がそのオブジェクトを表します。

0.5 ルート オブジェクト

ルート オブジェクトを探すにはTrailerの「/Root」からたどります。
HelloWorld.pdfの場合は7番目のオブジェクトがそれになります。 以下がそのデータです。

7 0 obj
  <<
    /Type /Catalog
    /Pages 5 0 R
  >>
endobj
指定PDFファイルのRootオブジェクトを解析します。
(このブラウザでは機能しません。)

このディクショナリの「/Pages」で示されたオブジェクト(複数の場合があります)からPDF各ページのコンテンツ(内容)が記載されたオブジェクトをたどれます。

0.6 ページツリー オブジェクト

ルートオブジェクトからたどったページツリーオブジェクトは以下のとおりです。

5 0 obj
  <<
    /Type /Pages
    /Kids [ 4 0 R ]
    /Count 1
  >>
endobj
指定PDFファイルのページツリーオブジェクトを抽出します。
(このブラウザでは機能しません。)

この記述からこのPDF文書は全1ページで構成されていて、そのページの情報が4番目のオブジェクトに記載されていることがわかります。

0.7 ページ オブジェクト

ページツリーからたどったページ オブジェクトは以下のとおりです。

4 0 obj
  <<
    /Type /Page
    /Parent 5 0 R
    /MediaBox [0 0 595 842 ]
    /Resources 2 0 R
    /Contents 3 0 R
  >>
endobj
指定PDFファイルのページオブジェクトを抽出します。
(このブラウザでは機能しません。)

ここから、このページの大きさは幅が595高さが842であることがわかります。 さらにページの内容が3番目のオブジェクトに記載されていることがわかります。

0.8 ページコンテンツ オブジェクト

ページからたどったページコンテンツ オブジェクトは以下のとおりです。

3 0 obj
  <<
    /Filter /FlateDecode
    /Length 72
  >>
stream
...binary data ...
endstream
endobj
指定PDFファイルのページオブジェクトを抽出します。
(このブラウザでは機能しません。)

ここにあるデータは圧縮(Flate圧縮)されていてそのバイトサイズが72であることがわかります。
このデータ(streamとendstreamで囲まれた部分)を伸張した結果は以下のとおりです。

stream
BT
1 0 0 1 100 600 Tm
/SF1 50 Tf
0 Ts 0 Tr 0 Tc 0 Tw
(Hello, World.) Tj
ET
endstream
指定PDFファイルのページ内容(コンテンツ)を抽出します。
(このブラウザでは機能しません。)

この描画コマンドで"Hello, World"という文字列を指定のフォントと大きさで指定の位置に描画します。

>>>「PDF 構造 -概要-

ご質問 ・ お問い合わせ

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


PDF Toolsライト

PDF 構文解説

(ISO32000-1より)

PDF Tools製品概要