PDF 内部構造 テキスト 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(/Encoding)
(  /DescendantFonts :/FontDescriptor : /CharSet)
 
158行: 158行:
 
</table>
 
</table>
  
 +
 +
 <span style = "background:linear-gradient(transparent 75%, #ff9393 75%); font-weight:bold; ">注意したいのはTJとTjの違いです。Tj は 文字列を指定しているので、PDFtkを動かす環境の文字コードSJISやテキストの文字コードを利用して、そのまま出力する。TJは文字コード番号を指定している。間違うと、文字コード番号が見つからないというような意味のエラーがでる可能性が高い。</span>
 +
 +
 
  
 
=== '''日本語を扱う''' ===
 
=== '''日本語を扱う''' ===
177行: 181行:
  
 
 少し長いサンプルソースなので、全部載せて、説明はしません。日本語を表示するために、使われているフォントやコード関連のオペレータの意味については解読して、日本語文書ファイルを作れるようにしていきます。
 
 少し長いサンプルソースなので、全部載せて、説明はしません。日本語を表示するために、使われているフォントやコード関連のオペレータの意味については解読して、日本語文書ファイルを作れるようにしていきます。
 +
 +
 +
 <span style = "background:linear-gradient(transparent 75%, #ff9393 75%); font-weight:bold; ">文字出力のオペレータは両方大文字のTJになっています。そのまま英文を出力するときはTjでした。間違えないでください。</span>
  
 
==== '''日本語PDF仕組み''' ====
 
==== '''日本語PDF仕組み''' ====
236行: 243行:
 
</syntaxhighlight2>
 
</syntaxhighlight2>
  
 という具合にリソースの定義部で、/Fontフォントが定義され、その中で/DescendantFonts。そしてさらにその中で/FontDescriptorについての定義がされる。コメントの%KozMinは、Macのフォントの小塚明朝の場合はこんな感じの記述という例で、完全に動作するとは保証できないのであしからず。この3段論法みたいなフォント情報はひとつにまとめて書くことが出来る。まとめて記述するには、以下のような感じ。
+
 という具合にリソースの定義部で、/Fontフォントが定義され、その中で/DescendantFonts。そしてさらにその中で/FontDescriptorについての定義がされる。コメントの%KozMinは、Macのフォントの小塚明朝の場合はこんな感じの記述という例で、完全に動作するとは保証できないのであしからず。この3段論法みたいなフォント情報はひとつにまとめて書くことが出来る。まとめて記述するには、以下のような感じ。Adobe Acrobat Readerには小塚明朝が表示できる様に組み込まれていてWindowsでも使えるはずですが、自分は上手くやれませんでした。なんかもうちょっとコツがあるのかも知れない。ちな、この小塚フォントをWindowsの汎用フォントフォルダに移動して普通に使って文書に埋め込んだりして配布して使うのは規約違反らしいです。Acrobatで見るためだけに使いなさいと言う事らしい。
  
 
<syntaxhighlight2 lang="text">
 
<syntaxhighlight2 lang="text">
292行: 299行:
 
</syntaxhighlight2>
 
</syntaxhighlight2>
  
 三つを一つに纏めれましたが、この三つは意味が違うので注意が必要です。/F1という名前のフォントはType0という扱いをします。という意味合いで、このファイルでの扱いを、決めるための定義なのでこのPDFファイルのための独自情報です。ここでType0になっているのは、複数のフォントを、まとめれるという特徴があるのでよく使われるフォントタイプです。その中にある/DescendantFontsにはこういうフォントを組み合わせて使いますという具合です。Descendantは日本語で子孫という意味です。実際に利用するフォントの構造を指定しています。MSゴシックがTrueTypeのCIDフォントだということを意味しています。
