注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

guoyoooping的博客

audio,picture, text and video

 
 
 

日志

 
 

ghostscript中文打印经验  

2010-02-02 21:14:42|  分类: Linux: 折腾的总 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

[注意] 本文内容已经更新, 详情请参考
ghostscript中文打印经验(第2版), http://guoyoooping.blog.163.com/blog/static/13570518320144278259712/

#Author ypguo<guoyoooping@163.com>
#Date: 20090202
#Version 1.0

[关键字]ghostscript, 安装, 使用, postscript, Linux, 中文,  打印, pdf
[摘要]通常我们用的linux的打印系统都要用到ghostscript, 应用程序也基本上配置中文
支持, 但我在打印vim文档时还是碰到了问题. 借这个问题研究了一下ghostscript对CJK
字体的支持.
[目录] ghostscript中文打印经验.txt (Created by TxtBrowser)
    1. 问题的产生和解决
    .   1.1 问题描述
    .   1.2 关于8.63版本
    .   1.3 关于8.64版本
    2. ghostscript简介和支持中文
    3. 安装和卸载ghostscript
    .   3.1 安装ghostscript
    .   3.2 卸载ghostscript
    4. CID字体
    5. 如何设定字体别名
    .   5.1 映射CID-keyed字体
    .   5.2 映射TrueType字型
    6. 替代PDF所需要的CJK字型的特殊CIDFont名称
    7. 测试
    8. 参考资料

1. 问题的产生和解决

1.1 问题描述

大多数linux程序都为你配置好了ghostscript, 你只需要点击打印菜单就可以将文件输出
到打印机或者打到postscript文件. 在使用vim打印的时候遇到了点麻烦: 不能打印中文,
执行“gs tmp.p“后提示一堆 错误, 下面是有用的部分:

Error: /undefinedfilename in (MSungGBK-Light)
Operand stack:
   _CF0   UniGB-UTF8-H   MSungGBK-Light   CIDFont

从中可以看出大概是字体"MSungGBK-Light"没有定义, 经过半个月的博斗, 上网查资料,
看帮助文件, 冥思苦想, 终于解决了问题, 关于ghostscript的两个最新版本8.63和8.64有
不同的解决方法:

1.2 关于8.63版本

先说说ghostscript是怎么找到字体文件的. 用"gs -h"命令可以看到ghostscript默认的搜
索路径, 就中文字体的加载而言, ghostscript会到搜索路径里查到cidfmap文件, 从中读
到字体的映射, 再到相应的目录下找到相应的字体文件, ghostscript就能正常工作了.

版本8.63的问题很简单, 系统自带的truetype字体的名字是
"/usr/share/fonts/cjkunifonts-ukai/ukai.ttc", 但
/usr/share/ghostscript//conf.d/cidfmap_CN文件里写成了
"/usr/share/fonts/cjkunifonts-ukai/ukai.ttf", 将其修改过来就可以使用该truetype
字体了. 修改后的cidfmap文件如下:

cidfmap============================================================
/BousungEG-Light-GB    << /FileType /TrueType /Path (/usr/share/fonts/cjkunifonts-uming/uming.ttc) /CSI [(GB1) 4] >> ;
/GBZenKai-Medium    << /FileType /TrueType /Path (/usr/share/fonts/cjkunifonts-ukai/ukai.ttc) /CSI [(GB1) 4] >> ;

/MSungGBK-Light        /BousungEG-Light-GB ;
/Adob-GB1        /BousungEG-Light-GB ;
/SimSun            /BousungEG-Light-GB ;
/SimHei            /BousungEG-Light-GB ;
===================================================================

cygwin下的配置文件"/usr/local/share/ghostscript/8.64/Resource/Init/cidfmap":

cidfmap============================================================
/Ryumin-Medium /ShinGo-Bold ;
/MS-Mincho << /FileType /TrueType /Path (C:/WINDOWS/fonts/msmincho.ttc) /SubfontID 0 /CSI [(Japan1) 3] >> ;
/Ryumin-Light /MS-Mincho ;

