PDF 内部構造 CMap 新しいページはコチラ
提供: yonewiki
(→beginbfchar ~ endbfchar) |
(→beginbfchar ~ endbfchar) |
||
71行: | 71行: | ||
− | /CIDInit に対して /ProcSet という辞書で指定できる値を設定、準備して動かすのがCMap定義のはじまりの通常のあり方です。Adobeが準備した(WindowsならC:\Program Files\Adobe\resource\cmapにあるのがAcrobatReader向けの標準CMap)全てのCMapファイルも同じようになっています。 | + | /CIDInit に対して /ProcSet という辞書で指定できる値を設定、準備して動かすのがCMap定義のはじまりの通常のあり方です。Adobeが準備した(WindowsならC:\Program Files\Adobe\Acrobat DC\resource\cmapにあるのがAcrobatReader向けの標準CMap)全てのCMapファイルも同じようになっています。 |
132行: | 132行: | ||
CMapFont名の任意の辞書文字列を設定します。CIDFont名の正式名称ような形式になっていることが多いです。例では /Adobe-Identity-UCS となっています。 | CMapFont名の任意の辞書文字列を設定します。CIDFont名の正式名称ような形式になっていることが多いです。例では /Adobe-Identity-UCS となっています。 | ||
+ | |||
+ | ==== '''/CMapType''' ==== | ||
+ | CMapの形式を指定します。後ろのオペランドに整数をとります。 | ||
+ | |||
+ | |||
+ | 0 = CMapファイルとしての機能。 | ||
+ | |||
+ | 1 = CID への変換。※PDFのFont構造のCIDtoGIDMap向け | ||
+ | |||
+ | 2 = Unicode への変換。※PDFのFont構造のToUnicode向け | ||
==== '''begincodespacerange ~ endcodespacerange''' ==== | ==== '''begincodespacerange ~ endcodespacerange''' ==== | ||
149行: | 159行: | ||
<Syntaxhighlight2 lang="text"> | <Syntaxhighlight2 lang="text"> | ||
− | + | 1 beginbfchar | |
<0000> <FFFF> | <0000> <FFFF> | ||
endcodespacerange | endcodespacerange | ||
177行: | 187行: | ||
==== '''beginbfchar ~ endbfchar''' ==== | ==== '''beginbfchar ~ endbfchar''' ==== | ||
PDFやアプリケーション側が指定するグリフコード対応するコード番号を返却するものです。PDFのFont構造の中の/ToUnicodeに対応する参照にCMapを指定した場合。第一オペランドで指定されたコードがUnicode文字での第二オペランドのコード番号の対応になります。この番号が指定されていればPDFでテキストを範囲指定してコピーしたものを各種エディタに貼りつけるときに各種文字コードにエンコードして貼り付けたりすることができるようになります。第一オペランドに指定したようなグリフIDだけではコピーペーストができません。 | PDFやアプリケーション側が指定するグリフコード対応するコード番号を返却するものです。PDFのFont構造の中の/ToUnicodeに対応する参照にCMapを指定した場合。第一オペランドで指定されたコードがUnicode文字での第二オペランドのコード番号の対応になります。この番号が指定されていればPDFでテキストを範囲指定してコピーしたものを各種エディタに貼りつけるときに各種文字コードにエンコードして貼り付けたりすることができるようになります。第一オペランドに指定したようなグリフIDだけではコピーペーストができません。 | ||
+ | |||
+ | |||
+ | CMapとして使う場合はuseFontというオペレータが必須です。これはフォントの再配置におけるフォント番号をオペランドとして保持するオペレータです。複数あるフォントのうち何番目のフォント図柄を対応させるかという意味になります。複数ない場合でも1 useFontのように定義されているはずです。ToUnicodeに対応するCMapでは必須ではないです。 | ||
185行: | 198行: | ||
<Syntaxhighlight2 lang="text"> | <Syntaxhighlight2 lang="text"> | ||
− | + | 17 beginbfchar | |
<0003> <0020> % | <0003> <0020> % | ||
<0030> <004D> %M | <0030> <004D> %M | ||
205行: | 218行: | ||
endbfchar | endbfchar | ||
</Syntaxhighlight2> | </Syntaxhighlight2> | ||
− | + | ||
+ | |||
+ | ここからは上記のサンプルで使わなかったオペレータと/辞書名文字列を紹介していきます。 | ||
+ | |||
+ | ==== '''beginbfrange ~ endbfrange''' ==== | ||
+ | 一定の範囲を一括で同じグリフに割り当てるオペレータです。endbfrangeの最初の2つのオペランドで指定した入力範囲に対して、3番目に指定した番号を先頭としたグリフIDを連番で指定するものです。出力に配列名と辞書名文字を使うパターンも使うかもしれないです。 | ||
+ | |||
+ | int beginbfrange - | ||
+ | |||
+ | srcCodeLo srcCodeHi dstCodeLo endbfrange - | ||
+ | |||
+ | or | ||
+ | |||
+ | srcCodeLo srcCodeHi [/dstCharName 1 .. /dstCharName n] endbfrange - | ||
+ | |||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <00> <1F> <20> | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <20> <23> [/space /exclam /quotedbl /numbersign] | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | |||
+ | のような使い方になるでしょう。 | ||
+ | |||
+ | ==== '''begincidchar ~ endcidchar''' ==== | ||
+ | 出力に10進数のグリフ番号を使うパターンです。 | ||
+ | |||
+ | int begincidchar - | ||
+ | |||
+ | srcCode dstCID endcidchar - | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <20> 32 %space | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。 | ||
+ | |||
+ | ==== '''begincidrange ~ endcidrange''' ==== | ||
+ | 領域を一括して指定するものです。endcidrangeの最初の2つのオペランドで指定した入力値に対して10進数で指定したのグリフ番号を先頭に連番で使うパターンです。 | ||
+ | |||
+ | int begincidrange - | ||
+ | |||
+ | srcCode dstCID dstCIDLo endcidrange - | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <20> <7e> 231 %space | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。 | ||
+ | |||
+ | ==== '''beginnotdefchar ~ endnotdefchar''' ==== | ||
+ | notdefは未定義値の意味です。Glyph未定義値の結果としてどのグリフ番号を使うかというものです。PDFでもよく文字化けしたような文字で□が使われることがありますが、これもフォントの動作として指定されているということです。何も設定しなければcodespaceの範囲外の無効な値はGlyph番号 0が使われます。 | ||
+ | |||
+ | int endnotdefchar - | ||
+ | |||
+ | srcCode dstCID endnotdefchar - | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <01> 1 | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。 | ||
+ | ==== '''beginnotdefrange ~ endnotdefrange''' ==== | ||
+ | Glyph未定義値の結果としてどのグリフ番号を使うかというものの一括版です。何も設定しなければ | ||
+ | |||
+ | int endnotdefrange - | ||
+ | |||
+ | srcCodeLo srcCodeHi dstCID endnotdefrange - | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginbfrange | ||
+ | <01> <1F> 1 | ||
+ | endbfrange | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。 | ||
+ | |||
+ | ==== '''beginrearrangedfont ~ endrearrangedfont''' ==== | ||
+ | 再配置したフォントを1つにまとめて使う場合の定義です。どのフォントからどれを使うかはこれまでに紹介した方法で定義する必要があります。割り当てを定義するオペレータを使う都度、usefontオペレータで対象のフォントを配列にしていた順番で割り当てられる番号で指定する必要があります。 | ||
+ | |||
+ | |||
+ | /newFontName [component fonts array] beginrearrangedfont - | ||
+ | |||
+ | srcCodeLo srcCodeHi dstCID endnotdefrange - | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | /Jun101-Light-K-G-R-83pv-RKSJ-H | ||
+ | [ | ||
+ | /Jun101-Light-83pv-RKSJ-H | ||
+ | /Poetica-ChanceryIV | ||
+ | /ShinseiKai-CBSK1-83pv-RKSJ-H | ||
+ | /FutoGoB101-Bold-83pv-RKSJ-H | ||
+ | /FutoMinA101-Bold-83pv-RKSJ-H | ||
+ | /HSMinW3Gai30 | ||
+ | ] beginrearrangefont | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。5つのCIDフォントが再配置されて、/Jun101-Light-K-G-R-83pv-RKSJ-Hとして機能することを意味しています。 | ||
+ | |||
+ | ==== '''beginusematrix ~ endusematrix''' ==== | ||
+ | フォントを移動拡大縮小回転歪み変形させる処理です。斜体文字を演算によって作り出すだけの手法はCMapによって実現できます。実際は専用の斜体文字の見た目の良さには勝てません。文字の詰め方や斜体独特の文字のつぶれ方の補完を実施したほうが美しいと感じます。 | ||
+ | |||
+ | |||
+ | fontID beginusematrix | ||
+ | |||
+ | [a b c d tx ty] endusematrix | ||
+ | |||
+ | <Syntaxhighlight2 lang="text"> | ||
+ | 1 beginusematrix % 1はフォント番号 | ||
+ | [1 0 0 1 0 0.15] beginrearrangefont | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | のような使い方になるでしょう。配列の0.15にあたる部分は縦方向の移動量を示していて1が1000emとなるような単位系です。emとは何かについては[[METAFONT 単位|フォントの作成について説明した記事]]で説明済なので説明しません。配列は行列を使った移動拡大縮小のメカニズムで[[PDF_内部構造_グラフィックス#平行移動・拡大縮小・回転|PDF内部構造のグラフィックの部分]]で説明済なので、ここでは説明しません。 | ||
+ | |||
+ | |||
[[PDF 内部構造 テキスト#/ToUnicode|PDF 内部構造 テキスト]]へ戻る。 | [[PDF 内部構造 テキスト#/ToUnicode|PDF 内部構造 テキスト]]へ戻る。 |