PDF 内部構造 テキスト 新しいページはコチラ
提供: yonewiki
(→ /DescendantFonts :/FontDescriptor : /Flags) |
(→ /DescendantFonts :/FontDescriptor : /CharSet) |
||
243行: | 243行: | ||
</syntaxhighlight2> | </syntaxhighlight2> | ||
− | という具合にリソースの定義部で、/Fontフォントが定義され、その中で/DescendantFonts。そしてさらにその中で/ | + | という具合にリソースの定義部で、/Fontフォントが定義され、その中で/DescendantFonts。そしてさらにその中で/FontDescriptorについての定義がされる。コメントの%KozMinは、Macのフォントの小塚明朝の場合はこんな感じの記述という例で、完全に動作するとは保証できないのであしからず。この3段論法みたいなフォント情報はひとつにまとめて書くことが出来る。まとめて記述するには、以下のような感じ。Adobe Acrobat Readerには小塚明朝が表示できる様に組み込まれていてWindowsでも使えるはずですが、自分は上手くやれませんでした。なんかもうちょっとコツがあるのかも知れない。ちな、この小塚フォントをWindowsの汎用フォントフォルダに移動して普通に使って文書に埋め込んだりして配布して使うのは規約違反らしいです。Acrobatで見るためだけに使いなさいと言う事らしい。 |
<syntaxhighlight2 lang="text"> | <syntaxhighlight2 lang="text"> | ||
299行: | 299行: | ||
</syntaxhighlight2> | </syntaxhighlight2> | ||
− | 三つを一つに纏めれましたが、この三つは意味が違うので注意が必要です。/F1という名前のフォントはType0という扱いをします。という意味合いで、このファイルでの扱いを、決めるための定義なのでこのPDFファイルのための独自情報です。ここでType0になっているのは、複数のフォントを、まとめれるという特徴があるのでよく使われるフォントタイプです。その中にある/ | + | 三つを一つに纏めれましたが、この三つは意味が違うので注意が必要です。/F1という名前のフォントはType0という扱いをします。という意味合いで、このファイルでの扱いを、決めるための定義なのでこのPDFファイルのための独自情報です。ここでType0になっているのは、複数のフォントを、まとめれるという特徴があるのでよく使われるフォントタイプです。その中にある/DescendantFontsにはこういうフォントを組み合わせて使いますという具合です。Descendantは日本語で子孫という意味です。実際に利用するフォントの構造を指定しています。MSゴシックがTrueTypeのCIDキー付きフォントだということを意味しています。実際はOpen Typeの構造に準拠していますが、TrueTypeとしても動作する様になっている形式です。OpenTypeは使えないと言うアプリケーションは多いWindowsの世界では良く取られる対処法です。 |
− | そして、/ | + | そして、/FontDescriptorはストリームで対応する文字コードについてのフォント情報が無かったとき、この例ではType0フォントのMSゴシックが無い場合、どのフォントの情報に従うのかという意味を持っています。そしてどの様なフォントなのかを説明しなければなりません。Descriptorとは説明する者という意味です。 |
==== '''日本語PDFフォント情報のオペレータ個別の意味''' ==== | ==== '''日本語PDFフォント情報のオペレータ個別の意味''' ==== | ||
886行: | 886行: | ||
1グリフ毎の横幅のデフォルト値。全グリフに適用される整数値。規定値は0 | 1グリフ毎の横幅のデフォルト値。全グリフに適用される整数値。規定値は0 | ||
font内部の指定値に左右されますが、等幅半角文字なら1024emあるいは、1000、等幅全角文字なら2048emあるいは2000emとなっているものが多いでしょう。なので最大の2048を適用しておいて、それでは、他の文字が具合が悪いので、半角文字の一文字毎に次の/Wを使って指定することになります。範囲指定できるので、それほど大変ではありません。 | font内部の指定値に左右されますが、等幅半角文字なら1024emあるいは、1000、等幅全角文字なら2048emあるいは2000emとなっているものが多いでしょう。なので最大の2048を適用しておいて、それでは、他の文字が具合が悪いので、半角文字の一文字毎に次の/Wを使って指定することになります。範囲指定できるので、それほど大変ではありません。 | ||
− | + | ||
− | + | /DW 2048 | |
====== ''' /DescendantFonts :/W''' ====== | ====== ''' /DescendantFonts :/W''' ====== | ||
957行: | 957行: | ||
====== ''' /DescendantFonts :/Subtype''' ====== | ====== ''' /DescendantFonts :/Subtype''' ====== | ||
− | ここでは実際に使うフォントファイルの形式を指定します。このCIDFont辞書のエントリでは/CIDFontTye0か/CIDFontTye0のどちらかを指定します。TrueType系なら/CIDFontType2。OpenType系なら/Subtype / | + | ここでは実際に使うフォントファイルの形式を指定します。このCIDFont辞書のエントリでは/CIDFontTye0か/CIDFontTye0のどちらかを指定します。TrueType系なら/CIDFontType2。OpenType系なら/Subtype /CIDFontType0と指定します。間違えても細かいことをしない限りか?現段階の大雑把な操作ではあまり問題はおこらないようです。いやOpen TypeのようでTrueTypeとして動くようなフォントが多いWindowsのおかげか、 |
====== ''' /DescendantFonts :/FontDescriptor''' ====== | ====== ''' /DescendantFonts :/FontDescriptor''' ====== | ||
1,064行: | 1,064行: | ||
</tr> | </tr> | ||
</table> | </table> | ||
+ | |||
+ | |||
+ | CharSetで指定する各文字名の正式な名称は PDFリファレンスの最後の付録のあたりに記述があります。 | ||
====== ''' /DescendantFonts :/FontDescriptor : /Flags''' ====== | ====== ''' /DescendantFonts :/FontDescriptor : /Flags''' ====== | ||
− | + | フラグ番号毎の意味。数字はビット位置です。2進数の桁数の位置です。フラグは複数を一括で指定することもできます。 | |
1.FixedPitch | 1.FixedPitch | ||
1,104行: | 1,107行: | ||
19.ForceBold | 19.ForceBold | ||
:小さな文字になっても、最小の細さは保持されて太字指定がくずれない。 | :小さな文字になっても、最小の細さは保持されて太字指定がくずれない。 | ||
+ | |||
+ | |||
+ | 2と6と19が複合した場合は 100 <span></span> 0000 <span></span>0000 <span></span> 0010 <span></span> 0010 = 10進数で262178となります。したがって | ||
+ | |||
+ | /flags 262178 | ||
+ | |||
+ | と設定します。 | ||
1,114行: | 1,124行: | ||
− | + | というようなフォント名はサブセット化されているフォント名の代表です。その中に含まれている文字を文字列で指定することでサブセット化されていて、どの文字が含まれているかを指定するものになっています。 | |
+ | |||
+ | |||
====== ''' /DescendantFonts :/CIDSystemInfo''' ====== | ====== ''' /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も切り取ります。フォントファイルのバイナリーは…の部分そのものということ。 | ||
+ | |||
+ | |||
+ | なのでフォントファイルの編集方法がわかれば、埋め込み用のフォントプログラムは作れそうです。でも編集方法がわかるくらいなら、フォントエディタでも作れるくらいのスキルがあるわけで、なかなかの壁だな。PDFで使った文字コードすべてを検出して、フォントファイルから、使った文字コードに対応するグリフだけを残して、あとは消したフォントサブセットをつくる。これができればPDF文書の内製化および発展的使い方も見えてくる。あるいは、印刷機能を理解する方面からPDFConverterとストリームのやり取りをするという方法に戻るか。それでは、なんだか面白くない。せっかくPDFの構造を理解することに積極的になったのだから、やりこみたいような気もする。 | ||
+ | |||
+ | |||
+ | 素人はフォントファイルを編集するFontForgeとかの先人達が築き上げた立派なフォントエディタでいじったものを張り付けて埋め込むという作業でもしてないさいって感じになるのかな。フォントファイルの構造解析しないとだめだな。また勉強だ。意外と根本の原理がわかっていないでコンピュータつかってるんだなぁって思わされる。フォントひとつすら理解できていないだもんな。恥ずかしい限り。 | ||
+ | |||
+ | |||
+ | 再び、2022年8月上旬現在。あまり時間かからず確かめれてる。 | ||
+ | |||
+ | |||
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。 | [[PDF 内部構造#説明|PDF 内部構造]]に戻る。 |