Tips on PostScript

[戻る] [English Page]


Text filter into PostScript - tops

配布

キーワード

m2ps, coco, Emacs/Mule, iconv, lv, a2ps, mpage, gs-cjk

参考文献

  1. Adobe Systems Incorporated, ``Chapter 4 - Emulators and Translators,'' in ``PostScript Language Program Design,'' Addison-Wesley, pp. 59--75, 1988.
  2. Adobe Systems Incorporated, ``Adobe Solutions Network: PostScript Technical Notes,'' http://partners.adobe.com/asn/developer/technotes/postscript.html, 2000-2001.

Embed CIDFont/CMap into PostScript - embresps

配布

要件

PostScript 3 printer, gs-cjk, CIDFontType0 fonts

Ghostscript 6 で CJK(中国語、日本語、韓国語) TrueType フォントを CID-Keyed フォントとして使えるようにしよう

[2001/3/9] ここでの試みは、既にgs-cjkプロジェクトに移行中です。だからこのページでの更新はもうないです。みなさん、gs-cjkプロジェクトに御期待下さい。[2001/3/31,4/2] と言いつつ、gs6.01のために更新しました。その後、gs-cjkプロジェクトのサイトが消滅しているので、草稿のつもりのページがサポートページになっています。以下の記述は相当古いですが、そのまま残しておきます。
[2000/12/16] 下記と同様な考えで、Unicode.org のテーブルの代わりに PDF core fonts の CMap を用いた方法もやってみました。両者をうまく混ぜればさらに使えるグリフが増えるはず。よって最終的な調整段階に突入。[2001/4/2] でーきた!
[2000/11/23] 技術メモ3[2000/11/22]で提案した、Unicode.org のテーブルを用いた、新しいマッピングテーブル生成方法を導入してみました。これによりcjkvttcidmap-*.tar.gz のバージョン 0.9 系が作成されました。今まで 90ms-RKSJ, 90pv-RKSJ などで使えなかったグリフが格段に増えました! 他の言語についても同様に増えました。
[2000/11/20,22] cjkvttcidmap-*.tar.gz を更新しました。Adobe が配布する CMap リソースが新しくなったことによるバージョンアップ(及び、2000/11/15,18 に行なってしまった改悪に対する改善)です。[2000/11/22] Adobe-CNS1-Unicode の U+2013 の縦書きグリフのバグフィックス。大和さんありがとうございました。
[2000/11/20,22] install-cid-*.tar.gz を更新しました。Adobe が配布する CMap リソースが新しくなったことによるバージョンアップに加えて、ai0.tar.Z を展開しておかないと正しく動かないバグを修正、さらには、cjkvttcidmap-*.tar.gz を作成するための Perl スクリプト icmaptops.pl (2000/11/15,18 に行なってしまった改悪を修正)も同梱されています。[2000/11/22] icmaptops.pl のマッピングアルゴリズムにバグ。CNS1 で影響が出ます。大和さんありがとうございました。
[2000/4/19] GB1, Japan1, Korea1では縦書き用グリフの表示が出来ました。CNS1では確認できませんでした。ちなみに Japan2 に縦書き用グリフはありません(参考: PostScriptファイル, 実行例) [2000/11/22更新]。
[2000/4/13] /Resource/TrueType/* のうち、Big5, PRC, ShiftJIS, Wansung, 韓国語の Unicode に関するリソースファイルに過失がありました。バージョン0.4以前のものは使わない方が良いです。[2000/4/16,17,18,19] ちょっとだけリソースファイルを直しました。詳細は技術メモに書いてあります。
[2000/3/30] .loadcjkvttcidfont の仕様(引数: filename)が、gs_ttf.ps 内の他の .loadtt*font の仕様(引数: filetype)と異なっていたので、鈴木秀幸さんと相談して、.loadcjkvttcidfontの仕様を他と統一し、引数に<filename>が使える.openttcidfontでかぶせました。
[2000/3/27] 鈴木秀幸さんの助言を得て、/Resource/TrueType/* の構造の変更、及びそれに伴いパッチの修正を行いました。お蔭様で、日本語JIS補助漢字にも対応出来ました。
[2000/3/24] 鈴木秀幸さんのページで試みられている「GS で日本語 TrueType フォントを CID-Keyed フォントとして使う方法」をベースに、中国語(簡体字 PRC, 繁体字 Big5, Unicode)、日本語(Shift-JIS, Unicode)、韓国語(Wansung, Johab, Unicode)の TrueType フォントでも、自動的に対応すべき CID を推定し、CID-Keyed フォントとして使えるようにするパッチを作成しました。

パッチとリソースファイル

ここで配布されているさまざまなリソースは BSD License に従います。 20種類ほどの CJK TrueType フォントを試しましたが、ほぼすべてのフォントで正しく表示出来ているようです。一部の正しく表示されないフォントについては、地道な調査を延々と継続中。[2000/11/20] なるべく新しめの TrueType フォントを使うことをお勧めします。

現在、ベトナム語の TrueType フォントが使えるかを調査中です。[2000/4/7] Adobe Vietnam1 の CID についての詳細が判らず、ちょっと手が付けられませんでした。非CIDフォントならベトナム語は印字できますし(「Ghostscript 6 で各国 TrueType フォントを使いたい」参照)、保留することにしました。

手順

パッチ内部で TrueType フォントの情報から、中国語、日本語、韓国語の CID を適切に判定していますので、導入の手順は鈴木秀幸さんのとほぼ同じです。但し.loadfakettcidfont.openttcidfont に置き換えて下さい。

また、日本語の CMap(aj14, aj20) に加えて、台湾の CMap(ac13)、中国の CMap(ag13)、韓国の CMap(ak12)を ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/から取得して/Resource/CMap/ 配下に置いて下さい。さらに /Resource/TrueType/ に上記の cjkvttcidmap-*.tar.gz を展開しておいて下さい。

以下は、中国語の TrueType フォント(mssong.ttf) の例です。/Resource/CIDFont/ に以下の MS-Song を作成します。

% /Resource/CIDFont/MS-Song
(/usr/local/share/fonts/truetype/mssong.ttf) .openttcidfont pop
例えばこのフォントを GB 2312 で利用する場合は、/Resource/Font/ もしくは /usr/local/share/ghostscript/fonts/ に以下のMS-Song-GB-H を用意します。
% /Resource/Font/MS-Song-GB-H
/MS-Song-GB-H
/GB-H /CMap findresource
[/MS-Song /CIDFont findresource]
composefont pop
これで /MS-Song-GB-H というフォントが使えるようになります。例えば、
/MS-Song-GB-H findfont 100 scalefont setfont
100 100 moveto <493d 4c6f 4c29 4b3e> show
で、GB 2312 のコードで私の名前が表示されると思います。^^;

(補足) この手順をすべてのフォント及び各種 CMap の組合せすべてに行うのは、さすがに面倒ですので、簡単な自動インストーラ(alias-*.sh) を作成してあります(「Ghostscript 6 への CJK TrueType フォントのインストール」参照)。# しかし本来ならば、/findfont を改造して自動的に CMap を適用するコードを書くべき、かも。

また、日本語のJIS補助漢字を利用する場合は、内部で自動的に判定できませんので以下のようにすると良いでしょう。無論、その TrueType フォントにJIS補助漢字のグリフが定義されている必要があります。

% /Resource/CIDFont/Fontname-Adobe-Japan2
/Fontname-Adobe-Japan2
(filename.ttf) /Adobe-Japan2-Unicode .openttcidfont
dup length dict begin {def} forall currentdict end
/CIDFont defineresource pop
JIS補助漢字に限らず、任意の変換テーブルを明示したい場合(例えば、CJKV すべてのグリフが定義されている Unicode の TrueType を任意の CID-Keyed フォントとして用いる場合CIDの種類が自動検出出来ないような古いTrueType フォントを使う場合)も上記と同様です。(補足) 自動インストーラ(alias-*.sh)のオプショナル形式を参照して下さい。

エンコーディングの確認

技術メモ

  1. [2000/11/20] 現在、この成果の本家 GS への統合を目指し、それだけでなく CID Type2 フォントファイル生成を目指すメーリングリスト(GS-CJK)が出来たらしいです。そこにお誘い頂き、微力ながら御協力のはずが…、いやー、勉強になります。そのメーリングリストの議論では、私がこのサイトで行なっている対処のことを「on-the-fly patch」と呼んでいます。
  2. [2000/4/13-] 現在、「縦書き」対応の為の対処を行っています。
    1. .getgsub の改良、および .gsublookup の高速化 [2000/4/17済み]
    2. リソースファイルの拡張 [2000/4/17済み]
    3. Cソースへの修正 [2000/11/20] GS 6.31 以上では、縦書きが考慮されているようで、GS 6.01 と比べて比較的楽に「縦書き」対応が出来るそうです。私が手掛けていた「縦書き用グリフの準備」も、正常に動作しているようです。このことは、鈴木秀幸さんによりGS-CJKにて報告され、パッチも提供されましたが、もう少し動作確認等が必要かも知れません。
  3. [2000/4/13] Big5, PRC, ShiftJIS, Wansung, 韓国語の Unicode に関するリソースファイルに過失がありました。また、縦書き用の CID を組み入れた時に、罫線などのCodeが上書きされるタイプのCIDについて、縦書き用の CID を上書きしないようにしました。[2000/4/19] しかしその中でも上書きした方が良い CID(Unicode の互換用文字領域)がありましたので、さらに修正しました(バージョン0.6)。もっといい方法があるかな。[2000/11/22] しかもその互換文字領域で上書きしちゃいけない CID(その中の全角ラテン、半角カナ領域)がありましたので、さらにさらに修正しました(バージョン0.81)。もうこの、HとVペアのCMap から逆変換して求める方式では、これでいいみたい。[2000/11/22] しかし、この方式ではまだ不十分なのかもしれない。なぜなら、Adobe-Japan1 を例にとると、UniJIS-UCS2-[HV] では未使用で、90ms-RKSJ-[HV] で使用されている CID というのが存在するからである。これに対処するには、また新たなテーブル、MS CP 932-Unicode などが必要となる。例えば、90ms-RKSJ で定義かつ UniJIS-UCS2 で未定義の CID は MS-CP 932-Unicode テーブルを使って CID に割り当てておくわけである。この例一つだけを取り上げて説明するのは容易だが、この対処を CJK すべてにおいて、対応するエンコーディング各種とCMap,CIDの関係を調べる必要があるので、ちょっと時間が掛かります。[2000/11/23] あ、今日休日だった! なので、提案した新たなアルゴリズム導入しました。[2000/12/16] 別段、Unicode.org のテーブルに拘る必要はなく、秀幸さんに教えてもらった Adobe が配布する「CMap for PDF core fonts(ToUnicode CMap)」を使ってもいいわけですね。というわけで、そのバージョンも作成してみました。うーん、これもいい。これらを混ぜればもっと良いはず。[2001/4/2] 混ぜました。それがバージョン0.94です。
  4. [2000/4/16,17] 変換テーブルを作成する際、Code から CID への写像において、その逆写像が一意でない場合に、どの Code をリソースファイルに記述しておくかが、ちょっとした問題になっています。逆写像が一意でない CID(DuplicateCIDと呼ぶ)は、特に Japan1 と Korea1 で多く存在します。そのような一つの CID から複数の Code への変換があり得る場合、それらの Code の中で最も小さい Code を選択するというルールで、ほとんど全ての CID においてうまく動作しますが、いくつかの例外も存在します。この問題に対する一つの方法として、DuplicateCID をリソースファイルに記述しておき、TrueType フォントから CID-Keyed フォントへ変換する際、グリフID を DuplicateCID によってチェックするようなコードを gs_ttf.ps に記述すれば問題に対処できると考えていました。しかし実際に調べてみると、この対処によって改善されるグリフは4つしかなく(4/17: さらに一個ありました。4/18: さらにもう一個ありました)、費用対効果が少ないという結論を得ました。よって gs_ttf.ps における改善案を取り止め、その5つだけ上述のルールとは例外的に CID から Code を選択したリソースファイルを提供することにしました。それがバージョン0.43のリソースファイルです。[2000/4/19] さらに様々な新旧 TrueType フォントで調べてみると、いろんなケースがありそうで、とてもじゃないけどリソースファイルだけでは対処出来ない気がしました。なので、上述の DuplicateCID をチェックするようなコードを書きました。なるほど、いいみたい。(参考: PostScript ファイル, 実行例ページ1, ページ2)
  5. [2000/4/7] ArialUnicode というTrueTypeフォントは、各国のグリフのほぼ全てが収録されているようで、上述の方法で所望の CID-Keyed フォントとしても使えるので実験に用いてましたが、どうも誤った Unicodeでグリフが格納されているようなので注意して下さい。これを確認する為に、Adobe の CMap、Unicode コンソーシアムの対応表、そして、私が作成したリソースファイルの洗い出しを行いましたが、これらには原因は見い出せませんでしたので、フォントが怪しいと僕は思っています。私が見つけた間違ったグリフは U+64E5, U+78BB, U+78CE, U+93A3 で、おそらく U+5F5D もずれていると思います。しかしそれにしても、www.unicode.org の対応表は間違いが結構あるので気を付けなくてはいけません。私の気付いたところで、CNS11643.TXT の第一字面で一箇所、GB12345.TXT では23箇所の明らかな間違いがあります。
  6. [2000/3/30] .loadcjkvttcidfont の仕様(引数: filename)が、gs_ttf.ps内の他の .loadtt*font の仕様(引数: filetype)と異なっていたので、鈴木秀幸さんと相談して、.loadcjkvttcidfont の仕様を他と統一し、引数に<filename>が使える .openttcidfont でかぶせました。それと併せて、非CIDフォント用の .openttfont も用意しました。
  7. [2000/3/27] /Resource/TrueType/ の変換テーブルですが、横書き用と縦書き用の CID を一つのファイルにまとめました(バージョン0.2)。[2000/3/30] そのリソースファイルを、Adobe の「文書構造化規約 -バージョン3.0」に則って書き直しました(バージョン0.3)。
  8. 以下のような .openttcidfont の呼び方をサポートすれば、JIS補助漢字も Unicode の TrueType フォントで使えるようになるかも。同様に、Unicode のすべてのグリフが定義されている TrueType フォントを、複数の CID-Keyed フォントとして使えるようになるはず。
    1. (unicode.ttf) /Adobe-Japan2-Unicode .openttcidfont
    [2000/3/27] 上記のような使い方をサポートしましたので、JIS補助漢字などが使えるようになりました。但し、同時に使うにはフォント名を区別する必要があります。しかもこれは、古めの TrueType で CID の種類の自動検出が失敗するフォントでもとにかく使えるようになったということ。具体的には、alias-*.sh のオプショナル形式を参考のこと。
  9. gs_cmap.ps において '(begin|end)rearrangedfont' が実装されていないので、結果的に、Tgif などで行われている「ローマ字とEUC-JPとのコンポジットフォント」が CID-Keyed フォントでは実現できません。これも現在対処予定です。JISパッチ版の Tgif には関係ありません。
  10. [2000/3/24] "(filename.ttc) 3 .openttcidfont" が失敗するフォントがあります。インデックスが 2 までなら正しく動作しています。要調査。
  11. ある繁体字のフォントが崩れます。他の TrueType の繁体字のフォントでは崩れなかったので、どこに原因があるのか不明。以下はその不具合の一例です。

Ghostscript 6 のリソースディレクトリを変更したい

GS 6 の /Resource ディレクトリを /usr/local/share/ghostscript/Resource とかに変更したいですよね。その場合、gs_res.ps/GenericResourceDir を以下のように修正します。
/GenericResourceDir (/usr/local/share/ghostscript/Resource/) readonly .forcedef
同様に、/Resource/Font ディレクトリも変更したいですよね。これも GS 6.01 の場合なら、gs_res.ps/FontResourceDir を以下のように修正すれば変更できます。
/FontResourceDir (/usr/local/share/ghostscript/Resource/Font/) readonly .forcedef
しかし、GS 6 以前だとちょっとバグがあってダメなんです。670行目あたりの
pop pop pop pop true exit
pop が5つあるものは4つに直しましょう。

Ghostscript 6 への CJK(中国語、日本語、韓国語) CID-Keyed フォントのインストール

GS 6 へ CID-Keyed フォントのインストールの方法について説明します。

まず、以下の CMap ファイルを ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ から取得します。

これらを GS の /Resource ディレクトリで展開します。以下は台湾の CID フォントについて説明します。
% cd /usr/local/share/ghostscript/Resource
% tar xvZf ac13.tar.Z
次に /Resource/CMap ディレクトリを作成し、展開した CMap ファイルac13/CMap/* をリンクしてしまいましょう。
% mkdir CMap
% cd CMap
% ln -s ../ac13/CMap/* .
そして、CID-Keyed フォントを置いておくディレクトリ /Resource/CIDFont と CMap を適用したフォントファイルを置いておくディレクトリ /Resource/Font を作成しておきます。
% cd /usr/local/share/ghostscript/Resource
% mkdir CIDFont
% mkdir Font
さて、例として以下の CID-Keyed フォントを ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/samples/ から取得し、/Resource/CIDFont に置いておきます。 以下では台湾の CID フォント MOEKai-Regular を例に説明します。

ここで拙作の CID フォントの簡易インストーラ install-cid-*.tar.gz/Resource ディレクトリに展開して下さい。

% cd /usr/local/share/ghostscript/Resource
% tar xvzf install-cid-20010208.tar.gz
MOEKai-Regular は ac13(Adobe-CNS1) なので、以下のように簡易インストーラのac13.sh を使って各種 CMap を適用したファイルを自動生成します。
% ac13.sh install MOEKai-Regular
すると /Resource/Font に以下のような CMap を適用したフォントのリソースファイルが生成されます。
%!PS-Adobe-3.0 Resource-Font
%%DocumentNeededResources: ETen-B5-H (CMap)
%%IncludeResource: ETen-B5-H (CMap)
%%BeginResource: Font (MOEKai-Regular-ETen-B5-H)
/MOEKai-Regular-ETen-B5-H
/ETen-B5-H /CMap findresource
[/MOEKai-Regular /CIDFont findresource]
composefont pop
%%EndResource
%%EOF
これで /MOEKai-Regular-ETen-B5-H などのフォント名で CID-Keyed フォント MOEKai-Regular が使えるようになります。

CJK CID-Keyed フォントのアンインストール

以下のコマンドで生成されたファイルが消去されます。
% ac13.sh uninstall MOEKai-Regular

Ghostscript 6 への CJK(中国語、日本語、韓国語) TrueType フォントのインストール

GS 6 へ CJK TrueType フォントのインストールの方法について説明します。但し、CJK TrueType フォントを CID-Keyed フォントとして使うので、冒頭のパッチとリソースファイルが必要です。そのリソースファイルを以下のように /Resource/TrueType に展開しておいて下さい。
% cd /usr/local/share/ghostscript/Resource
% mkdir TrueType
% cd TrueType
% tar xvzf cjkvttcidmap-0.91.tar.gz
はじめに、前述の「CID-Keyed フォントのインストール」の簡易インストーラinstall-cid-*.tar.gz/Resource ディレクトリに展開するところまで同様に行って下さい。

次に、/usr/local/share/fonts/truetype/ にある Abig5.ttf という台湾の TrueType フォントを例にして説明します。

GS の /Resource ディレクトリで以下のように alias-ac13.sh を実行します。

% cd /usr/local/share/ghostscript/Resource
% alias-ac13.sh install AcademyBIG5=Abig5.ttf
すると、/Resource/CIDFont/AcademyBIG5 に以下のようなファイルが生成され、
%!PS-Adobe-3.0 Resource-CIDFont
%%BeginResource: CIDFont (AcademyBIG5)
/AcademyBIG5
(/usr/local/share/fonts/truetype/Abig5.ttf) .openttcidfont
dup length dict begin {def} forall currentdict end
/CIDFont defineresource pop
%%EndResource
%%EOF
同時に、前章で説明した ac13.sh が内部で呼ばれ、以下のような CMap を適用したファイルが/Resource/Font に生成されます。
%!PS-Adobe-3.0 Resource-Font
%%DocumentNeededResources: CNS1-H (CMap)
%%IncludeResource: CNS1-H (CMap)
%%BeginResource: Font (AcademyBIG5-CNS1-H)
/AcademyBIG5-CNS1-H
/CNS1-H /CMap findresource
[/AcademyBIG5 /CIDFont findresource]
composefont pop
%%EndResource
%%EOF
これで /AcademyBIG5-CNS1-H などのフォント名で TrueType フォントを CID-Keyed フォントとして使えるようになります。

CJK TrueType フォントのアンインストール

以下のコマンドで生成されたファイルが消去されます。
% alias-ac13.sh uninstall AcademyBIG5

その他 alias-*.sh のオプショナル形式

フォント名にCIDの種類を指定してインストール
% alias-ac13.sh install Arial-Adobe-CNS1=arialuni.ttf

TTC(TrueType Collection)のインデックスを指定してインストール
% alias-ag13.sh install NSimSun=simsun.ttc,2

既に存在するCID-Keyedフォントに別名をつける
% alias-aj14.sh install Ryumin-Light=MS-Mincho

CIDからCodeへのマップファイルの種類を指定してインストール
% alias-aj14.sh install FA-Gothic,Adobe-Japan1-Unicode=FANGOT5.TTC

2つ以上のCID-Keyedフォントをインストール
% alias-ak12.sh install Batang=batang.ttc BatangChe=batang.ttc,2

テスト用 PostScript ファイル

テスト用の簡単な CJK PostScript ファイル

詳細テスト用の CJK PostScript ファイル

Ghostscript 6 で各国 TrueType フォントを使いたい

ここでは非CIDフォントについてのTipsをまとめておきます。

手順

Ghostscript で TrueType フォントを通常のフォント(非CIDフォント)として使うには、Fontmap.GS に以下のようなエントリを追加します。
/Georgia (/usr/local/share/font/truetype/Georgia.TTF) ;
これで /Georgia というフォントが使えるようになります。

エンコーディングの確認

以下は手持ちの TrueType フォントで各種エンコーディングで実際に表示してみた印字例です。ヘブライ語とタイ語については調査中。
Copyright (C) 2000-2002 Taiji Yamada, All rights reserved.