PDF 内部構造 基本とファイル構造キー

提供:yonewiki

PDF 内部構造に戻る。

概要

 PDF文書を構成するのには、キー、オペレータと固有の役割のあるキーワードがありました。この記事では、文書構造の基本的な部分で使われるキーとオペレータの細かい部分について触れます。またキーの値や文法についての基本についても触れます。どのように使うキーだったかオペレータだったかは構造の概念 簡単な説明の記事で使ったPDF文書を参考にして下さい。


 ひとつひとつを理解するには深すぎてここでは、完全説明なぞできません。とっかかりとして読み始めると勉強になるかもしれないし、意味不明過ぎて、単に眠くなるだけかもしれない。キヲツケラレタシ。

 

用語

 ノード(Node):〇→〇 のようなイメージです。?。Windowsエクスプローラのフォルダが階層を作るように展開した状態をツリーといいます。日本語では木構造といいます。このときフォルダはツリーを構築する実体(オブジェクト:Object)ですが、木構造のオブジェクトはノードと呼んでいます。ツリーは末端までたどっていくと沢山のノードを持つことができます。そのような形態ですから、ツリーはノードをひとつにまとめ上げることができると言えます。そういった仕組みがPDFでは使われています。複数形だとNodes。深い!

 


 

コメント

 % 記号以降はコメントになります。C や Java の // に相当します。但し一行目の%PDF-1.1とかはヘッダ情報としての役割があります。


%PDF-1.7 %1行目もコメントですが、ヘッダの役割があります。
% 2行目以降はコメントを書くことができる。
1 0 obj % 1 0 obj はPDF構造文書ですが、%記号以降は途中からのコメントです。

 

数値

 以下のように整数と簡単な小数が扱えます。浮動小数点のような表記は扱えません。

 10 +2 -4 1.2 -.4

 

論理値

 真や偽を表す論理代数の考え方でいうところの1(真)をtrue、0(偽)をfalseで表します。

 

ヌル

 なにも設定しないことを意味するヌル(空)はnullで表します。PDF文書では設定は別のところでやります。今はnullかな。みたいな簡単な使い方になります。

 

文字列

 文字列は ( ) 丸カッコではさんで使います。C や Java ではダブルクォーテションを使って文字列リテラルを扱ったのと同じようなことです。文字列開始の ( の後に各種文法キーワードが登場しても、その機能は無視されて、文字列として扱います。文字列開始後 ) で閉じないうちは連続して ( や ) で対になる丸カッコが登場しても文字列の終わりとして扱われることは無く、いづれも文字列中の文字として扱われます。C などのエスケープシーケンスのように明示的に特殊な記号を用いて、特殊な文字列意味のあるコードを使うことができます。16進数文字列は < > 大なり、小なり記号で囲みます。前方から2桁づつが1文字で解釈されます。最後で一桁たりない場合は0を追加します。16進数の英文字部(a~f)は大文字で小文字でもよいです。


シーケンス 意味
\n 改行
\r 復帰
\t 水平タブ
\b バックスペース
\f 改ページ
\( ( 左側丸カッコ(パーレン)
\) ) 右側丸カッコ(パーレン)
\\ \ エスケープ文字そのもの
\ooo oooに示される8進数文字コード 0 ~ 511

 

 例

(Strings Sample)

 

名前

 /で始まる名前は大文字と小文字が区別されます。/から名前終了文字までに空白文字は使えません。/そのものの単独1文字も名前として使えますが、たぶん使わない。


 名前と対にして値を設定することになりますが、このときスペース文字を挟んで対にします。名前と値の間で改行してもよいので、値が辞書の時に改行をいれることが多いのですが、改行の間にも空白をいれる必要があります。

例
/Names %←この行の末尾に半角スペースが必要。
<<
  /SubName 1
  /SpName 2
>>


 名前とその値である辞書の間にスペースが必要なのを忘れると、どこでPDFソースの記述が失敗しているのかがわかりづらくなります。忘れないようにしましょう。  