+
 三つを一つに纏めれましたが、この三つは意味が違うので注意が必要です。/F1という名前のフォントはType0という扱いをします。という意味合いで、このファイルでの扱いを、決めるための定義なのでこのPDFファイルのための独自情報です。ここでType0になっているのは、複数のフォントを、まとめれるという特徴があるのでよく使われるフォントタイプです。その中にある/DescendantFontsにはこういうフォントを組み合わせて使いますという具合です。Descendantは日本語で子孫という意味です。実際に利用するフォントの構造を指定しています。MSゴシックがTrueTypeのCIDキー付きフォントだということを意味しています。実際はOpen Typeの構造に準拠していますが、TrueTypeとしても動作する様になっている形式です。OpenTypeは使えないと言うアプリケーションは多いWindowsの世界では良く取られる対処法です。
  
  
 そして、/FontDescriptorはストリームで対応する文字コードについてのフォント情報が無かったときはどのフォントは情報に従うのかという意味を持っています。Descriptorとは説明する者という意味です。
+
 そして、/FontDescriptorはストリームで対応する文字コードについてのフォント情報が無かったとき、この例ではType0フォントのMSゴシックが無い場合、どのフォントの情報に従うのかという意味を持っています。そしてどの様なフォントなのかを説明しなければなりません。Descriptorとは説明する者という意味です。
  
 
==== '''日本語PDFフォント情報のオペレータ個別の意味''' ====
 
==== '''日本語PDFフォント情報のオペレータ個別の意味''' ====
842行: 849行:
  
 
 CMapのストリームに関しては[[PDF 内部構造 CMap|コチラ]]の記事で記述します。
 
 CMapのストリームに関しては[[PDF 内部構造 CMap|コチラ]]の記事で記述します。
 +
 +
 
  
 
===== '''/DescendantFonts''' =====
 
===== '''/DescendantFonts''' =====
 Descendantは子孫とかって意味の英語。PDF内で扱うFontオブジェクトにぶら下がる実際のフォントを1つだけ明記する配列を指定することになっています。FontオブジェクトがこのPDFでのフォントの扱い方に関する情報であるのに対して、実際のフォント情報の内容を指定します。
+
 Descendantは子孫とかって意味の英語。PDF内で扱うFontオブジェクトにぶら下がる実際のフォントを1つだけ明記する配列を指定することになっています。FontオブジェクトがこのPDFでのフォントの扱い方に関する情報であるのに対して、実際のフォント情報の内容を指定します。DecendantsFontの対応する配列内の /Type には必ず /Font という辞書名文字列を指定します。
 +
 
 +
 
 +
====== ''' /DescendantFonts :/BaseFont''' ======
 +
 必須。通常は親ノードの/BaseFont と同じフォント名 辞書名文字列になります。フォント名に半角スペースが含まれる場合は、対応する文字コード番号#20に置き換えます。コンソールの取り扱い文字コード、テキストの文字コードがSJISでもUTF-8でも同じ値です。
 +
 
 +
 
 +
 
 +
====== ''' /DescendantFonts :/CIDToGIDMap''' ======
 +
 CID<span>(</span>文字コード<span>)</span>からGID(グリフ番号)への対応を指定。辞書名文字列を設定する場合、指定できるのは /Identity のみです。省略した場合も/Identityが指定されたものとして扱われます。この辞書はストリームを指定するオプションで Type 2 の CIDFont を使う場合のみ有効となるものです。使っている実例をみたことがないので、Glyph値cが1 なら1=<02><03>がインデックスのバイト番号です。0=<00><01> 1=<02><03>で、CIDはグリフ値3がMSゴシックフォントのように half space " "を表すCID 0x20=GID<span>(</span>グリフ値<span>)</span>=3なら
 +
 
 +
xx_cid1_Hi1 xx_cid1_Hi2  xx_cid1_Lo1 xx_cid1_Lo2
 +
xx_cid2_Hi1 xx_cid2_Hi2  xx_cid2_Lo1 xx_cid2_Lo2
 +
<00> <00> <00> <20>
 +
 
 +
のような、グリフ番号0から順にCID値が8バイトで連続するストリームになるということでしょう。みたことないけど。知らんけど。使うことないだろうけど、認証をとるようなPDFエディタを作ったらここもきっちり網羅しておかないと駄目なんだろう。わからないことの方が莫大にあるので、認証なんて一生取れないだろうけど。
 +
obj x 0
 +
<<
 +
 +
>>
 +
stream
 +
<00> <00> <00> <00> %グリフ値 0 0は未定義文字のデフォルト表示文字だったような。CMapならば1から始まる。
 +