/Batang << /FileType /TrueType /Path (C:/WINDOWS/fonts/batang.ttc) /SubfontID 0 /CSI [(Korea1) 3] >> ;
/Gulim << /FileType /TrueType /Path (C:/WINDOWS/fonts/gulim.ttc) /SubfontID 0 /CSI [(Korea1) 3] >> ;
/Dotum << /FileType /TrueType /Path (C:/WINDOWS/fonts/gulim.ttc) /SubfontID 2 /CSI [(Korea1) 3] >> ;
/HYSMyeongJo-Medium /Batang ;
/HYRGoThic-Medium /Gulim ;
/HYGoThic-Medium /Dotum ;

/SimSun << /FileType /TrueType /Path (C:/WINDOWS/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
/SimHei << /FileType /TrueType /Path (C:/WINDOWS/fonts/simhei.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/STSong-Light /SimSun ;
/STHeiti-Regular /SimHei ;
===================================================================

1.3 关于8.64版本

即使把相cidfmap里错误的字体名称修改过来, 8.64版本没有提供默认的cidfmap文件, 可
以从8.63拷贝一份过来, 也可以直接参考上节提供的样本文件, 完了gs依然提示没有找到
相应的字体文件, 这就非常令人迷惑了, 明明该有的文件都有了, 也放在gs的搜索路径了
, 为什么还是提示找不到字体文件呢? 在命令行执行"gs -h", 显示的一大段消息中应该有
下面的两行:

. : %rom%Resource/ : %rom%lib/
 /usr/local/share/ghostscript/8.64/Resource/Init :

第一行应该可以解释上面的问题, gs只在"%rom%Resource/ : %rom%lib/"路径下搜索, 事
实上没有搜索到下面的搜索路径, 难怪配置文件没有起作用. "%rom%"是个什么东东? 为什
么gs会只在其中搜索呢? 我也不太懂, 只知道ROM file system(romfs)是一种只读的档案
系统.

那么怎么修正这个问题呢? 因为我不懂%rom%, 所以简单的解决办法就是禁用它, 在编译
ghostscript调用Makefile之前, 打开Makefile文件, 找到"COMPILE_INITS=1"这一行, 把
它修改为0, 就可以禁用只读文件系统了 所有的字体文件系统将从操作系统的文件系统加
载.安装之后执行"gs -h"不再提示类似"%rom%Resource/ : %rom%lib/"这个的搜索路径了
[7].

2. ghostscript简介和支持中文

ghostscript是Postscript语言解释器和pdf生成工具. 先来说说通常我们用的unix和
linux系统打印的过程. 在unix底下, 所有的打印到最后几乎都是以postscript(.ps)的格
式输出. ps格式其实根本是一种(专为畫圖寫字而设计的)程序语言, 非常强大, 也因而解
释起来要花很多功夫. 如果你的打印机支持硬件直接打印.ps文档, 当然是最方便的了; 然
而多数的低级打印机硬件都看不懂复杂的ps语言, 所以要靠ghostscript將postscript 文
档翻译成各种打印机认得的低级打印机控制指令. 你几乎可以说它是"所有无法直接打印ps
文档的打印机"的驱动程序. 除了打印, ghostscript还提供以下的功能:

    * 计算机打印机使用的栅格化图像处理器(RIP), 例如, 行打印机Daemon的输入
    过滤器.

    * 以PostScript和PDF阅览器使用的栅格化图像处理器(RIP)引擎.

    * 文件格式转换器, 如PostScript和PDF转换器.

    * 一般用途的编程环境.

Ghostscript最初是以商业软件形式在PC市场上销售, 并称之为“GoScript”. 但由于速度
太慢(半小時一版A4), 销量极差. 后来有心人买下了版权, 并改在Linux上开发, 成为了今
日的Ghostscript.  现在已经从Linux版本移植到其他操作系统, 如其他Unix、Mac OS X、
VMS、Windows、 OS/2和Mac OS classic.

已经写出几个图形用户界面(GUI)用于让用户在屏幕上观看PostScript 或PDF文件, 可以上
下卷动、向前翻页、向后翻页、缩放文字, 而且还能打印一页或多个页面.

    * Ghostview, 在Unix/X11下运行.
    * GSView, 在Windows和OS/2下运行.

Postscript有自己的一套字体的规范, 比如常见的Type1字体, 和ttf字体很不一样. 为了
在Postscript中使用ttf字体, Postscript规定要将ttf字体包装成Postscript字体(详见下
段). ghostscript 8.x 号称直接支持ttf字体, 这是一种私有扩展. 但由于没有相应的文
档, 没人知道这种支持到底什么意思. 况且ghostscript 支持动态包装ttf字体, 很难想像
为什么有人会去用非标准的直接支持. 总而言之你是被表象(名字)给骗了.

Postscript包装的ttf字体有两种, 一种适用于西文字体(<256字符)称为Type42字体,
ghostscript很早就支持;一种适用于cjk大字符集字体称为Type2 CID字体. 感谢gs-cjk
项目所做得开创性工作, 使得ghostscript可以动态将ttf字体包装成Type2 CID字体, 我们
得以使用ttf字体. 这些工作在ghostscript 7.x 被正始采纳. 目前所有新的发布一般都对
cjk ttf字体做了相应的设置, 这就是为什么你可以直接使用而无问题.

3. 安装和卸载ghostscript

3.1 安装ghostscript

安装ghostscript比较简单, configure, make, make install就OK了.

3.2 卸载ghostscript

ghostscript的Makefile没有提供uninstall目标, 好在linux没有所谓的注册表, 只要手动
删除下列安装的文件即可:

    1)/usr/local/bin目录下的下列文件: gsbj gsdj gsdj500 gslj gslp gsnd
    bdftops dumphint dvipdf eps2eps font2c pdf2dsc pdf2ps pdfopt pf2afm
    pfbtopfa printafm ps2ascii ps2epsi ps2pdf ps2pdf12 ps2pdf13 ps2pdf14
    ps2pdfwr ps2ps ps2ps2 wftopfa fixmswrd.pl lprsetup.sh pj-gs.sh pv.sh
    sysvlp.sh unix-lpr.sh

    2)/usr/local/share/ghostscript文件夹.