配列

 [ ] 角カッコ(ブラケット)の中に名前、参照、文字列、数値をおいて、配列を構成することができます。  

 [ ] 先の記事で触れたとおり、2次元配列のような概念がありません。配列の中に配列をいれることはできます。要素を順次、指定するというために使われます。例えば以下のようなモノも配列です。


 [0 (String) /flag 6 0 R [1 0 0 1]]

辞書

 辞書は << >> によって囲われる順序による意味がない塊です。先の記事でフォント書式をネストしたように入れ子で使うこともできます。

 

日付

 日付は <D:YYYYMMDDHHmmSSoHH'mm'>という形式で表記します。日本(東京UTC+9:00)における2021年7月24日21:00:00の場合は


<D:20210724210000+09'00'>

 となります。

 

ストリーム

 ストリームにはテキストやコード化されたもの文書の内容に関する情報を記述します。テキストでもやったようにキー /Lengthと数値でストリームの長さを指定したり、どうやってデコードするべきかという情報を持つキー/Filterとその手法名のキー値を設定します。以下にストリームのキー値を示します。


キー 指定する値の内容
/Length 整数 ストリームのバイト長
/Filter キー値または配列 デコードキー値を指定します。配列で複数のデコードキー値を示せます。
/DecodeParms 辞書または配列 /Filterの指定したキー値に付随するオプションのパラメータを指定します。
/F ファイル指定 PDF-1.2機能ストリームデータのファイル名を指定
/FFilter キーまたは配列 PDF-1.2機能、上記の/F指定時に適用デーコードキー値を指定するために使います
/FDecodeParms 辞書または配列 PDF-1.2機能、上記の/F指定時のオプション指定に使います。


フィルターとパラメータには以下のようなものがあります。具体的な使い方はここでは示しません。


■/ASCIIHexDecode

パラメータ無し


■/ASCII85Decode

パラメータ無し


■/LZWDecode

パラメータ

 /Predictor (整数1,2,10,11,12,13,14,15), /Colors(整数), /BitsPerComponent(整数), /Columns(整数), /EarlyChange(整数)


■/FlateDecode

パラメータ LZWDecodeと同じです。


■/RunLengthDecode

パラメータ無し


■/CCITTFaxDecode

パラメータ /K(整数), /EndOfLine(論理値), /EncodedByteAlign(論理値), /Columns(整数), /Rows(整数), /EndOfBlock(論理値), /Blackls1(論理値), /DamagedRowsBeforeError(整数)


■/DCTDecode

パラメータ /ColorTransform(整数)

 

相互参照テーブル xref

 相互参照テーブル xref(xrefはクロスリファレンスという意味だと思う)では1行目にn番目からm個あるオブジェクトを使うということを定義します。1 0 obj~5 0 objを使用するなら0~5の6個を使うので


xref
0 6
0000000000 65535 f
0000000013 00000 n
0000000113 00000 n
0000000143 00000 n
0000000163 00000 n
0000000213 00000 n
…

 


 となります。1~5の5つのオブジェクトなのに0からはじまるというのは、最初の 0000000000 65535 f という行が必要なためです。これは末尾がfになっていてフリーオブジェクトを意味していて、次に使える番号を示しています。1行目にこれがあれば最初の番号からになります。2行目以降は1オブジェクトづつどこにオブジェクトがあるかファイル先頭からのバイト値と更新番号とnという末尾文字がつけられた行が続きます。ただし、PDFが編集されobj番号がきえた場合は、その行のバイト値を0にして、次のオブジェクト番号が付与されます。上記の例の場合は、削除されたオブジェクトの行が 0000000000 00007 f となるでしょう。そして、つぎのオブジェクトが追加されると、追加されたオブジェクトのファイル先頭からのバイト値と更新番号とnという末尾文字をもったものが追加されるとともにxrefの次の行は 0 7 となるでしょう。このほかオブジェクト番号に空き番あるパターンでは以下のような記述もあるかもしれません。