<00> <00> <00> <00> %グリフ値 1
 +
<00> <00> <00> <00> %グリフ値 2
 +
<00> <00> <00> <20> %グリフ値 3
 +
 +
 +
endstram
 +
 
 +
 
 +
====== ''' /DescendantFonts :/DW''' ======
 +
 1グリフ毎の横幅のデフォルト値。全グリフに適用される整数値。規定値は0
 +
 font内部の指定値に左右されますが、等幅半角文字なら1024emあるいは、1000、等幅全角文字なら2048emあるいは2000emとなっているものが多いでしょう。なので最大の2048を適用しておいて、それでは、他の文字が具合が悪いので、半角文字の一文字毎に次の/Wを使って指定することになります。範囲指定できるので、それほど大変ではありません。
 +
 
 +
/DW 2048
 +
 
 +
====== ''' /DescendantFonts :/W''' ======
 +
 指定グリフ毎の横幅の値。全グリフに適用される配列整数値。規定値はなし。但しDW値は適用される。以下のような形式をとる。単位はem
 +
 
 +
<Syntaxhighlight2 lang="text" line=1>
 +
/W
 +
[
 +
  100 [ 1024 1000 1024]
 +
  103 128 1024
 +
  160 223 1024
 +
  33088 40956 2048
 +
  57408 64508 2048
 +
]
 +
</syntaxhighlight2>
 +
 
 +
3行目は100 が そのあとの配列の1番目、配列が残り二つあるので、101から連番で101=1000、102=1024のように割り当てられる。個別指定が楽。
 +
 
 +
4行目は数字が3つ続く形式で1番目の数字から2番目の数値が文字番号の範囲で、3つめがグリフ幅の値を指定している。したがって103~128番の文字番号がグリフ横幅1024となる。範囲指定が楽。他の行も同じく。
 +
 
 +
 
 +
====== ''' /DescendantFonts :/DW''' ======
 +
 1グリフ毎の縦幅に関するデフォルト値。全グリフに適用される2つの整数値を持つ配列。規定値は[880 -1000]。横書きの設定も生かしつつ、縦書きをするための仕組みとして、v というベクトルを考える。vは横書き原点<span>(</span>ベースラインの右端<span>)</span>を縦書き原点<span>(</span>文字の水平の真ん中の上の頂点<span>)</span>に移すベクトルとして、そのベクトルのx成分は文字幅の半分。つまり、/W あるいは /DWで設定した値の半分。例えば文字幅が2024なら半分の1024。y成分を指定する値の一つとして表現する。そして、vによって移った原点を真下に送る値をもう一つの指定値で表現する。以下のように座標値を数式で表現できる。ベクトルのyは上方向がプラス、xは右方向がプラスとすると
 +
 
 +
 
 +
 v= <span>(</span>x座標量 = 文字幅/2, y座標量 = vのyの大きさ<span>)
 +
 
 +
 
 +
 縦書きのy方向への移動量をベクトルw1で表現するとx座標量は常に0で
 +
 
 +
 w1 = (x座標量 = 0, y座標量 = w1のyの大きさ)
 +
 
 +
 と書ける。このときのvのyの大きさとw1のyの大きさを指定すると縦書きに必要な移動量が決まるため、/DW2では、この2つの値の整数値を設定した配列をオペランドで指定する。規定値の
 +
 
 +
 
 +
 /DW2 [880 -1000]
 +
 
 +
 は、上方向に880em移動したところを原点に下方向に1000em移動することを意味する。あたらしく決まった原点にたいして、次の文字を縦書きになるように新しい文字の幅の真ん中を中心にして、文字の縦幅の上の頂点が重なるように配置していく。ということを意味している。
 +
 
 +
 
 +
 配列の最初の値が大きいほど上の文字との近づく。その次の値が大きいと文字幅が小さくなり次の文字が詰まってくる。そういうイメージだ。
 +
 
 +
 
 +
 /W2では、ベクトルvのxの大きさも指定するので、/Wと/DWのように同じ意味の引数になっていない関係に注意したいところ。
 +
 
 +
 
 +
 
 +