4. CID字体

CID字体包含了大量远东字体(中, 日, 韩语),和普通字体一样, 都是Postscript的资源,
但不能直接使用. CID字体必须和CMAP资源绑定在一起, 由CMAP定义特殊的处理. 这也使得
不同的编码方式可以重用字体集.

旧版的ghostscript需要安装CMAP, 即把Adobe 公司所提供的CMap档案解压在Resource子目
录里, 8.63版本里已经自动安装好了很多CMAP资源, 用户应该不用再安装了. 查询相应的
CID字体是否被安装可以gs环境下执行下面的命令:

    /CIDFont-CMap findfont

其中, CIDFont是CID字体的名字, CMAP是同一类字符集的CMAP资源的名字, 比如
"/Resource/CMap/"文件夹"Adobe-GB1-"打头的文件对应的是简体中文(GB1),
"Adobe-CNS1" 打头的文件对应的是繁体中文. 最后一位对应版本号, 简体中文有 0-4 五
个值. 大体上 0和1对应GB2312, 2和3 对应GBK, 4对应GB18030. 具体用那一个取决字体包
含多少字符, 如文鼎的gbsn00lp.ttf 应该用0, simsun.ttc应该用2, SimSun18030则应该
用4.  解释器将根据 CID名字和CMAP资源组建新的字体. 例如我的机器上已经安装了
MSungGBK-Light字体, 执行命令将显示下面的结果:

GS<1>/MSungGBK-Light-Adobe-GB1-4 findfont Loading a TT font from
/usr/share/fonts/cjkunifonts-uming/uming.ttc to emulate a CID font
BousungEG-Light-GB ... Done.