xref
0 1
0000000000 65535 f
3 1
0000000013 00000 n
44 2
0000000113 00000 n
0000000143 00000 n
50 2
0000000163 00000 n
0000000213 00000 n
…

 

 更新処理の部分を作るのは難しいので、こういうところまで支援するようなアプリをつくる場合はもっと深い理解が必要なので、仕様書を読み込まないとだめかもです。仕様書には更新処理に関することも言及されています。読むしかないですね。

 

トレーラ

 trailerは追跡するモノという意味があります。ここで、文書全体のことにかかわる情報を設定したりします。キー /Size と /Root は必須の重要なキーワードです。trailer部で設定できるキーは以下のとおりです。

キー 指定する値の内容
/Size 整数 全オブジェクト数より1大きい値。プラス1は使えるオブジェクト番号を示したフリーエントリの1件分
/Root 辞書 参照値 カタログオブジェクトへの参照
/Prev 整数 更新されたファイルに存在していて、この場合トレーラ部は2か所に分かれるので、その手前のトレーラ部があるファイル先頭からのバイト値
/Encrypt 辞書 暗号化手法を定義した辞書への参照。
/Info 辞書 文書情報を記載したオブジェクトへの参照
/ID 配列 文書情報から生成した2つのMD5文字列

 

 /IDで使われるMD5とは The MD5 Message Digest Algorithmという暗号化方式で、暗号と復号が同一の手順になっています。ファイルの識別子として使われます。1つめのIDは生成した時の文書情報で2つめのIDは更新する都度、生成するものです。この識別子は、文書が作成された、更新された時間、ファイルのパス、ファイルのサイズ、ファイルの文書情報のすべての値を元に生成されます。暗号化に使う訳ではないので、文字列に上記の項目を含めて、MD5の値を生成していれば、特に決まりはないと思います。AdobeのPDF1.7仕様書にも、やり方は書いてませんでした。


 /Infoに指定する辞書には以下のようなキーに文字列を設定できます。


キー 指定する値の内容
/Title 文字列 PDF文書の題名
/Author 文字列 文書の作成者名
/Subject 文字列 文書の主題
/Keywords 文字列 文書に関連するキーワード
/Creator 文字列 文書を生成した元のアプリケーションの名前
/Producer 文字列 文書の生成処理を実施したアプリケーションの名前
/CreationDate 日付 文書を生成した日付
/ModDate 日付 文書が更新された日付
/Trapped 名前 トラッピング情報を含むかどうかを示す


 トラッピングとは、各オブジェクト同士の図形の縁、境界の処理をしていないと、カラー印刷時の3色、4色の回数分だけオーバーラップして印刷するような場合にオフセットがずれると、縁が汚くなる問題を解決するために施す処理のことで、境界部分の重なり部分に工夫をするような処理になります。これを実施しているかどうかを文書情報として示すことができるということです。設定しない場合はUnknownが設定されます。論理値ではなく、名前で設定します。


/Trapped /True
/Trapped /False
/Trapped /Unknown


文書カタログ

 文書カタログはトレーラ部の中で呼ばれるべきもので、カタログには目録という意味があります。目次のような役割でもあります。以下のような名前と値を定義する部分になります。

