PDF 内部構造 構造の概念 簡単な説明 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(概要)
(関連記事)
 
1行: 1行:
[[PDF 内部構造]]に戻る。
+
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。
 
== '''概要''' ==
 
== '''概要''' ==
 
 ファイルの構造の大まかな分類があるので、その分類をここで説明します。PDF内部構造の用語にもなれていかないといけません。この記事では最初の一歩に必要な内容を記述したいと思います。
 
 ファイルの構造の大まかな分類があるので、その分類をここで説明します。PDF内部構造の用語にもなれていかないといけません。この記事では最初の一歩に必要な内容を記述したいと思います。
77行: 77行:
  
  
 ファイルの中身について、はじめて見たときは、なんじゃコレ。って感じでした。皆さんの中にも初めての人がいたら同じような気持ちだったはずです。冷静にみてみると見えてくるものがあります。最初の2行あたりは、すべての拡張子のファイルにもあるファイルヘッダ部です。なんらかのファイル操作をしたことがある人なら知っているかもしれません。★マークがあるところは、任意の数値を指定したり、PDFtkに自動で算出してもらう数値だったりが入る箇所です。このファイルは実際はバイナリファイルですが、テキストで閲覧しても上記のように表示されるくらいテキストに近いものです。そして出回っているPDF生成ツールを使うとたいていは圧縮されて、なにがなんだかわからないファイルになっているのですが、上記のようにテキストでも理解できる非圧縮の見通しのいいPDFファイルも存在しています。ファイルを理解したい人にとってはこれでいいのですが、世の中そうもいかないらしい。いまファイルを理解しようとしている我々も含めて、単純に便利に使いたい人の方が多い。では上から見てます。
+
 ファイルの中身について、はじめて見たときは、なんじゃコレ。って感じでした。皆さんの中にも初めての人がいたら同じような気持ちだったはずです。冷静にみてみると見えてくるものがあります。最初の2行あたりは、すべての拡張子のファイルにもあるファイルヘッダ部です。なんらかのファイル操作をしたことがある人なら知っているかもしれません。★マークがあるところは、任意の数値を指定したり、PDFtkに自動で算出してもらう数値だったりが入る箇所です。このファイルは実際はバイナリファイルですが、テキストで閲覧しても上記のように表示されるくらいテキストに近いものです。そして出回っているPDF生成ツールを使うとたいていは圧縮されて、なにがなんだかわからないファイルになっているのですが、上記のようにテキストでも理解できる非圧縮の見通しのいいPDFファイルも存在しています。ファイルを理解したい人にとってはこれでいいのですが、世の中そうもいかないらしい。いまファイルを理解しようとしている我々も含めて、単純に便利に使いたい人の方が多い。では上から見てみます。
  
  
112行: 112行:
  
  
 そして、最後に55行目で相互参照テーブルの開始位置をバイト単位で指定した数値部分があって、%%EOFというファイル終端記号で終わっています。
+
 そして、最後に55行目で相互参照テーブルの開始位置をバイト単位で指定した数値部分があって、ここでは、0 を指定しています。0と記述しておけば、PDFtkが相互参照テーブルの開始位置のバイト値を補完してくれます。最終行は%%EOFというファイル終端記号で終わっています。
  
  
118行: 118行:
  
  
 5つの obj がどのような役割なのかを確認します。ちなみに<< … >>のような二重の小なり、大なり記号は、辞書という意味があり、いくつかの情報をまとめて、無意味順序として記述するという意味があります。単なる塊とも取れます。でも塊の中に指定されているものを、そのオブジェクトや名前が差している内容とみなすので、辞書の指定はよく使います。
+
 5つの obj がどのような役割なのかを確認します。ちなみに<< … >>のような二重の小なり、大なり記号は、<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">辞書</span>という意味があり、いくつかの情報をまとめて、無意味順序として記述するという意味があります。単なる塊とも取れます。でも塊の中に指定されているものを、そのオブジェクトや名前が差している内容とみなすので、辞書の指定はよく使います。
  
  
 
 ■5 0 obj  
 
 ■5 0 obj  