你可以由下列网址下载繁体中文, 韩文和日文的 CID-keyed 字型:

        ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/samples/

将他们放在Resource/CIDFont目录当中, 如果事先没有该目录, 就先创建一个.


说实话这一段我还没有理解, 试验也没有成功. 先摘抄在这里, 以后有时间慢慢研究.

5. 如何设定字体别名

假设你的系统上已经有可用的CID字体或CJK的truetype字体, 可以将该字体映射成别的名
字, 相当于安装了一种新的字体, 有两种方法可用:

5.1 映射CID-keyed字体

注: CID字体没有安装成功.

如果要将位於 "fontfile"(完整的路径名称)的CID-keyed Type1字型, 设定成名称为
"NAME"的CID-keyed 字型, 则如下:

        /NAME        (fontfile) ;

如果是 O'Reilly FTP 网站所提供的 CID-keyed Type1 字型, 我们亦提供一个在
CIDFnmap 之中的 "CIDFnmap.Ore" 选项, 用下列的方式把它加进来:

        (CIDFnmap.Ore) .runlibfile

5.2 映射TrueType字型

    /Substituted << keys&values >> ;

例如:

/Simsun << /FileType /TrueType /Path (/path/of/your/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;

cidfmap 文件中对格式有详悉的解释, 很简单. 我这里只想说一下最后方括号中的两个值
, 第一个称为ordering, 对简体中文永远是(GB1), 繁体是(CNS1). 第二个称为
supplement, 相当于版本号, 简体中文有 0-4 五个值. 大体上 0和1对应GB2312, 2和3 对
应GBK, 4对应GB18030. 具体用那一个取决字体包含多少字符, 如文鼎的gbsn00lp.ttf 应
该用0, simsun.ttc应该用2, SimSun18030应该用4.

注: gedit可以打印, 因为它和上面说的这一套, 和ghostscript没半点关系. GNOME有自己
的打印支持函数, KDE 有自己的, OO也有自己的. 这些库的功能大同小异, 它们和其它桌
面的程序一样直接读取ttf字体, 用freetype渲染成点阵, 然后自己生成一种被称之为
Type3 Postscript字体, 将其嵌入最终生成的ps文件中. 这就是为什么你总是可以正确打
印.

6. 替代PDF所需要的CJK字型的特殊CIDFont名称

注: 此部分引自参考资料, 我也没有理解透, 没有测试过.

当 gs 解译 PDF 文件时, 如果没有办法加入 PDF 所需要的 CID-keyed 字型, 而且
CIDFnmap 或 Resource/CIDFont 根本不包含CID-keyed 字型的项目, 那麽 ghostscript
就不能够找到一个适当的字型来代替 CID-keye 字型.

为了解决这个问题, PDF 所需代替 CJK 字型的特殊 CID字型名称 (/Adobe-CNS1,
/Adobe-GB1, /Adobe-Japan1, /Adobe-Japan2 and /Adobe-Korea1) 仍然必须先行定义,
例如在 CIDFnmap 加入以下各项:

        /Adobe-CNS1        /MOESung-Regular        ;
        /Adobe-GB1        /BousungEG-Light-GB        ;
        /Adobe-Japan1        /WadaMin-Regular        ;
        /Adobe-Japan2        /WadaMin-RegularH        ;
        /Adobe-Korea1        /Munhwa-Regular                ;

详细步骤, 请参考附加的档案 "CIDFnmap.CJK".

另外, 一般在CJK PostSript 常用的 CID 字型别名, 也附在其中, 如果没有这些
CID-keyed 字型, 也请参考 "CIDFnmap.CJK"的内容, 定义你所使用字型的别名.


一般我们制作ps,或者pdf的时候, 如果遇到CJK字符, 我们一般选择嵌入(embeded, 对于
TeX来说是设置 download), 这样即使客户端没有对应的字库, 也能正常显示. 但是, 由于
CJK字符数目的巨大, 所以往往导致文件太大. 一般1万字左右的文档生成的 ps/pdf文件往
往有 10M左右. 对于网上传输是及其不方便的. 所以我们可以考虑想常用的Latin字体一样
, 对CJK字符制作非嵌入式的ps/pdf文档. ghostscript 7.0/8.0已经支持了这一特性. 如
果正确设置是可以显示非嵌入式的CJK字体的.

下面我分别就 Redhat linux 9.0/GNU Ghostscript 7.05和 windows/GNU Ghostscript
8.15两种方式进行详细叙述. 如果您的版本有所出入, 不保证能完全成功.

A. Redhat linux 9.0/GNU Ghostscript 7.05

1)修改 ghostscript 的配置文件, 加入自定义的字体. 采用windows下的simsun.ttf
simhei.ttf simli.ttf simkai.ttf也可以采用其他的字体. 将字体拷贝到
/usr/share/fonts/zh_CN/TrueType/目录下