キー 指定する値の内容
/Type ★ 名前 /Catalog と指定します。必須です。
/Pages ★(間接[指]) 辞書 文書ページである/Type /Pageのルートへの参照を指定する
/Pagelabels 数値 (PDF1.3以降)
/Names 辞書 (PDF1.2以降)
/Dests(間接[指]) 辞書 (PDF1.1以降)
/ViewerPreferences 辞書 (PDF1.2以降)
/PageLayout 名前
/SinglePage 1ページ表示 ページの移動コマンドを使わないと次は表示しない。
/OneColumns ページを連続表示
/TwoColumnsLeft 1,3,5… 奇数ページを左に表示
/TwoColumnsRight 1,3,5… 奇数ページを右に表示
/PageMode 名前
/UseNone (規定値) アウトラインとサムネイルを非表示
/UseThumbs サムネイル表示
/UseOutlines アウトライン表示
/FullScreens 文書内容をフルスクリーン表示
/Outlines(間接[指]) 辞書
/Threads(間接[指]) 配列 (PDF1.1以降)
/OpenAction 配列か辞書 (PDF1.1以降)
/URI 辞書
/AcroForm 辞書 (PDF1.2以降)
/StructTreeRoot 辞書 (PDF1.3以降)
/SpiderInfo 辞書 (PDF1.3以降)

 

ページツリー

 文書ページ情報を記載したオブジェクト。文書の内容ではなく、例えばページのサイズのようなページ固有の形式の情報を記述するものです。

ページツリーノード

 ページツリーには、ページ情報を記載しますが、ページツリーを記載したページが書いてある参照をまとめる情報を記載するものとして、ページツリーノードというものが使われるのも一般的です。ページツリーは、複数階層として組めるので、ページツリーノードの参照先がまたページツリーノードになっていて、何回かページツリーノードを参照した先にページ情報を記載しているものがあるという構造をもたせることが出来ます。

キー 指定する値の内容
/Type ★ 名前 /Pages と指定します。必須です。
/Parent ★(間接[指]) 辞書 複数階層を持つページツリーノードでどこから参照されたかという情報を記載する辞書です。
/Kids ★ 配列 ページツリーノードあるいはページ情報への参照を配列で指定します。
/Count ★ 整数 ぶら下がっているページツリーノード、ページ情報への参照の総数。その下にぶら下がっているものはカウントしない。直接ぶら下がっている数だけ


 例

5 0 obj
<< 
 /Type /Pages
 /Parent 2 0 R
 /Kids [ 6 0 R 7 0 R 9 0 R ]
 /Count 3
>>
endobj


 

ページオブジェクト

 ページツリーノードの終端にぶら下がるオブジェクトで、ページ情報を保持するものです。

キー 指定する値の内容
/Type ★ 名前 /Page と指定します。必須です。ページツリーノードは/Pagesです。末尾に s が付く使いないでオブジェクトの意味する/Typeが異なります。気を付けて。
/Parent ★(間接[指]) 辞書 複数階層を持つページツリーノードでどこから参照されたかという情報を記載する辞書です。
/Resources ☆ 辞書 指定しない場合は親ノード、階層を遡ったところにある一番近い階層の指定を採用します。どこかで指定してある必要はあります。こういう状態をここでは、必須(継承可)あるいは☆と表現します。
/MediaMix ☆ 矩形 必須(継承可) ページのサイズをピクセルで指定します。
/CropBox ◇ 矩形 指定しない場合は親ノード、階層を遡ったところにある一番近い階層の指定を採用します。どこかで指定してある必要はなく省略可能。こういう状態をここでは、省略可(継承可)あるいは◇と表現します。印刷・表示対象の領域。MediaBox値が規定値
/BleedBox 矩形 (PDF1.3以上)制作環境の出力において対象となる領域。CropBox値が規定値
/TrimBox 矩形 トリミング後寸法。CropBox値が規定値
/ArtBox 矩形 作者が意図する出力領域。CropBox値が規定値
/Contents ストリームか配列 トリミング後寸法。CropBox値が規定値
/Rotate 整数 0, 90, 180, 270のいずれかを度数で表示。0 が規定値
/Thumb ストリーム サムネールイメージを指定
/B 配列 (PDF1.1以上)アーティクルビーズへの参照配列を設定
/Dur 数値 ページ表示時間を秒で指定。
/Trans 配列 (PDF1.1以上)アーティクルビーズへの参照配列を設定
/Dur 数値 (PDF1.1以上)ページ表示時間を秒で指定。
/Trans 辞書 (PDF1.1以上)次ページへの移行効果への参照を設定
/Annots 配列 注釈辞書配列
/AA 辞書 (PDF1.2以上)オープンクローズ時のアクションへの参照を設定
/PieceInfo 辞書 (PDF1.3以上)ページピース辞書
/LastModified 日付 (PDF1.3以上)ページが最後に変更された日付と時間
/StructParents 整数 (PDF1.3以上)構造ペアレントツリーにおけるページのエントリ整数キー
/ID 文字列 (PDF1.3以上)できれば間接参照で記述するページペアレントWebCaptureコンテンツセットのデジタル識別子
/PZ 数値 (PDF1.3以上)構造ペアレントツリーにおけるページのエントリ整数キー
/SeparationInfo 辞書 (PDF1.3以上)色分解辞書


 