====== ''' /DescendantFonts :/W2''' ======
 +
 指定グリフ毎の縦幅の値。全グリフに適用される配列整数値。規定値はなし。但しDW2の値は適用される。以下のような形式をとる。単位はem
 +
 
 +
<Syntaxhighlight2 lang="text" line=1>
 +
/W2
 +
[
 +
  100 [ -1000 500 880 -1024 512 884 -1000 500 880]
 +
  103 128 -1024 512 884
 +
  160 223 -1024 512 884
 +
  33088 40956 -2048 1028 2048
 +
  57408 64508 -2048 1028 2048
 +
]
 +
</syntaxhighlight2>
 +
 
 +
 
 +
 3行目は100 が そのあとの配列の1・2・3番目で縦文字幅を調整、配列が残り二つあるので、101から連番で101が4・5・6番目で、102が7・8・9番目のように割り当てられる。個別指定が楽。DW2とW2とで引数の数が異なりW2の方が3つで一つ多い、DW2の2番目の値がW2の例の一番最初の値と同じ。DW2の最初の値がW2の例の3番目と同じ。2番目は v ベクトルのxの座標量も指定している。文字の中心をこの辞書で個別に設定していけることを意味している。
 +
 
 +
 
 +
 4行目は数字が5つ続く形式で1番目の数字から2番目の数値が文字番号の範囲で、のこりの3つがグリフ幅の値を指定している。したがって103~128番の文字番号がグリフ縦幅上に884em移動して中心は512emとなり、文字幅として-1024を移動するような動作をするグリフ群となる。この方法は範囲指定が楽。他の行も同じ動きで記述されていく。
 +
 
 +
 
 +
 
 +
====== ''' /DescendantFonts :/Subtype''' ======
 +
 ここでは実際に使うフォントファイルの形式を指定します。このCIDFont辞書のエントリでは/CIDFontTye0か/CIDFontTye0のどちらかを指定します。TrueType系なら/CIDFontType2。OpenType系なら/Subtype /CIDFontType0と指定します。間違えても細かいことをしない限りか?現段階の大雑把な操作ではあまり問題はおこらないようです。いやOpen TypeのようでTrueTypeとして動くようなフォントが多いWindowsのおかげか、
 +
 
 +
====== ''' /DescendantFonts :/FontDescriptor''' ======
 +
 Descriptor=説明するもの。という英訳ができるわけです。この辞書の中で呼び出したフォントファイルの詳細な扱い方を設定します。呼び出したフォントが Type0<span>(</span>複合型フォント<span>)</span> あるいは Type3<span>(</span>内部で定義するフォントプログラム<span>)</span>の場合。このフォントデスクリプタは設定しません。フォントのことをよく知っていないと設定できないような値が続きます。
 +
 
 +
<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: 100px;">オペランド型</th>
 +
  <th>説明</th>
 +
  </tr>
 +
<tr>
 +
  <td>Type</td>
 +
  <td>辞書名</td>
 +
  <td>/FontDescriptor と記述しなければなりません。</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>Ascent</td>
 +
  <td>数値</td>
 +
  <td>アクセント記号を除いたグリフの最大高さベースラインが 0 基準となる大きさ</td>
 +
</tr>
 +
<tr>
 +
  <td>CapHeight</td>
 +
  <td>数値</td>
 +
  <td>アクセント記号を除いたアルファベット大文字の最大高さ。</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>Descent</td>
 +
  <td>数値</td>
 +
  <td>グリフの最大低さ深さベースラインが 0 基準となる大きさ</td>
 +
</tr>
 +
<tr>
 +
  <td>Flags</td>
 +
  <td>整数値</td>
 +
  <td>等幅フォントであるかなど、特性を示す番号</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>FontBBox</td>
 +
  <td>矩形</td>
 +
  <td>グリフのem単位座標系でフォントを囲むような値。文字を選択したときに強調される矩形だと思います。</td>
 +
</tr>
 +
<tr>
 +
  <td>FontName</td>
 +
  <td>辞書名</td>
 +
  <td>フォントのPostScript名。日本語名でも英語名でもいい。</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>ItalicAngle</td>
 +
  <td>数値</td>
 +
  <td>左に傾く度数をプラスとした斜体文字向けの角度指定。値が0以外の場合は通常マイナスの値になるはず。</td>
 +
