PDF 内部構造 基本とファイル構造キーのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[PDF 内部構造]]に戻る。 == '''概要''' == PDF文書を構成するのには、キー、オペレータと固有の役割のあるキーワードがありました。この記事では、文書構造の基本的な部分で使われるキーとオペレータの細かい部分について触れます。またキーの値や文法についての基本についても触れます。どのように使うキーだったかオペレータだったかは[[PDF 内部構造 構造の概念 簡単な説明|構造の概念 簡単な説明]]の記事で使ったPDF文書を参考にして下さい。 === '''用語''' === ノード(Node):〇→〇 のようなイメージです。?。Windowsエクスプローラのフォルダが階層を作るように展開した状態をツリーといいます。日本語では木構造といいます。このときフォルダはツリーを構築する実体(オブジェクト:Object)ですが、木構造のオブジェクトはノードと呼んでいます。ツリーは末端までたどっていくと沢山のノードを持つことができます。そのような形態ですから、ツリーはノードをひとつにまとめ上げることができると言えます。そういった仕組みがPDFでは使われています。複数形だとNodes。深い! === '''コメント''' === % 記号以降はコメントになります。C や Java の // に相当します。但し一行目の%PDF-1.1とかはヘッダ情報としての役割があります。 例 <Syntaxhighlight2 lang="text"> %PDF-1.7 %1行目もコメントですが、ヘッダの役割があります。 % 2行目以降はコメントを書くことができる。 1 0 obj % 1 0 obj はPDF構造文書ですが、%記号以降は途中からのコメントです。 </Syntaxhighlight2> === '''数値''' === 以下のように整数と簡単な小数が扱えます。浮動小数点のような表記は扱えません。 10 +2 -4 1.2 -.4 === '''論理値''' === 真や偽を表す論理代数の考え方でいうところの1(真)をtrue、0(偽)をfalseで表します。 === '''ヌル''' === なにも設定しないことを意味するヌル(空)はnullで表します。PDF文書では設定は別のところでやります。今はnullかな。みたいな簡単な使い方になります。 === '''文字列''' === 文字列は ( ) 丸カッコではさんで使います。C や Java ではダブルクォーテションを使って文字列リテラルを扱ったのと同じようなことです。文字列開始の ( の後に各種文法キーワードが登場しても、その機能は無視されて、文字列として扱います。文字列開始後 ) で閉じないうちは連続して ( や ) で対になる丸カッコが登場しても文字列の終わりとして扱われることは無く、いづれも文字列中の文字として扱われます。C などのエスケープシーケンスのように明示的に特殊な記号を用いて、特殊な文字列意味のあるコードを使うことができます。16進数文字列は < > 大なり、小なり記号で囲みます。前方から2桁づつが1文字で解釈されます。最後で一桁たりない場合は0を追加します。16進数の英文字部(a~f)は大文字で小文字でもよいです。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 200px;">シーケンス</th> <th>意味</th> </tr> <tr> <td>\n</td> <td>改行</td> </tr> <tr style=" background: #dddddd;"> <td>\r</td> <td>復帰</td> </tr> <tr> <td>\t</td> <td>水平タブ</td> </tr> <tr style=" background: #dddddd;"> <td>\b</td> <td>バックスペース</td> </tr> <tr> <td>\f</td> <td>改ページ</td> </tr> <tr style=" background: #dddddd;"> <td>\(</td> <td> ( 左側丸カッコ(パーレン)</td> </tr> <tr> <td>\)</td> <td> ) 右側丸カッコ(パーレン)</td> </tr> <tr style=" background: #dddddd;"> <td>\\</td> <td> \ エスケープ文字そのもの</td> </tr> <tr> <td>\ooo</td> <td>oooに示される8進数文字コード 0 ~ 511</td> </tr> </table> 例 <Syntaxhighlight2 lang="text"> (Strings Sample) </Syntaxhighlight2> === '''名前''' === /で始まる名前は大文字と小文字が区別されます。/から名前終了文字までに空白文字は使えません。/そのものの単独1文字も名前として使えますが、たぶん使わない。 === '''配列''' === [ ] 角カッコ(ブラケット)の中に名前、参照、文字列、数値をおいて、配列を構成することができます。 [ ] 先の記事で触れたとおり、2次元配列のような概念がありません。配列の中に配列をいれることはできます。要素を順次、指定するというために使われます。例えば以下のようなモノも配列です。 例<br /> [0 (String) /flag 6 0 R [1 0 0 1]] === '''辞書''' === 辞書は << >> によって囲われる順序による意味がない塊です。先の記事でフォント書式をネストしたように入れ子で使うこともできます。 === '''日付''' === 日付は <D:YYYYMMDDHHmmSSoHH'mm'>という形式で表記します。日本(東京UTC+9:00)における2021年7月24日21:00:00の場合は 例<br /> :<D:20210724210000+09'00'> となります。 === '''ストリーム''' === ストリームにはテキストやコード化されたもの文書の内容に関する情報を記述します。テキストでもやったようにキー /Lengthと数値でストリームの長さを指定したり、どうやってデコードするべきかという情報を持つキー/Filterとその手法名のキー値を設定します。以下にストリームのキー値を示します。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Length</td> <td>整数</td> <td>ストリームのバイト長</td> </tr> <tr style=" background: #eeeeee;"> <td>/Filter</td> <td>キー値または配列</td> <td>デコードキー値を指定します。配列で複数のデコードキー値を示せます。</td> </tr> <tr style=" background: #dddddd;"> <td>/DecodeParms</td> <td>辞書または配列</td> <td>/Filterの指定したキー値に付随するオプションのパラメータを指定します。</td> </tr> <tr> <td>/F</td> <td>ファイル指定</td> <td>PDF-1.2機能ストリームデータのファイル名を指定</td> </tr> <tr style=" background: #eeeeee;"> <td>/FFilter</td> <td>キーまたは配列</td> <td>PDF-1.2機能、上記の/F指定時に適用デーコードキー値を指定するために使います</td> </tr> <tr style=" background: #dddddd;"> <td>/FDecodeParms</td> <td>辞書または配列</td> <td>PDF-1.2機能、上記の/F指定時のオプション指定に使います。</td> </tr> </table> フィルターとパラメータには以下のようなものがあります。具体的な使い方はここでは示しません。 ■/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個を使うので 例 <Syntaxhighlight2 lang="text"> xref 0 6 0000000000 65535 f 0000000013 00000 n 0000000113 00000 n 0000000143 00000 n 0000000163 00000 n 0000000213 00000 n … </Syntaxhighlight2> となります。1~5の5つのオブジェクトなのに0からはじまるというのは、最初の 0000000000 65535 f という行が必要なためです。これは末尾がfになっていてフリーオブジェクトを意味していて、次に使える番号を示しています。1行目にこれがあれば最初の番号からになります。2行目以降は1オブジェクトづつどこにオブジェクトがあるかファイル先頭からのバイト値と更新番号とnという末尾文字がつけられた行が続きます。ただし、PDFが編集されobj番号がきえた場合は、その行のバイト値を0にして、次のオブジェクト番号が付与されます。上記の例の場合は、削除されたオブジェクトの行が 0000000000 00007 f となるでしょう。そして、つぎのオブジェクトが追加されると、追加されたオブジェクトのファイル先頭からのバイト値と更新番号とnという末尾文字をもったものが追加されるとともにxrefの次の行は 0 7 となるでしょう。このほかオブジェクト番号に空き番あるパターンでは以下のような記述もあるかもしれません。 例 <Syntaxhighlight2 lang="text"> 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 … </Syntaxhighlight2> 更新処理の部分を作るのは難しいので、こういうところまで支援するようなアプリをつくる場合はもっと深い理解が必要なので、仕様書を読み込まないとだめかもです。仕様書には更新処理に関することも言及されています。読むしかないですね。 === '''トレーラ''' === trailerは追跡するモノという意味があります。ここで、文書全体のことにかかわる情報を設定したりします。キー /Size と /Root は必須の重要なキーワードです。trailer部で設定できるキーは以下のとおりです。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Size</td> <td>整数</td> <td>全オブジェクト数より1大きい値。プラス1は使えるオブジェクト番号を示したフリーエントリの1件分</td> </tr> <tr style=" background: #eeeeee;"> <td>/Root</td> <td>辞書 参照値</td> <td>カタログオブジェクトへの参照</td> </tr> <tr> <td>/Prev</td> <td>整数</td> <td>更新されたファイルに存在していて、この場合トレーラ部は2か所に分かれるので、その手前のトレーラ部があるファイル先頭からのバイト値</td> </tr> <tr style=" background: #eeeeee;"> <td>/Encrypt</td> <td>辞書</td> <td>暗号化手法を定義した辞書への参照。</td> </tr> <tr> <td>/Info</td> <td>辞書</td> <td>文書情報を記載したオブジェクトへの参照</td> </tr> <tr style=" background: #eeeeee;"> <td>/ID</td> <td>配列</td> <td>文書情報から生成した2つのMD5文字列</td> </tr> </table> /IDで使われるMD5とは The MD5 Message Digest Algorithmという暗号化方式で、暗号と復号が同一の手順になっています。ファイルの識別子として使われます。1つめのIDは生成した時の文書情報で2つめのIDは更新する都度、生成するものです。この識別子は、文書が作成された、更新された時間、ファイルのパス、ファイルのサイズ、ファイルの文書情報のすべての値を元に生成されます。暗号化に使う訳ではないので、文字列に上記の項目を含めて、MD5の値を生成していれば、特に決まりはないと思います。AdobeのPDF1.7仕様書にも、やり方は書いてませんでした。 /Infoに指定する辞書には以下のようなキーに文字列を設定できます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Title</td> <td>文字列</td> <td>PDF文書の題名</td> </tr> <tr style=" background: #eeeeee;"> <td>/Author</td> <td>文字列</td> <td>文書の作成者名</td> </tr> <tr> <td>/Subject</td> <td>文字列</td> <td>文書の主題</td> </tr> <tr style=" background: #eeeeee;"> <td>/Keywords</td> <td>文字列</td> <td>文書に関連するキーワード</td> </tr> <tr> <td>/Creator</td> <td>文字列</td> <td>文書を生成した元のアプリケーションの名前</td> </tr> <tr style=" background: #eeeeee;"> <td>/Producer</td> <td>文字列</td> <td>文書の生成処理を実施したアプリケーションの名前</td> </tr> <tr> <td>/CreationDate</td> <td>日付</td> <td>文書を生成した日付</td> </tr> <tr style=" background: #eeeeee;"> <td>/ModDate</td> <td>日付</td> <td>文書が更新された日付</td> </tr> <tr> <td>/Trapped</td> <td>名前</td> <td>トラッピング情報を含むかどうかを示す</td> </tr> </table> トラッピングとは、各オブジェクト同士の図形の縁、境界の処理をしていないと、カラー印刷時の3色、4色の回数分だけオーバーラップして印刷するような場合にオフセットがずれると、縁が汚くなる問題を解決するために施す処理のことで、境界部分の重なり部分に工夫をするような処理になります。これを実施しているかどうかを文書情報として示すことができるということです。設定しない場合はUnknownが設定されます。論理値ではなく、名前で設定します。 例<br /> /Trapped /True<br /> /Trapped /False<br /> /Trapped /Unknown<br /> === '''文書カタログ''' === 文書カタログはトレーラ部の中で呼ばれるべきもので、カタログには目録という意味があります。目次のような役割でもあります。以下のような名前と値を定義する部分になります。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Type ★</td> <td>名前</td> <td>/Catalog と指定します。必須です。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Pages ★(間接[指])</td> <td>辞書</td> <td>文書ページである/Type /Pageのルートへの参照を指定する</td> </tr> <tr> <td>/Pagelabels</td> <td>数値</td> <td>(PDF1.3以降)</td> </tr> <tr style=" background: #eeeeee;"> <td>/Names</td> <td>辞書</td> <td>(PDF1.2以降)</td> </tr> <tr> <td>/Dests(間接[指])</td> <td>辞書</td> <td>(PDF1.1以降)</td> </tr> <tr style=" background: #eeeeee;"> <td>/ViewerPreferences</td> <td>辞書</td> <td>(PDF1.2以降)</td> </tr> <tr> <td>/PageLayout</td> <td>名前</td> <td></td> </tr> <tr> <td></td> <td></td> <td>/SinglePage 1ページ表示 ページの移動コマンドを使わないと次は表示しない。</td> </tr> <tr> <td></td> <td></td> <td>/OneColumns ページを連続表示</td> </tr> <tr> <td></td> <td></td> <td>/TwoColumnsLeft 1,3,5… 奇数ページを左に表示</td> </tr> <tr> <td></td> <td></td> <td>/TwoColumnsRight 1,3,5… 奇数ページを右に表示</td> </tr> <tr style=" background: #eeeeee;"> <td>/PageMode</td> <td>名前</td> <td></td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td></td> <td>/UseNone (規定値) アウトラインとサムネイルを非表示</td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td></td> <td>/UseThumbs サムネイル表示</td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td></td> <td>/UseOutlines アウトライン表示</td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td></td> <td>/FullScreens 文書内容をフルスクリーン表示</td> </tr> <tr> <td>/Outlines(間接[指])</td> <td>辞書</td> <td></td> </tr> <tr style=" background: #eeeeee;"> <td>/Threads(間接[指])</td> <td>配列</td> <td>(PDF1.1以降)</td> </tr> <tr> <td>/OpenAction</td> <td>配列か辞書</td> <td>(PDF1.1以降)</td> </tr> <tr style=" background: #eeeeee;"> <td>/URI</td> <td>辞書</td> <td></td> </tr> <tr> <td>/AcroForm</td> <td>辞書</td> <td>(PDF1.2以降)</td> </tr> <tr style=" background: #eeeeee;"> <td>/StructTreeRoot</td> <td>辞書</td> <td>(PDF1.3以降)</td> </tr> <tr> <td>/SpiderInfo</td> <td>辞書</td> <td>(PDF1.3以降)</td> </tr> </table> === '''ページツリー''' === 文書ページ情報を記載したオブジェクト。文書の内容ではなく、例えばページのサイズのようなページ固有の形式の情報を記述するものです。 ==== '''ページツリーノード''' ==== ページツリーには、ページ情報を記載しますが、ページツリーを記載したページが書いてある参照をまとめる情報を記載するものとして、ページツリーノードというものが使われるのも一般的です。ページツリーは、複数階層として組めるので、ページツリーノードの参照先がまたページツリーノードになっていて、何回かページツリーノードを参照した先にページ情報を記載しているものがあるという構造をもたせることが出来ます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Type ★</td> <td>名前</td> <td>/Pages と指定します。必須です。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Parent ★(間接[指])</td> <td>辞書</td> <td>複数階層を持つページツリーノードでどこから参照されたかという情報を記載する辞書です。</td> </tr> <tr> <td>/Kids ★</td> <td>配列</td> <td>ページツリーノードあるいはページ情報への参照を配列で指定します。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Count ★</td> <td>整数</td> <td>ぶら下がっているページツリーノード、ページ情報への参照の総数。その下にぶら下がっているものはカウントしない。直接ぶら下がっている数だけ</td> </tr> </table> 例 <Syntaxhighlight2 lang="text"> 5 0 obj << /Type /Pages /Parent 2 0 R /Kids [ 6 0 R 7 0 R 9 0 R ] /Count 3 >> endobj </Syntaxhighlight2> ==== '''ページオブジェクト''' ==== ページツリーノードの終端にぶら下がるオブジェクトで、ページ情報を保持するものです。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Type ★</td> <td>名前</td> <td>/Page と指定します。必須です。ページツリーノードは/Pagesです。末尾に s が付く使いないでオブジェクトの意味する/Typeが異なります。気を付けて。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Parent ★(間接[指])</td> <td>辞書</td> <td>複数階層を持つページツリーノードでどこから参照されたかという情報を記載する辞書です。</td> </tr> <tr> <td>/Resources ☆</td> <td>辞書</td> <td>指定しない場合は親ノード、階層を遡ったところにある一番近い階層の指定を採用します。どこかで指定してある必要はあります。こういう状態をここでは、必須(継承可)あるいは☆と表現します。</td> </tr> <tr style=" background: #eeeeee;"> <td>/MediaMix ☆</td> <td>矩形</td> <td>必須(継承可) ページのサイズをピクセルで指定します。</td> </tr> <tr> <td>/CropBox ◇</td> <td>矩形</td> <td>指定しない場合は親ノード、階層を遡ったところにある一番近い階層の指定を採用します。どこかで指定してある必要はなく省略可能。こういう状態をここでは、省略可(継承可)あるいは◇と表現します。印刷・表示対象の領域。MediaBox値が規定値</td> </tr> <tr style=" background: #eeeeee;"> <td>/BleedBox </td> <td>矩形</td> <td>(PDF1.3以上)制作環境の出力において対象となる領域。CropBox値が規定値</td> </tr> <tr> <td>/TrimBox</td> <td>矩形</td> <td>トリミング後寸法。CropBox値が規定値</td> </tr> <tr style=" background: #eeeeee;"> <td>/ArtBox </td> <td>矩形</td> <td>作者が意図する出力領域。CropBox値が規定値</td> </tr> <tr> <td>/Contents</td> <td>ストリームか配列</td> <td>トリミング後寸法。CropBox値が規定値</td> </tr> <tr style=" background: #eeeeee;"> <td>/Rotate </td> <td>整数</td> <td>0, 90, 180, 270のいずれかを度数で表示。0 が規定値</td> </tr> <tr> <td>/Thumb</td> <td>ストリーム</td> <td>サムネールイメージを指定</td> </tr> <tr style=" background: #eeeeee;"> <td>/B </td> <td>配列</td> <td>(PDF1.1以上)アーティクルビーズへの参照配列を設定</td> </tr> <tr> <td>/Dur</td> <td>数値</td> <td>ページ表示時間を秒で指定。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Trans </td> <td>配列</td> <td>(PDF1.1以上)アーティクルビーズへの参照配列を設定</td> </tr> <tr> <td>/Dur</td> <td>数値</td> <td>(PDF1.1以上)ページ表示時間を秒で指定。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Trans </td> <td>辞書</td> <td>(PDF1.1以上)次ページへの移行効果への参照を設定</td> </tr> <tr> <td>/Annots</td> <td>配列</td> <td>注釈辞書配列</td> </tr> <tr style=" background: #eeeeee;"> <td>/AA </td> <td>辞書</td> <td>(PDF1.2以上)オープンクローズ時のアクションへの参照を設定</td> </tr> <tr> <td>/PieceInfo</td> <td>辞書</td> <td>(PDF1.3以上)ページピース辞書</td> </tr> <tr style=" background: #eeeeee;"> <td>/LastModified </td> <td>日付</td> <td>(PDF1.3以上)ページが最後に変更された日付と時間</td> </tr> <tr> <td>/StructParents</td> <td>整数</td> <td>(PDF1.3以上)構造ペアレントツリーにおけるページのエントリ整数キー</td> </tr> <tr style=" background: #eeeeee;"> <td>/ID </td> <td>文字列</td> <td>(PDF1.3以上)できれば間接参照で記述するページペアレントWebCaptureコンテンツセットのデジタル識別子</td> </tr> <tr> <td>/PZ</td> <td>数値</td> <td>(PDF1.3以上)構造ペアレントツリーにおけるページのエントリ整数キー</td> </tr> <tr style=" background: #eeeeee;"> <td>/SeparationInfo </td> <td>辞書</td> <td>(PDF1.3以上)色分解辞書</td> </tr> </table> === '''名前辞書''' === 名前辞書は /xxx という形式の名前に対応する値は何かというものを複数設定しているような << >> で囲われた辞書のことです。これを使って様々な名前が準備されるため、各オブジェクトでの値の指定が楽になります。以下のようなキーも設定できます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Dests</td> <td>名前</td> <td>名前辞書の割り当てをする先</td> </tr> <tr style=" background: #eeeeee;"> <td>/AP </td> <td>名前</td> <td>注釈外観ストリームに割り当てする名前</td> </tr> <tr> <td>/JavaScript</td> <td>名前</td> <td>JavaScriptの割り当てをする先</td> </tr> <tr style=" background: #eeeeee;"> <td>/Pages </td> <td>名前</td> <td>可視ページへの対話フォームの割り当てする名前</td> </tr> <tr> <td>/Templates</td> <td>名前</td> <td>不可視ページへの対話フォームの割り当てをする名前</td> </tr> <tr style=" background: #eeeeee;"> <td>/IDS </td> <td>名前</td> <td>コンテンツIDをWeb Captureコンテンツセットに割り当てする名前</td> </tr> <tr> <td>/URLS</td> <td>名前</td> <td>URLをWeb Captureコンテンツセットに割り当てする名前</td> </tr> </table> === '''コンテンツストリーム''' === コンテンツを記述する部分です。PDF1.0~1.7および2.0にわたって起こる互換性エラーを無視することを明示するオペレータがあります。 BX オペレータ。このオペレータが登場したところから EX オペレータが出るところまでが互換性エラーに対して柔軟に対応するべく、互換性エラーを無視してくれます。 === '''リソース辞書''' === フォントやグラフィックス設定なんかを指定する役割の辞書です。以下のようなキーでそれぞれのリソースを設定できます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/ExtGState</td> <td>辞書</td> <td>グラフィック状態を指定する辞書</td> </tr> <tr style=" background: #eeeeee;"> <td>/ColorSpace </td> <td>辞書</td> <td>カラースペース。カラー指定に関する設定を指定する辞書</td> </tr> <tr> <td>/Pattern</td> <td>辞書</td> <td>パターン状態を指定する辞書</td> </tr> <tr style=" background: #eeeeee;"> <td>/Shading </td> <td>辞書</td> <td>面の表面状態であるシェーディング指定に関する設定を指定する辞書</td> </tr> <tr> <td>/XObject</td> <td>ストリーム</td> <td>外部オブジェクトを割り当てする辞書。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Font </td> <td>辞書</td> <td>フォント指定に関する設定を指定する辞書</td> </tr> <tr> <td>/ProcSet</td> <td>配列</td> <td>定義済み手続きセットの名前を割り当てする配列。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Properties </td> <td>辞書</td> <td>マーク付きコンテンツ用の特性リスト辞書の指定に関する設定を指定する辞書</td> </tr> </table> === '''矩形''' === 矩形データは4つのデータを持つ配列として [左下x 左下y 右上x 右上y] の形式で表現します。 === '''名前ツリー''' === 名前ツリーは以下のようなキーを用いて構成します。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Kids</td> <td>配列</td> <td>子への参照を配列で指定。。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Names </td> <td>配列</td> <td>名前と参照の対を配列で指定</td> </tr> <tr> <td>/Limits</td> <td>配列</td> <td>Namesの名前から名前までの値を使うことを明示する。</td> </tr> </table> <Syntaxhighlight2 lang="text"> 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 </Syntaxhighlight2> === '''数値ツリー''' === 名前ツリーでは /Names 文字列 だったものが /Nums 数値にかわったものを数値ツリーと呼んでいます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Kids</td> <td>配列</td> <td>子への参照を配列で指定。。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Nums </td> <td>配列</td> <td>名前と参照の対を配列で指定</td> </tr> <tr> <td>/Limits</td> <td>配列</td> <td>配列に対象とする最小値と最大値を指定する</td> </tr> </table> === '''関数''' === PDFは文書であり、プログラムではありませんが、簡単な計算機能と関数としての機能づくりをする工夫が準備されています。文書の情報から計算して準備しなければならない情報を作るときに使います。以下のようなキーを使って、関数を使います。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/FunctionType ★</td> <td>整数</td> <td>関数のタイプを数値で以下より指定します。</td> </tr> <tr> <td></td> <td></td> <td>0 : サンプリング関数</td> </tr> <tr> <td></td> <td></td> <td>2 : 指数補完関数</td> </tr> <tr> <td></td> <td></td> <td>3 : 縫合関数</td> </tr> <tr> <td></td> <td></td> <td>4 : PostScript計算関数</td> </tr> <tr style=" background: #eeeeee;"> <td>/Domain ★</td> <td>配列</td> <td>2 × m[個] の配列。m個の最小値と最大値の組み合わせを指定。関数の変域の確認に使います。 </td> </tr> <tr> <td>/Range</td> <td>配列</td> <td>/FunctionType 0 と 4で必須のキー。2 × m[個]の配列。m個の値域の最小値と最大値を指定します。</td> </tr> </table> 上記のキーでは、関数のタイプを選択して、関数の変域(数学ではよくxになる値)と値域(数学ではよくyになる値)の最小値と最大値を設定する感じです。値が最小値より下回ったら、最小値に置換し、最大値を上回ったら最大値に置換します。関数のタイプによって、続けて指定できるキーが変わります。以下に /FunctionType の値ごとのキー値について記述します。 ==== '''/FunctionType 0 : サンプリング関数''' ==== <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Size ★</td> <td>配列</td> <td>次元ごとのサンプル数を指定した整数値の配列</td> </tr> <tr style=" background: #eeeeee;"> <td>/BitsPerSample ★</td> <td>整数</td> <td>サンプリングビット数</td> </tr> <tr> <td>/Order</td> <td>整数</td> <td>サンプル間の補完の次数。1次, 2次, 3次近似とかの奴だわな。</td> </tr> <tr style=" background: #eeeeee;"> <td>/Encode </td> <td>配列</td> <td>変域のマッピング値 2 × m[個]の配列で指定します。始値と終値の対の個数分だけ指定します。</td> </tr> <tr> <td>/Decode</td> <td>配列</td> <td>値域のマッピング値 2 × m[個]の配列で指定します。始値と終値の対の個数分だけ指定します。</td> </tr> </table> 上記と必要なストリームのキーも使います。 ==== '''/FunctionType 2 : 指数補完関数''' ==== <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/C0</td> <td>配列</td> <td>値域 0 に対する値を定義する。</td> </tr> <tr style=" background: #eeeeee;"> <td>/C1</td> <td>配列</td> <td>値域 1 に対する値を定義する。</td> </tr> <tr> <td>/N ★</td> <td>整数</td> <td>補完指数</td> </tr> </table> ==== '''/FunctionType 3 : 縫合関数''' ==== 複数の1入力関数を結合して利用するための関数 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Functions ★</td> <td>配列</td> <td>1入力のm[個]の関数</td> </tr> <tr style=" background: #eeeeee;"> <td>/Bounds ★</td> <td>配列</td> <td>関数が適用される区間を定義する。</td> </tr> <tr> <td>/Encode ★</td> <td>配列</td> <td>2 × m[個]の関数のDomainとBoundsで定義される変数名の配列</td> </tr> </table> ==== '''/FunctionType 4 : PostScript関数''' ==== ストリームを使って記述する関数で、追加のキーはありませんが、オペランドとオペレータを使って表現します。PostScriptという名前がついていますが、このストリームにPostScriptを記述できるわけではないです。PostScriptにもあるような計算ができる関数機能だと思えばよいと思います。その関数もPostScriptの仕様に従うのではなくPDFの仕様に従うことになっています。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">オペレータの種類</th> <th colspan="5">オペレータ</th> </tr> <tr> <td>算術オペレータ</td> <td style="width: 50px;">abs</td> <td style="width: 50px;">cvi</td> <td style="width: 50px;">floor</td> <td style="width: 50px;">mod</td> <td style="width: 50px;">sin</td> </tr> <tr> <td></td> <td>add</td> <td>cvr</td> <td>idiv</td> <td>mul</td> <td>sqrt</td> </tr> <tr> <td></td> <td>atan</td> <td>div</td> <td>ln</td> <td>neg</td> <td>sub</td> </tr> <tr> <td></td> <td>ceiling</td> <td>exp</td> <td>log</td> <td>round</td> <td>truncate</td> </tr> <tr> <td></td> <td>cos</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr style=" background: #eeeeee;"> <td>比較 論理 ビット</td> <td>and</td> <td>false</td> <td>le</td> <td>not</td> <td>true</td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td>bitshift</td> <td>ge</td> <td>lt</td> <td>or</td> <td>xor</td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td>eq</td> <td>gt</td> <td>ne</td> <td></td> <td></td> </tr> <tr> <td>条件オペレータ</td> <td>if</td> <td>iflese</td> <td></td> <td></td> <td></td> </tr> <tr style=" background: #eeeeee;"> <td>スタックオペレータ</td> <td>copy</td> <td>exch</td> <td>pop</td> <td></td> <td></td> </tr> <tr style=" background: #eeeeee;"> <td></td> <td>dup</td> <td>index</td> <td>roll</td> <td></td> <td></td> </tr> </table> 例 <Syntaxhighlight2 lang="text"> steam { 2 mul 2 div } endstream </Syntaxhighlight2> 上記のように逆ポーランド記法のように書かれていくところが特徴です。関数の変域へ与えられた値をスタックに入れ、スタックに対して、2を掛けて、その結果として入ったスタック値へ、2で割っているという例です。 === '''ファイル指定''' === 絶対パスや相対パスのような仕組みを使って外部ファイルを参照することがあります。ファイルの指定は以下のように / によって区切られた表現を使うことになります。以下に代表的なOSにおける表記と、PDFで使われる表記を示しました。 <b>■Windows</b><br /> OS C:\User\xxx\Documents\Creative\PDF_Principle\workspace\Work.pdf<br /> PDF /c/User/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf<br /> <b>■Unix</b><br /> OS /usr/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf<br /> PDF /usr/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf<br /> <b>■MacOS</b><br /> OS MacHD:xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf<br /> PDF /MacHD/xxx/Documents/Creative/PDF_Principle/workspace/Work.pdf<br /> / は、\/ で表現しますが、このときの\もエスケープする必要があり \\/ としなければならないと記載があります。具体的には実験してから記事を追記したいです。日本語は < > で囲ったバイトコードで表記する必要があります。また末尾が 5C(ASCIIコードの \に対応 )になる場合は、次の1バイトコードがエスケープシーケンス文字であると認識してしまうため、末尾コードに 5C がある場合は、もう一つ 5C を挿入して 5C そのもののコードであることを明示しなければなりません。いわゆる 5C 問題です。基本的には 5C ではじまる文字コードはないので、文字コードに 5C がある場合に注意しなければならないと言えるでしょう。上の階層に移動するときは、コマンドラインでもよく使われる .. 2連続ピリオドを指定します。 === '''ファイル指定辞書''' === 前項のようなファイル指定を具体的に実施すする辞書です。用意されたキーでより詳細に外部ファイル参照を行います。以下のようなキーを使います。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Type </td> <td>名前</td> <td>定義する必要がある場合 /Filespec である必要があります。</td> </tr> <tr style=" background: #eeeeee;"> <td>/FS</td> <td>名前</td> <td>ファイルシステムの名前を定義します。/DOSや/Macや/Unixと関連がありません。</td> </tr> <tr> <td>/F</td> <td>文字列</td> <td>前の項目で説明したファイル指定の文字列</td> </tr> <tr style=" background: #eeeeee;"> <td>/Mac</td> <td>文字列</td> <td>MacでPDFが動作している場合における外部ファイル指定の文字列</td> </tr> <tr> <td>/DOS</td> <td>文字列</td> <td>DOS(Windows)でPDFが動作している場合における外部ファイル指定の文字列</td> </tr> <tr style=" background: #eeeeee;"> <td>/Unix</td> <td>文字列</td> <td>UNIXでPDFが動作している場合における外部ファイル指定の文字列</td> </tr> <tr> <td>/ID</td> <td>配列</td> <td>2つのファイル識別子</td> </tr> <tr style=" background: #eeeeee;"> <td>/V</td> <td>文字列</td> <td>UNIXでPDFが動作している場合における外部ファイル指定の文字列</td> </tr> <tr> <td>/EF</td> <td>辞書</td> <td>/F, /Mac, /DOS, /Unixのサブセットを含む辞書</td> </tr> <tr style=" background: #eeeeee;"> <td>/RF</td> <td>辞書</td> <td>/F, /Mac, /DOS, /Unixのサブセットを含む辞書と同様の辞書</td> </tr> </table> === '''埋め込みファイルストリーム''' === 前の項目までに紹介した外部ファイルのようなものをPDF自体に埋め込むための仕組みです。ファイルの依存関係が解消されるので、PDFファイルの中身が正しく表示されることを高めるものです。ただし、PDFファイル自体の容量が大きくなるデメリットはあります。繰り返し参照されないファイルであれば、埋め込んだ方が良いかもしない。埋め込みファイルストリームには以下のようなキーを使います。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Type </td> <td>名前</td> <td>定義する場合 /EmbeddedFile である必要があります。</td> </tr> <tr style=" background: #eeeeee;"> <td>/SubType</td> <td>名前</td> <td>MIMEメディアタイプの名前を定義します。</td> </tr> <tr> <td>/Params</td> <td>文字列</td> <td>埋め込みファイルパラメータ辞書を指定します。</td> </tr> </table> ==== '''埋め込みパラメータ辞書''' ==== 埋め込みファイルストリームの /Params キーに指定する辞書には以下のようなキーを指定します。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #99aec5; border-right: solid 1px #99aec5; color: #ffffff;"> <th style="width: 175px;">キー</th> <th style="width: 175px;">型</th> <th>指定する値の内容</th> </tr> <tr> <td>/Size </td> <td>整数</td> <td>埋め込みファイルのバイト長</td> </tr> <tr style=" background: #eeeeee;"> <td>/CreationDate</td> <td>日付</td> <td>埋め込みファイルの作成日時</td> </tr> <tr> <td>/ModDate</td> <td>日付</td> <td>埋め込みファイルの更新日時</td> </tr> <tr style=" background: #eeeeee;"> <td>/Mac</td> <td>辞書</td> <td>埋め込みファイルに関するMacOS固有向けの情報</td> </tr> <tr style=" background: #eeeeee;"> <td>/CheckSum</td> <td>文字列</td> <td>ファイルを構成する全情報をMD5によって算出して生成される16バイトの文字列。</td> </tr> </table> === '''目的別文字列''' === [[PDF 内部構造]]に戻る。
PDF 内部構造 基本とファイル構造キー
に戻る。
個人用ツール
18.222.109.133
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