名前辞書

 名前辞書は /xxx という形式の名前に対応する値は何かというものを複数設定しているような << >> で囲われた辞書のことです。これを使って様々な名前が準備されるため、各オブジェクトでの値の指定が楽になります。以下のようなキーも設定できます。

キー 指定する値の内容
/Dests 名前 名前辞書の割り当てをする先
/AP 名前 注釈外観ストリームに割り当てする名前
/JavaScript 名前 JavaScriptの割り当てをする先
/Pages 名前 可視ページへの対話フォームの割り当てする名前
/Templates 名前 不可視ページへの対話フォームの割り当てをする名前
/IDS 名前 コンテンツIDをWeb Captureコンテンツセットに割り当てする名前
/URLS 名前 URLをWeb Captureコンテンツセットに割り当てする名前

 

コンテンツストリーム

 コンテンツを記述する部分です。PDF1.0~1.7および2.0にわたって起こる互換性エラーを無視することを明示するオペレータがあります。

BX オペレータ。このオペレータが登場したところから EX オペレータが出るところまでが互換性エラーに対して柔軟に対応するべく、互換性エラーを無視してくれます。

 

リソース辞書

 フォントやグラフィックス設定なんかを指定する役割の辞書です。以下のようなキーでそれぞれのリソースを設定できます。

キー 指定する値の内容
/ExtGState 辞書 グラフィック状態を指定する辞書
/ColorSpace 辞書 カラースペース。カラー指定に関する設定を指定する辞書
/Pattern 辞書 パターン状態を指定する辞書
/Shading 辞書 面の表面状態であるシェーディング指定に関する設定を指定する辞書
/XObject ストリーム 外部オブジェクトを割り当てする辞書。
/Font 辞書 フォント指定に関する設定を指定する辞書
/ProcSet 配列 定義済み手続きセットの名前を割り当てする配列。
/Properties 辞書 マーク付きコンテンツ用の特性リスト辞書の指定に関する設定を指定する辞書

 

矩形

 矩形データは4つのデータを持つ配列として [左下x 左下y 右上x 右上y] の形式で表現します。

 

名前ツリー

 名前ツリーは以下のようなキーを用いて構成します。

キー 指定する値の内容
/Kids 配列 子への参照を配列で指定。。
/Names 配列 名前と参照の対を配列で指定
/Limits 配列 Namesの名前から名前までの値を使うことを明示する。


 

2 0 obj
<<
  /Limits [(Saturday) (Sunday)]
  /Kids [
    4 0 R
    5 0 R
  ]
>>
endobj

3 0 obj
<<
  /Limits [(Monday) (Friday)]
  /Names [
    (Monday) 6 0 R
    (Tuesday) 7 0 R
    (Wednesday) 8 0 R
    (Thursday) 9 0 R
    (Friday) 10 0 R
  ]
>>
endobj

 

数値ツリー

 名前ツリーでは /Names 文字列 だったものが /Nums 数値にかわったものを数値ツリーと呼んでいます。

 

キー 指定する値の内容
/Kids 配列 子への参照を配列で指定。。
/Nums 配列 名前と参照の対を配列で指定
/Limits 配列 配列に対象とする最小値と最大値を指定する

 