:: ルートオブジェクト(カタログ:目録 全体の目次といってもよいかも)です。相互参照テーブルのトレーラ部で/Root 5 0 R のように指定されています。5 0 R は/Rootという名前のモノは5 0 objを参照(Referrence)しますという意味の 5 0 Rです。x x R という形式はよく登場します。/Root という表記もよく登場します。 / のあとに文字列が記述されたようなパターンを名前といい。名前には固有の役割があるものは<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">キー</span>と呼んでいて、ユーザが自由につけるものは名前と呼んでいます。プログラムで言うところの変数みたいなものです。
+
:: ルートオブジェクト(<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">カタログ</span>:目録 全体の目次といってもよいかも)です。相互参照テーブルのトレーラ部で/Root 5 0 R のように指定されています。5 0 R は/Rootという名前のモノは5 0 objを参照(Referrence)しますという意味の 5 0 Rです。x x R という形式はよく登場します。/Root という表記もよく登場します。 / のあとに文字列が記述されたようなパターンを<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">名前</span>といい。名前には固有の役割があるものは<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">キー</span>と呼んでいて、ユーザが自由につけるものは名前と呼んでいます。プログラムで言うところの変数みたいなものです。
  
  
129行: 129行:
  
 
 ■1 0 obj
 
 ■1 0 obj
:: ページです。5 0 obj のカタログにぶら下がっているページ要素という意味です。  
+
:: <span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">ページ</span>です。5 0 obj のカタログにぶら下がっているページ要素という意味です。  
  
  
140行: 140行:
 
:: 5 0 obj にも/Type は /Pageだと指定しています。但し、要素には1 0 obj には記述しなかったような名前について定義されています。/MediaBox は 用紙サイズをピクセル単位で指定します。A4用紙サイズの縦なら[0 0 1033 1462]というように指定します。[ ] 角カッコ(ブラケット)は配列の中身を空白区切りで記述するような仕組みになっています。このような記述方法を配列と呼んでいます。プログラムの配列は角カッコを使って要素数を指定しますが、そのような要素数の指定をするといったことの意味はありません。プログラムでいうと { } 波カッコ(ブレース)のような配列初期化指定に似ているかもしれません。
 
:: 5 0 obj にも/Type は /Pageだと指定しています。但し、要素には1 0 obj には記述しなかったような名前について定義されています。/MediaBox は 用紙サイズをピクセル単位で指定します。A4用紙サイズの縦なら[0 0 1033 1462]というように指定します。[ ] 角カッコ(ブラケット)は配列の中身を空白区切りで記述するような仕組みになっています。このような記述方法を配列と呼んでいます。プログラムの配列は角カッコを使って要素数を指定しますが、そのような要素数の指定をするといったことの意味はありません。プログラムでいうと { } 波カッコ(ブレース)のような配列初期化指定に似ているかもしれません。
  
:: ページ要素の親は 1 0 obj という意味で/Parent 1 0 R が指定さています。
+
:: ページ要素の親は 1 0 obj という意味で/Parent 1 0 R が指定されています。
  
  
153行: 153行:
  
  
:: ややこしい感じで設定されていますが、/FBaseというユーザ定義のフォント書式が定義されている上でフォントの設定を実際に3つ指定しているという形式です。/BaseFontで実際にフォント名をしていして、使うフォントを定義しています。英字フォントはフォント名にハイフン「-」で連結させるようにしてBold(太字)やItalic(斜体)を使うという指定ができるものが多いです。フォント名には英字フォント名というのがあるので、その値を設定します。/Subtypeもややこしいですが、フォントにはいくつかの形式があります。標準Type1(ASN Developer ProgramサイトからもダウンロードできるAdobeFontMetricsFileFormatファイル)は以下の通りらしいです。
+
:: ややこしい感じで設定されていますが、/FBaseというユーザ定義のフォント書式が定義されている上でフォントの設定を実際に3つ指定しているという形式です。/BaseFontで実際にフォント名をしていして、使うフォントを定義しています。英字フォントはフォント名にハイフン「-」で連結させるようにしてBold(太字)やItalic(斜体)を使うという指定ができるものが多いです。フォント名には英字フォント名というのがあるので、その値を設定します。/Subtypeもややこしいですが、フォントにはいくつかの形式があります。標準Type1(ASN Developer ProgramサイトからもダウンロードできるAdobeFontMetricsFileFormatファイル)は以下のとおりらしいです。Obliqueは斜体です。Italicと同様の意味です。
  
 
   Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique<br />
 
   Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique<br />
161行: 161行:
  
  
:: 他にも/SubTypeには、Type0, MMType1, Type3, TrueType, CIDFontType0, CIDFontType2というのがあります。そのあたりはまた別途です。日本語フォントなんかを使う我々はもう少し、深く勉強しないと、PDF文書を扱えるレベルは到達できないようになっています。
+
:: 他にも/SubTypeには、Type0, MMType1, Type3, TrueType, CIDFontType0, CIDFontType2というのがあります。そのあたりはまた別途です。日本語フォントなんかを使う我々はもう少し、深く勉強しないと、PDF文書を扱えるレベルには到達できないようになっています。
  
  
 
  ■4 0 obj
 
  ■4 0 obj
:: ここにコンテンツを置きます。stream部をもうけるので、名前/Lengthの値にstreamのバイト長をちゃんと数えて埋める必要がありますが、PDFtkによって自動で算出するので、変換前のテキストPDFには << >> のように記述して、辞書がここにはいるよ。よろしく。という感じだけ書いておけば良いです。
+
:: ここに<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">コンテンツ</span>を置きます。stream部をもうけるので、名前/Lengthの値にstreamのバイト長をちゃんと数えて埋める必要がありますが、PDFtkによって自動で算出するので、変換前のテキストPDFには << >> のように記述して、辞書がここにはいるよ。よろしく。という感じだけ書いておけば良いです。
  
  
:: streamからendstreamの間でテキストを描くペンを移動させるため 1. 0. 0. 1. 50. 50. cm のようにします。この表記は意味深いのですが、1(X方向の倍率), 0, 0, 1(Y方向の倍率), 50(X方向移動), 50(Y方向の移動)を意味しています。このときの cm を<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">オペレータ</span>、1, 0, 0, 1 は<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">オペランド</span>といいます。
+
:: streamからendstreamの間でテキストを描くペンを移動させるため 1. 0. 0. 1. 50. 50. cm のようにします。この表記はもっと意味深いのですが、1(X方向の倍率), 0, 0, 1(Y方向の倍率), 50(X方向移動), 50(Y方向の移動)を意味しています。このときの cm を<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">オペレータ</span>、1, 0, 0, 1, 50 , 50 は<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">オペランド</span>といいます。これについても、のちほど触れたいと思いますが、cm オペレーターは単純に移動をするためのものではなく、空間座標変換というような簡単にはわかりにくい機能をもっています。ここでは、cm オペレータはそういう機能があるんだなっていうことを把握しておいてもらえればいいと思います。
  
  
 
:: BT~ETがテキストの始まりと終わりを示すオペレータです。Tf はテキストサイズを設定するオペレータです。第二オペランドにポイント(72分の1インチが1ポイント)という単位のテキストサイズの大きさ値を設定します。第一オペランドにはテキストフォント書式を設定したテキスト名前(こういうのをフォントリソースの名前と呼びます)を設定します。ユーザが好きな名前を付けていいものに、ある一定の役割があるものを関連付けてある必要があるというパターンはよくあります。Tj は第一オペランドで設定した文字列を出力するということです。
 
:: BT~ETがテキストの始まりと終わりを示すオペレータです。Tf はテキストサイズを設定するオペレータです。第二オペランドにポイント(72分の1インチが1ポイント)という単位のテキストサイズの大きさ値を設定します。第一オペランドにはテキストフォント書式を設定したテキスト名前(こういうのをフォントリソースの名前と呼びます)を設定します。ユーザが好きな名前を付けていいものに、ある一定の役割があるものを関連付けてある必要があるというパターンはよくあります。Tj は第一オペランドで設定した文字列を出力するということです。
  
 +
 
 +
 +
== '''関連記事''' ==
 +
[[フォント TrueType 構造解析]]
  
:
 
 
 
 
 
  
[[PDF 内部構造]]に戻る。
+
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。

2022年9月13日 (火) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス