トラスト・ソフトウェア・システム
ホーム > PDF Tools トップ > PDF Tools ライト > PDF 構文

PDF構文 (PDF Syntax ISO 32000-1)

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

>>>「PDF ファイル構造 -概要-」へ


0.PDFファイル 解析手順

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


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


PDF Easy Parse 2.0 PDF Easy Parse ライブラリは、PDFの構造をより簡単に解析できる機能を備えたツールです。
このPDF Easy Parseを使うと、複雑なPDF構造の中から必要な部分だけを容易に取り出したり、解析したりできます。PDF Easy Parseは、PDF構造の解析専用ライブラリです。
PDF Easy Parseライブラリを使ってPDFファイルの構造を表示するPDF Struct Viewer(PDF構造解析表示)アプリケーションを参照してください。


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

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

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


0.2 PDFファイル終端を探す

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

%%EOF

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


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

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

startxref
665
%%EOF

この数値は、ファイルの先頭からのバイト数を表していて、その位置にクロスリファレンスを表す「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

この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

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


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

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

5 0 obj
  <<
    /Type /Pages
    /Kids [ 4 0 R ]
    /Count 1
  >>
endobj

ここから、この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

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


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

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

3 0 obj
  <<
    /Filter /FlateDecode
    /Length 72
  >>
stream
...binary data ...
endstream
endobj

ここにあるデータは、圧縮(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

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


>>>「PDF 構造 -概要-」へ


ご質問、お問い合わせ

メールで support@TrustSS.co.jp 宛てにお送りください。
または、質問のページからお送りいただくようお願いします。ご要望も承っております。(匿名で送れます。)




スリーソフト作者の方へ

PDF Easy Parseライブラリを無償で利用できるプログラムがあります。
こちらを参照してください。