関数

 PDFは文書であり、プログラムではありませんが、簡単な計算機能と関数としての機能づくりをする工夫が準備されています。文書の情報から計算して準備しなければならない情報を作るときに使います。以下のようなキーを使って、関数を使います。


キー 指定する値の内容
/FunctionType ★ 整数 関数のタイプを数値で以下より指定します。
0 : サンプリング関数
2 : 指数補完関数
3 : 縫合関数
4 : PostScript計算関数
/Domain ★ 配列 2 × m[個] の配列。m個の最小値と最大値の組み合わせを指定。関数の変域の確認に使います。
/Range 配列 /FunctionType 0 と 4で必須のキー。2 × m[個]の配列。m個の値域の最小値と最大値を指定します。


 上記のキーでは、関数のタイプを選択して、関数の変域(数学ではよくxになる値)と値域(数学ではよくyになる値)の最小値と最大値を設定する感じです。値が最小値より下回ったら、最小値に置換し、最大値を上回ったら最大値に置換します。関数のタイプによって、続けて指定できるキーが変わります。以下に /FunctionType の値ごとのキー値について記述します。  

/FunctionType 0 : サンプリング関数

キー 指定する値の内容
/Size ★ 配列 次元ごとのサンプル数を指定した整数値の配列
/BitsPerSample ★ 整数 サンプリングビット数
/Order 整数 サンプル間の補完の次数。1次, 2次, 3次近似とかの奴だわな。
/Encode 配列 変域のマッピング値 2 × m[個]の配列で指定します。始値と終値の対の個数分だけ指定します。
/Decode 配列 値域のマッピング値 2 × m[個]の配列で指定します。始値と終値の対の個数分だけ指定します。

 

 上記と必要なストリームのキーも使います。

 

/FunctionType 2 : 指数補完関数

キー 指定する値の内容
/C0 配列 値域 0 に対する値を定義する。
/C1 配列 値域 1 に対する値を定義する。
/N ★ 整数 補完指数

 

/FunctionType 3 : 縫合関数

 複数の1入力関数を結合して利用するための関数

キー 指定する値の内容
/Functions ★ 配列 1入力のm[個]の関数
/Bounds ★ 配列 関数が適用される区間を定義する。
/Encode ★ 配列 2 × m[個]の関数のDomainとBoundsで定義される変数名の配列

 

/FunctionType 4 : PostScript関数

 ストリームを使って記述する関数で、追加のキーはありませんが、オペランドとオペレータを使って表現します。PostScriptという名前がついていますが、このストリームにPostScriptを記述できるわけではないです。PostScriptにもあるような計算ができる関数機能だと思えばよいと思います。その関数もPostScriptの仕様に従うのではなくPDFの仕様に従うことになっています。

 

オペレータの種類 オペレータ
算術オペレータ abs cvi floor mod sin
add cvr idiv mul sqrt
atan div ln neg sub
ceiling exp log round truncate
cos
比較 論理 ビット and false le not true
bitshift ge lt or xor
eq gt ne
条件オペレータ if iflese
スタックオペレータ copy exch pop
dup index roll

 

steam
{
  2 mul
  2 div   
}
endstream

   

 上記のように逆ポーランド記法のように書かれていくところが特徴です。関数の変域へ与えられた値をスタックに入れ、スタックに対して、2を掛けて、その結果として入ったスタック値へ、2で割っているという例です。

 

ファイル指定

 絶対パスや相対パスのような仕組みを使って外部ファイルを参照することがあります。ファイルの指定は以下のように / によって区切られた表現を使うことになります。以下に代表的なOSにおける表記と、PDFで使われる表記を示しました。