</tr>
 +
<tr>
 +
  <td>StemV</td>
 +
  <td>数値</td>
 +
  <td>文字の軸の幅。全体の最大付近の幅みたいな値になります。</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>AvgWidth</td>
 +
  <td>数値</td>
 +
  <td>規定値0。0なら指定されていないとみなす。フォントの平均幅。</td>
 +
</tr>
 +
<tr>
 +
  <td>FontFile</td>
 +
  <td>ストリーム</td>
 +
  <td>Type1形式のフォントプログラム埋め込みストリーム</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>FontFile2</td>
 +
  <td>ストリーム</td>
 +
  <td>TrueType形式のフォントプログラム埋め込みストリーム</td>
 +
</tr>
 +
<tr>
 +
  <td>FontFile3</td>
 +
  <td>ストリーム</td>
 +
  <td>Type1、TrueType形式以外のフォントプログラム埋め込みストリーム。形式名はストリーム内辞書のSubTypeで指定。</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>Leading</td>
 +
  <td>数値</td>
 +
  <td>テキスト行間のベースライン同士の空き縦幅。規定値 0。0は指定なしの扱い。</td>
 +
</tr>
 +
<tr>
 +
  <td>MaxWidth</td>
 +
  <td>数値</td>
 +
  <td>フォントのグリフ最大幅</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>MissingWidth</td>
 +
  <td>数値</td>
 +
  <td>フォント辞書Widths配列で幅が指定されていない場合に使われる幅。規定値は 0。</td>
 +
</tr>
 +
<tr>
 +
  <td>StemH</td>
 +
  <td>数値</td>
 +
  <td>StemVに対応する。垂直方向の幅の値</td>
 +
</tr>
 +
<tr style=" background: #eeeeee;">
 +
  <td>XHieght</td>
 +
  <td>数値</td>
 +
  <td>アルファベット小文字向けのHeightに対応する値。</td>
 +
</tr>
 +
<tr>
 +
  <td>CharSet</td>
 +
  <td>文字列</td>
 +
  <td>Type1フォントのみで有効な値。サブセット化するために特定の文字を指定する/から始まる名前をリスト化した文字列。この情報が無い場合はサブセットであることを示すものはFontNameにタグがつけられているかどうかになります。</td>
 +
</tr>
 +
</table>
 +
 
 +
 
 +
CharSetで指定する各文字名の正式な名称は PDFリファレンスの最後の付録のあたりに記述があります。
 +
 
 +
 
 +
 
 +
====== '''  /DescendantFonts :/FontDescriptor : /Flags''' ======
 +
 フラグ番号毎の意味。数字はビット位置です。2進数の桁数の位置です。フラグは複数を一括で指定することもできます。
 +
 
 +
1.FixedPitch
 +
:等幅フォントです。日本語の等幅は半角と全角で幅が違うので、該当しません。等幅だけど正式にはプロポーショナル扱いです。
 +
 
 +
 
 +
2.Serif
 +
:明朝フォントのようなウロコのついた文字です。
 +
 
 +
 
 +
3.Symbolic
 +
:記号の集まりのようなフォント
 +
 
 +
 
 +
4.Script
 +
:手書きフォント、英字の場合は筆写体。
 +
 
 +
 
 +
6.NonSymbolic
 +
:ラテン文字またはそのサブセット
 +
 
 +
 
 +
7.Italic
 +
:斜体文字
 +
 
 +
 
 +
17.AllCap
 +
:小文字が含まれないフォント
 +
 
 +
 
 +
18.SmallCap
 +
:大文字と小文字の字形は分かれて登録されているものの、文字サイズが同じ大きさになっている。
 +
 
 +
 
 +
19.ForceBold
 +
:小さな文字になっても、最小の細さは保持されて太字指定がくずれない。
 +
 
 +
 
 +
 2と6と19が複合した場合は 100 <span></span> 0000 <span></span>0000 <span></span> 0010 <span></span> 0010 = 10進数で262178となります。したがって
 +
 
 +
/flags 262178
 +
 
 +
 と設定します。
 +
 
 +
 
 +
 
 +