修改 /usr/share/ghostscript/7.05/lib/CIDFnmap.ARP,增加以下几行
/GBK-Song (/usr/share/fonts/zh_CN/TrueType/simsun.ttf) ;
/GBK-Hei (/usr/share/fonts/zh_CN/TrueType/simhei.ttf) ;
/GBK-Kai (/usr/share/fonts/zh_CN/TrueType/simkai.ttf) ;
/GBK-Li (/usr/share/fonts/zh_CN/TrueType/simli.ttf) ;
/STSong-Light /GBK-Song ;
/STFangsong-Light /GBK-Song ;
/STHeiti-Regular /GBK-Hei ;
/STKaiti-Regular /GBK-Kai ;
/Adobe-GB1 /GBK-Song ;
修改lib/gs_res.ps文件中资源的位置(如果是系统默认安装, 已经设置好了)
设定 /FontResourceDir 为ghostscript字体所在目录
设定 /GenericResourceDir 为resource 字体所在目录.
如果你的系统是ghostscript8以上的版本,请参考下面的windows/GNU Ghostscript 8.15的配置

2)windows/GNU Ghostscript 8.15 修改 Ghostscript 安装目录下的lib/CIDfmap 填加如
下内容. 第一部分是表示字体名, 如果你缺少什么字体, 可以在此添加.

