(home)

replacecjkfonts,cjkps2pdf (旧replacejfonts, jps2pdf, replacekochi)

gs-cjkの成果が取り込まれたgnu-gs-7.0xや,より新しいafpl-gs-8.xxでは, CIDフォントを埋め込んだpdfを生成することができます.欧文も含め,未だに 処理するpsによってはビットマップフォントになってしまう場合もありますが, かなり`綺麗な'pdfを作れるようになったことは確かです.

後はAcrobat Readerが代替可能なフォントを埋め込まないようにすることがで きればよいのですが,gsを直接修正するのは大変なので,とりあえず一旦埋め 込まれたCIDフォントを置き換えることで実現しようというのが,このページ の目的です.

以前に公開していたスクリプトでは,日本語のみに対応した処理になっていま したが,gs-cjkプロジェクトの山田さんがCJKに対応した replacecjkfonts.plというスクリプトを提供してくださいました.これに伴い, 各スクリプトの名前を変更し,処理を山田さんのアイディアと最近の修正をあ わせた形で変更しました.

なお,パッチのあたったgnu-gs-7.0xや,afpl-gs-8.11では,NeverEmbedとい う機能によって,このページにあるスクリプトを使わずにフォントを埋め込ま ないpdfを作ることができます(細かいことについては後述します).

目次

更新情報

インストールと使い方

基本

以下のスクリプトをダウンロードして使います.簡単な使い方は,

$ perl replacecjkfonts.pl --help
$ perl cjkps2pdf.pl --help

などとすれば見ることができます.

Debianユーザの方へ:小宮さんがパッケージを用意して下さっています. Debian GNU/Linuxのある生活 をご覧下さい.

replacecjkfonts.pl

処理可能なファイルは,gnu-gs-7.05以降/afpl-gs-8.00以降でCIDフォント を埋め込んだファイルです.テストはしていませんが,山田さんから頂いた ものと基本的に同じ処理をしているので,gs-cjkの出力に対しても動作する はずです.このperlスクリプトをダウンロードし,以下のように使います.

$ perl replacecjkfonts.pl in.pdf out.pdf

フォント名の対応は,スクリプトの最初の方にあります.ここに書か れていないフォントを使っている場合は,適宜追加してください. 変換するフォントを限定したい場合は,次のようにフォント名を指定します (注意:replacejfonts.plの時とは意味が異なります).

$ perl replacecjkfonts.pl Foo-A Foo-B Foo-C in.pdf out.pdf

埋め込まれたCIDフォントのメトリックの情報は,通常は取り除かれますが, 次のようにオプションを指定すると残すことができます.

$ perl replacecjkfonts.pl --keepmetrics in.pdf out.pdf

きっちりとファイルをパースしているわけではないので,ファイルによって はうまく動作しないかもしれません.とりあえず角藤さんが公開されている 東風フォントを使ったPDFの例 などは変換できます.

cjkps2pdf.pl

replacecjkfonts.plのロジックをそのまま利用した,psからpdfへの変換スク リプトです.以下のように使います.

$ perl cjkps2pdf.pl in.ps out.pdf

dvipdfm(x)と一緒に使いたい場合は,次のようにします.

$ dvipdfm -D "perl cjkps2pdf.pl --dvipdfm --papersize a0 %i %o" foo.dvi

フォント名の対応は,replacecjkfonts.plと同様,スクリプトの最初の方 に書かれているので,適宜修正してください.利用できるオプションは次の 通りです.

--fixbbox
epsのバウンディングボックスをgsのbboxデバイスを利用して修正します.
--fixdvips
古いdvipsを使った場合や,最近のdvipsでも-Ppdfを指定しなかった場合, pdfになったときに罫線が汚くなる問題を修正します.
--keepmetrics
メトリックを残します(replacecjkfonts.plと同様のオプションです).
--dvipdfm
dvipdfm(x)の-Dオプションで使う際に指定します.
--papersize p
用紙のサイズを指定します.デフォルトはa4です.pに指定できるのは gsで指定できる用紙です.
--gs cmd
ghostscriptのコマンド名を指定します.デフォルトはWindows上では gswin32c,それ以外ではgsとなります.
--guessfonts, --afplgs8/--noafplgs8
古いオプションで,無視されます.

細かい話

gsのインストール

以下,状況がややこしくて,少々不親切な解説になっています.あまり詳しく ない方は,他のウェブページを先に参照して,一通りのインストールをしてか ら,改めて読んでみることをお勧めします.また,pdfやgsに関する最新の情 報は, TeX Q & A で議論されることが多いので,参照してください.

NeverEmbedはあるけれど?

以下で解説するように,最近のgsではNeverEmbedという仕組みがうまく動作す るようになってきたので,このページで紹介しているスクリプトを使わなくて も,フォントが埋め込まれていないpdfを作ることが出来るようになりました.

スクリプト経由の良い点は,Acrobat Readerによる代替フォントが適切になる ような置き換えがやりやすいことです(いずれ,これも解決すると思います が…).興味のある方は,実際にそれぞれのやり方でpdfを作ってみて, Acrobat Readerで開いてみてください.フォントの情報を確認すると,いろい ろ違うことがわかります.

Windowsの場合

Windows用のgnu-gs-7.07およびafpl-gs-8.54のバイナリは,いずれも 角藤さんがWINAPIによる表示の強化を行なった形で配布されています (W32TeXCID Font in GS). これらのうち,特にgs7.07については,ダウンロードからの一通りの流れを含 んだ形で,奥村さんが解説されています (Windowsへのインストール).

注:以下,古い記述です.後で整理します.

解説にあるように,CIDフォントをTrueTypeフォントで代用することはpdfの生 成にはあまり向きません.psの表示だけに限ればWINAPIによって綺麗な表示が できるので(-dWINKANJIの指定のことです),CIDFnmap (gnu-gs-7.07)や cidfnmap (afpl-gs-8.11)にはCIDフォントを指定するほうがよいでしょう.こ こで,まっとうなCIDフォントを持っていればよいのですが,そうでない場合, 完成度の高かった東風フォント (My Linux 日本語化計画) のCID版 (東風明朝CID/OpenType化キット) が現在は入手できないことが問題になります.

これに対し,小川さんが,グリフを置き換えたダミーフォントを作っておられ ます (kochidum.tar.gz[qa:19845]を参照). 表示には適しませんが,あまり凝った処理をしていないpsが対象であれば, pdfの作成には十分なものです.参考までに,このフォントのいわゆる半角文 字の部分を少しだけ変えたものを,次に置いておきます.

kochidum-modified.zip

このアーカイブ内のKochiMin-DumおよびKochiGo-Dumを/Resource/CIDFont (/Resourceの実際の位置はインストールの仕方によって変わります)にコピー し,CIDFnmapやcidfnmapに次のような記述をします.

/Ryumin-Light         /KochiMin-Dum                   ;
/GothicBBB-Medium     /KochiGo-Dum                    ;
/HeiseiMin-W3         /Ryumin-Light                   ;
/HeiseiKakuGo-W5      /GothicBBB-Medium               ;

この状態で,ps2pdfを使うとダミーフォントが埋め込まれたpdfができ, それをreplacecjkfonts.plで処理すると,ダミーフォントが取り除かれたpdfを 得ることができます(これを一気にやるのがcjkps2pdf.plです).また,このペー ジにあるスクリプトを使う際は,角藤さんが CID Font in GS で解説されている方法で,実行ファイルを作っておくと便利です.

なお,afpl-gs-8.11では,gs8.11/lib/ps2pdfwrの最後の部分を次のようにす ることで,ps2pdfによる変換でも,フォントが埋め込まれないようにすること ができます(実際は1行です).

gswin32c $OPTIONS -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "-sOutputFile=$outfile" $OPTIONS
-c '.setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
/Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold
/Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /KochiMin-Dum /KochiGo-Dum]>>
setdistillerparams' -f "$infile"

Linuxの場合

ここではgnu-gs-7.07についてだけ述べます.gsの基本的なインストールにつ いては奥村さんの GNU Ghostscript 7.07 on Linux を参照してください.

注:以下,古い記述です.後で整理します.

注:山田さんのページ (Welcome to ~taiji at gyve) にあるパッチを適用したgsを使うと,次に書いてあることをしなくても,東風 代替フォントを用いるだけで,ps2pdfによるフォントを埋め込まない変換を行 なうことができるようになります.問題の背景や設定については,小川さんの 解説(東風問題[qa:21231]) を参照してください.

フォントの設定については,Windowsの場合と基本的な理屈は同じです が,WINAPIのような設定はないので,表示の場合とpdfを作る場合とで CIDFnmapを切り替える必要があります.つまり,表示には例えば 東風代替フォント を使い,pdfの生成にはダミーCIDフォント (kochidum-modified.zip) を使うというわけです.

まず,fontsの下にkochi-mincho-subst.ttfおよびkochi-gothic-subst.ttfを, /Resouce/CIDFontの下にKochiMin-DumおよびKochiGo-Dumを置きます. CIDFnmapの内容は,奥村さんの解説にあるように次のようにします.

/Ryumin-Light         (kochi-mincho-subst.ttf)        ;
/GothicBBB-Medium     (kochi-gothic-subst.ttf)        ;
/HeiseiMin-W3         /Ryumin-Light                   ;
/HeiseiKakuGo-W5      /GothicBBB-Medium               ;

さらに,CIDFnmap.ps2pdfwrというファイルを作り,内容は次のようにします.

/Ryumin-Light         /KochiMin-Dum                   ;
/GothicBBB-Medium     /KochiGo-Dum                    ;
/HeiseiMin-W3         /Ryumin-Light                   ;
/HeiseiKakuGo-W5      /GothicBBB-Medium               ;

そして,ps2pdfwrの最後を次のように書き換えます(実際は1行です).

exec gs $OPTIONS -q -dNOPAUSE -dBATCH -sCIDFONTMAP=CIDFnmap.ps2pdfwr -sDEVICE=pdfwrite 
"-sOutputFile=$outfile" $OPTIONS -c .setpdfwrite -f "$infile"

これで,ps2pdfを使う場合にCIDFnmap.ps2pdfwrが参照されます(注:山田さ んから上の指定方法を教えていただきました.以前に書いてあった gs_cidfn.psの変更は必要ありません).cjkps2pdf.plを使う場合は,スク リプト中で-sDEVICE=pdfwriteという文字列を検索して,その前あたり に-sCIDFONTMAP=CIDFnmap.ps2pdfwrを加えてください.

なお,パッチを適用したgnu-gs-7.07では,ps2pdfwrの最後を次のようにする ことで,ps2pdfによる変換でもフォントが埋め込まれないようにすることがで きます(実際は1行です).

exec gs $OPTIONS -q -dNOPAUSE -dBATCH -sCIDFONTMAP=CIDFnmap.ps2pdfwr -sDEVICE=pdfwrite
"-sOutputFile=$outfile" $OPTIONS -c '.setpdfwrite <</NeverEmbed [/Courier /Courier-Bold
/Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique
/Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol
/ZapfDingbats /Ryumin-Light /GothicBBB-Medium]>> setdistillerparams' -f "$infile"

ここでは,上に書いた設定にあわせた記述をしていますが,このps2pdfwrに対 するパッチも,山田さんのページにあります.

作者

中丸 幸治