====== '''  /DescendantFonts :/FontDescriptor : /CharSet''' ======
 +
 サブセットっていうのは、Fontファイルに含まれる文字の一部をだけを抜き出して保持するようなフォントです。特に埋め込みする場合は全部の文字を保持することは意味がありません。このサブセットというフォントを再構成して任意の6文字を先頭につけたものを作ります。例えば
 +
 
 +
 
 +
 EOODIA+Poetica
 +
 
 +
 
 +
 というようなフォント名はサブセット化されているフォント名の代表です。その中に含まれている文字を文字列で指定することでサブセット化されていて、どの文字が含まれているかを指定するものになっています。
 +
 
 +
 
 +
 
 +
====== ''' /DescendantFonts :/CIDSystemInfo''' ======
 +
 ここにCIDFontの情報を記述します。必須の情報です。説明の要素が強い情報です。PDFのビューワーから、この情報にアクセスして、どんなCIDFontが使われているのかを知る術になっているようです。
 +
 
 +
 
 +
この中に3つの辞書を設定します。
 +
 
 +
 
 +
*/Registry
 +
: このCID情報の登録者文字列を設定します。個人でフォントを登録することは少ないので会社名であることが多いようです。よく使われるのが (Adobe) です。文字列です。
 +
 
 +
*/Ordering
 +
: 文字のエンコーディング方式名を設定します。Identityならそのまま、UCSはユニコードシーケンス。といった具合です。(Japan1) ならAdobeJapan1です。
 +
 
 +
*/Supplement
 +
: 補足です。ここには文字のエンコーディング方式の世代番号のようなものを登録します。整数です。0~65535くらいまで設定できます。AdobeJapan1の場合は登録文字数によって 0~7 に分けられています。7はUnicode文字セットのほとんどを収録しているようなフォントになります。
 +
 
 +
 
 +
 
 +
==== '''SubType Type3の利用によるテキスト出力''' ====
 +
 Type3 は PDFのフォントストリーム部分にPDFでのグラフィック描画処理を流用してフォントプログラムを構成する方法。試しにやってみたけど、今のところ、エラーになりまくりです。
 +
 
 +
 自分が作ったType3フォント2文字は以下のように生成したものの、Font リソース部で名前をつけて参照先をしていして実体化させようとしたところで、PDFオープン時にエラーになる。悲しい。
 +
 
 +
 
 +
 途中経過としては以下のようなスクリプトだ。インターネットに出回っているType3のPDFはうまくFontの定義は出来ているみたい。でもマネしてもダメだな。もう少し理解しないと駄目だな。
 +
 
 +
 
 +
 ページの処理中にエラーが発生しました。文書を読み取り中に問題が発生しました(18)となるType3指定例。解決編までは、しばし待たれよ。それっていつだよ。だな。
 +
 
 +
<Syntaxhighlight2 lang="text">
 +
 +
 
 +
 +
4 0 obj
 +
<<
 +
  /Font
 +
  <<
 +
      /F0 15 0 R
 +
      /F1 6 0 R
 +
      /F2 14 0 R
 +
      %/Type3Font 16 0 R %Type3
 +
  >>
 +
>>
 +
endobj
 +
 +
 
 +
 +
stream
 +
 +
%/Type3Font 10.0 Tf
 +
%(abababab) Tj T*
 +
 +
endstream
 +
 +
 
 +
 +
 
 +
16 0 obj
 +
<<
 +
  /Name/Type3Font
 +
  /Type /Font
 +
%  /Resources
 +
%  <<
 +
%      /ProcSet [/PDF /ImageB]
 +
%  >>
 +
  /SubType /Type3
 +
  /FontBBox [0 0 750 750]
 +
  /FontMatrix [0.001 0 0 0.001 0 0]
 +
  /FirstChar 97
 +
  /LastChar 98
 +
  /Widths [1000 1000]
 +
  /Encoding 17 0 R
 +
  /CharProcs 18 0 R
 +
>>
 +
endobj
 +
 
 +
17 0 obj
 +
<<
 +
  /Type /Encoding
 +
  /Differences [97 /square /triangle]
 +
>>
 +
endobj
 +
 
 +
18 0 obj
 +