■Windows
OS  C:\User\xxx\Documents\Creative\PDF_Principle\workspace\Work.pdf
PDF /c/User/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf
■Unix
OS  /usr/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf
PDF /usr/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf
■MacOS
OS  MacHD:xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf
PDF /MacHD/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf


 / は、\/ で表現しますが、このときの\もエスケープする必要があり \\/ としなければならないと記載があります。具体的には実験してから記事を追記したいです。日本語は < > で囲ったバイトコードで表記する必要があります。また末尾が 5C(ASCIIコードの \に対応 )になる場合は、次の1バイトコードがエスケープシーケンス文字であると認識してしまうため、末尾コードに 5C がある場合は、もう一つ 5C を挿入して 5C そのもののコードであることを明示しなければなりません。いわゆる 5C 問題です。基本的には 5C ではじまる文字コードはないので、文字コードに 5C がある場合に注意しなければならないと言えるでしょう。上の階層に移動するときは、コマンドラインでもよく使われる .. 2連続ピリオドを指定します。

 

ファイル指定辞書

 前項のようなファイル指定を具体的に実施すする辞書です。用意されたキーでより詳細に外部ファイル参照を行います。以下のようなキーを使います。

 

キー 指定する値の内容
/Type 名前 定義する必要がある場合 /Filespec である必要があります。
/FS 名前 ファイルシステムの名前を定義します。/DOSや/Macや/Unixと関連がありません。
/F 文字列 前の項目で説明したファイル指定の文字列
/Mac 文字列 MacでPDFが動作している場合における外部ファイル指定の文字列
/DOS 文字列 DOS(Windows)でPDFが動作している場合における外部ファイル指定の文字列
/Unix 文字列 UNIXでPDFが動作している場合における外部ファイル指定の文字列
/ID 配列 2つのファイル識別子
/V 文字列 UNIXでPDFが動作している場合における外部ファイル指定の文字列
/EF 辞書 /F, /Mac, /DOS, /Unixのサブセットを含む辞書
/RF 辞書 /F, /Mac, /DOS, /Unixのサブセットを含む辞書と同様の辞書


 

埋め込みファイルストリーム

 前の項目までに紹介した外部ファイルのようなものをPDF自体に埋め込むための仕組みです。ファイルの依存関係が解消されるので、PDFファイルの中身が正しく表示されることを高めるものです。ただし、PDFファイル自体の容量が大きくなるデメリットはあります。繰り返し参照されないファイルであれば、埋め込んだ方が良いかもしない。埋め込みファイルストリームには以下のようなキーを使います。

 

キー 指定する値の内容
/Type 名前 定義する場合 /EmbeddedFile である必要があります。
/SubType 名前 MIMEメディアタイプの名前を定義します。
/Params 文字列 埋め込みファイルパラメータ辞書を指定します。

 

埋め込みパラメータ辞書

 埋め込みファイルストリームの /Params キーに指定する辞書には以下のようなキーを指定します。    

キー 指定する値の内容
/Size 整数 埋め込みファイルのバイト長
/CreationDate 日付 埋め込みファイルの作成日時
/ModDate 日付 埋め込みファイルの更新日時
/Mac 辞書 埋め込みファイルに関するMacOS固有向けの情報
/CheckSum 文字列 ファイルを構成する全情報をMD5によって算出して生成される16バイトの文字列。

 

埋め込みファイルMacOS向け辞書

 埋め込みファイルストリームの /Params キーに指定する辞書には以下のようなキーを指定します。    

キー 指定する値の内容
/SubType 文字列 埋め込みファイルタイプ
/Creater 文字列 埋め込みファイルの作成者名
/ResFork ストリーム 埋め込みファイルのリソースフォークバイナリ

 

URL

 ファイル指定にURLが使えます。/FS に 値 /URL と /F キーを使って以下のように記述します。

  例

<<
  /FS URL
  /F (http://www.yo-net.jp/pdf/embedded.jpg)
>>

 こんな感じ。


以上が、PDFの基本的な構造で使うものでした。具体的な使用例はおいおいでしょうか。

 

PDF 内部構造に戻る。