/Adobe-GB1 << /FileType /TrueType /Path (C:/WINNT/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
/GBK-Song << /FileType /TrueType /Path (C:/WINNT/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
/GBK-Hei << /FileType /TrueType /Path (C:/WINNT/fonts/simhei.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/GBK-Li << /FileType /TrueType /Path (C:/WINNT/fonts/simli.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/GBK-Kai << /FileType /TrueType /Path (C:/WINNT/fonts/simkai.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/STSong-Light << /FileType /TrueType /Path (C:/WINNT/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
/STFangsong-Light << /FileType /TrueType /Path (C:/WINNT/fonts/simfang.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/STHeiti-Regular << /FileType /TrueType /Path (C:/WINNT/fonts/simhei.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/STKaiti-Regular << /FileType /TrueType /Path (C:/WINNT/fonts/simkai.ttf) /SubfontID 0 /CSI [(GB1) 2] >> ;
/BousungEG-Light << /FileType /TrueType /Path (C:/WINNT/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
/GBZenKai-Medium << /FileType /TrueType /Path (C:/WINNT/fonts/simsun.ttc) /SubfontID 0 /CSI [(GB1) 2] >> ;
修改lib/gs_res.ps文件中资源的位置(如果是系统默认安装, 已经设置好了)
设定 /FontResourceDir 为ghostscript字体所在目录
设定 /GenericResourceDir 为resource 字体所在目录.

3)简单测试文件 test.ps

!PS-Adobe-3.0

/testshow {
x y moveto
/Times-Roman findfont 10 scalefont setfont show
findfont 10 scalefont setfont
(中文字体测试镕基) % <---- sample Chinese text here
show /y y 12 sub def
} def

/x 100 def /y 700 def

/GBK-Song-H (GBK-Song–H ) testshow
/GBK-Song-GB-H (GBK-Song–GB-H ) testshow
/GBK-Song-GB-EUC-H (GBK-Song–GB-EUC-H ) testshow
/GBK-Song-GBK-H (GBK-Song–GBK-H ) testshow
/GBK-Song-GBK-EUC-H (GBK-Song–GBK-EUC-H ) testshow
/GBK-Song-GBKp-H (GBK-Song–GBKp-H ) testshow
/GBK-Song-GBKp-EUC-H (GBK-Song–GBKp-EUC-H ) testshow
/GBK-Song-GBK2K-H (GBK-Song–GBK2K-H ) testshow
/GBK-Song-GBK2K-EUC-H (GBK-Song–GBK2K-EUC-H ) testshow
/GBK-Song-GBT-H (GBK-Song–GBT-H ) testshow
/GBK-Song-GBT-EUC-H (GBK-Song–GBT-EUC-H ) testshow
/GBK-Song-GBTpc-H (GBK-Song–GBTpc-H ) testshow
/GBK-Song-GBTpc-EUC-H (GBK-Song–GBTpc-EUC-H ) testshow
/GBK-Song-GBpc-H (GBK-Song–GBpc-H ) testshow
/GBK-Song-GBpc-EUC-H (GBK-Song–GBpc-EUC-H ) testshow

showpage
%%Trailer
%%EOF
可以讲上面的字体部分换成你要测试的字体名称.
4)全面测试
GNU ghostscript 7.0版本的安装目录下的examples/CJK/目录下的
gscjk_ag.ps : 排版显示
和all_ag1.ps: 所有GB-1 CID字体的显示
分别用ggv(linux) gsview(win32)浏览, 看能否正常显示.

7. 测试

我们提供下列档案测试安装在源代码文件的子目录 "examples/cjk"之下:

        gscjk_ac.ps        简单繁体中文测试档
        gscjk_ag.ps        简单简体中文测试档
        gscjk_aj.ps        简单日文测试档
        gscjk_ak.ps        简单韩文测试档
        all_ac1.ps        完整的 Adobe CNS1 测试档
        all_ag1.ps        完整的 Adobe GB1 测试档
        all_aj1.ps        完整的 Adobe Japan1 测试档
        all_aj2.ps        完整的 Adobe Japan2 测试档
        all_ak1.ps        完整的 Adobe Korea1 测试档
        iso2022.ps        检测全部 CJK 列印的执行档

首先如下测试:

      % gs gscjk_ac.ps

8. 参考资料

[1]ghostscript程序自带帮助文档, 在我的机器上路径为
/usr/local/share/ghostscript/8.64/doc/Use.htm

[2]在gs6.51上使用CJK TTF, CIDFnmap, MDRC和GC修补档案, suzuki toshiya
<mpsuzuki@hiroshima-u.ac.jp>等编写, 林志伟 Lim Chee Wooi <cwlimno1@arc.net.my>
中文翻译, 来自 :http://www.linuxeden.com/forum/viewthread.php?tid=59106

[3]ghostscript8 对CJK字体的支持设置, 作者未知, 来自:
http://milton.bloghome.cn/posts/103265.html

[4]维基百科词条: Ghostscript, 来自: http://zh.wikipedia.org/wiki/Ghostscript

[5]有关字形/中文, 朝陽科技大學 資訊管理系 洪朝貴, 来自
http://people.ofset.org/~ckhung/b/gnu/font.php

[6]The Linux Printing HOWTO 中文版: Ghostscript, 来自:
http://man.chinaunix.net/linux/how/Printing-HOWTO-10.html

[7][gs-devel] Additional Fonts in Gs 8.62, 来自:
http://www.ghostscript.com/pipermail/gs-devel/2008-October/007983.html
  评论这张
 
阅读(14181)| 评论(5)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017