<<
 +
  /square 19 0 R
 +
  /triangle 20 0 R
 +
>>
 +
endobj
 +
 
 +
19 0 obj
 +
<<
 +
 
 +
>>
 +
stream
 +
  1000 0 0 0 750 750 d1
 +
  0 0 750 750 re
 +
  f
 +
endstream
 +
endobj
 +
 
 +
20 0 obj
 +
<<
 +
 
 +
>>
 +
stream
 +
  1000 0 0 0 750 750 d1
 +
  0 0 m
 +
  375 750 l
 +
  750 0 l
 +
  f
 +
endstream
 +
endobj
 +
 
 +
xref
 +
0 21
 +
 +
 
 +
 +
</Syntaxhighlight2>
 +
 上の方にある行
 +
 
 +
%/Type3Font 16 0 R %Type3
 +
 
 +
 のコメントを外すとエラーでコメント化したままなら問題ないです。惜しいところまで来ている。凡ミスしてるんだろうなぁ。わからん。落ち着け俺。うまくいっているインターネット上から入手したType3フォントを使っているPDFあるんだから、うまくいくはず。
 +
 
 +
==== '''フォントプログラムの埋め込み''' ====
 +
 ここまでフォントの原理を理解することに焦点を合わせて、プログラムを埋め込まない使い方をしましたが、埋め込まない日本語PDFはISOの意に沿わない形式と言えるそうです。なので埋め込まないといけないのですが、フォントファイルから埋め込みフォントの記述方法については詳しく述べられた文献がみつからないため、続編記事には時間がかかりそうです。
 +
 
 +
 
 +
 なんやかんやで今まで、色々なわからないことを潰してきましたので、なんとかしていくでしょう。
 +
2022年8月上旬現在。
 +
 
 +
 やってみたんですけど。Wordとかで埋め込まれたフォントストリームをバイナリ―エディタで切り出して、元と同じファイル名の拡張子を付けると、抽出された文字だけのサブセットフォントになっています。バイナリーエディタで編集するときは stream 0x0a…0x0a endstream という具合に改行コード 0a があると思うので、0aも切り取ります。フォントファイルのバイナリーは…の部分そのものということ。
  
  
====== '''/DescendantFonts :/BaseFont''' ======
+
 なのでフォントファイルの編集方法がわかれば、埋め込み用のフォントプログラムは作れそうです。でも編集方法がわかるくらいなら、フォントエディタでも作れるくらいのスキルがあるわけで、なかなかの壁だな。PDFで使った文字コードすべてを検出して、フォントファイルから、使った文字コードに対応するグリフだけを残して、あとは消したフォントサブセットをつくる。これができればPDF文書の内製化および発展的使い方も見えてくる。あるいは、印刷機能を理解する方面からPDFConverterとストリームのやり取りをするという方法に戻るか。それでは、なんだか面白くない。せっかくPDFの構造を理解することに積極的になったのだから、やりこみたいような気もする。
  
====== '''/DescendantFonts :/CIDToGIDMap''' ======
 
  
====== '''/DescendantFonts :/W''' ======
+
 素人はフォントファイルを編集するFontForgeとかの先人達が築き上げた立派なフォントエディタでいじったものを張り付けて埋め込むという作業でもしてないさいって感じになるのかな。フォントファイルの構造解析しないとだめだな。また勉強だ。意外と根本の原理がわかっていないでコンピュータつかってるんだなぁって思わされる。フォントひとつすら理解できていないだもんな。恥ずかしい限り。
  
====== '''/DescendantFonts :/Subtype''' ======
 
  
====== '''/DescendantFonts :/FontDescriptor''' ======
+
再び、2022年8月上旬現在。あまり時間かからず確かめれてる。
====== '''/DescendantFonts :/FontDescriptor : /FontName''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /FontBBox''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /StemV''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /Ascent''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /Flags''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /Descent''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /ItalicAngle''' ======
+
====== '''/DescendantFonts :/FontDescriptor : /CapHeight''' ======
+
  
====== '''/DescendantFonts :/CIDSystemInfo''' ======
+
 
  
 
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。
 
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。

2022年8月10日 (水) 00:00時点における最新版



個人用ツール
名前空間

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