Linux下的GMT中文支持


原生GMT是不支持中文的,想要让GMT支持中文,需要进行一番配置。想要理解整个问题,需要对PostScript、CID字体有更深刻的理解,这未免有些过于复杂。所以这篇博文只介绍一些基本的原理,不一定准确但是却够用。

修改配置这个事情本身不难,麻烦的是不同的发行版对ghostscript的打包方式不同,不同的ghostscript版本之间也会有一些差异。这里列出我在使用的系统信息,对于其他发行版以及gs版本,也有一些参考意义。

  • 操作系统:CentOS 7.0
  • ghostscript:9.07
  • GMT:4.5.12或5.1.1(以4.5.12为例)

准备工作

安装gs

对于大多数发行版而言,gs都是默认安装的。相关的文件位于/usr/share/ghostscript目录下。除此之外,还需要安装简体中文配置文件。

不同的发行版中,中文配置文件所在的包是不同的:

CentOS 7:

$ sudo yum install ghostscript-chinese-zh_CN

CentOS 6:

$ sudo yum install cjkuni-fonts-ghostscript

Ubuntu 14.04:

$ sudo apt-get install poppler-data

Ubuntu 12.04:

$ sudo apt-get install gs-cjk-resource

安装完相应的包之后,中文配置文件所在的目录也不同,下面统称为conf.d 目录:

  • CentOS 6、7:/usr/share/ghostscript/conf.d
  • Ubuntu 12.04、14.04: /etc/ghostscript/cidfmap.d/90gs-cjk-resource-gb1.conf

安装GMT

这步就不用再多说了。安装后的GMT位于/opt/GMT-4.5.12,其中与字体有关的文件为/opt/GMT-4.5.12/share/pslib/PS_font_info.d

使gs支持中文

下文的说明中,所有路径以CentOS发行版为准。

cidfmap

进入conf.d目录下,有文件cidfmap.zh_CN(该目录下还有CIDFnmap.zh_CNFAPIcidfmap.zh_CN,不管) ,其内容为:

/BousungEG-Light-GB << /FileType /TrueType /Path (/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
/GBZenKai-Medium    << /FileType /TrueType /Path (/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
/MSungGBK-Light     /BousungEG-Light-GB ;
/Adobe-GB1      /BousungEG-Light-GB ;

其中的细节可能看不懂,但是可以大概总(xia)结(cai)如下:

  • 第一行定义了字体名为/BousungEG-Light-GB,对应的字体文件为/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc,也就是文泉驿正黑;
  • 第二行定义了字体名为/GBZenKai-Medium,对应的字体文件也是文泉驿正黑;
  • 第三行和第四行分别定义了字体名/MSungGBK-Light/Adobe-GB1,这两种都对应于/BousungEG-Light-GB,相当于给字体定义了别名。

关于这个文件需要说的几点是:

  • 字体名是任意的,比如可以把字体名取为/ABC
  • 字体文件似乎只能是ttcttf格式的,当然修改参数也有可能可以使用其他格式的字体;
  • 由于Linux下中文字体并不统一,所以要注意检查配置文件中的字体文件路径是否正确;

CMap

CMap位于/usr/share/ghostscript/9.07/Resource/CMap目录下,可以看到其中有很多文件,CMap文件的具体含义不知。暂且留在这里。只需要知道有UniGB-UTF8-HGB-EUC-H这两个CMap即可。

测试gs对中文字体的支持

Linux的中文字体比较少,可能很多人都会将Windows下的中文字体复制到Linux下使用。假设已经将Windows下的中文字体复制到/usr/share/fonts/winfonts/目录下,对gs的配置文件cidfmap.zh_CN做一些修改,使gs在Linux下可以使用Windows中文字体:

% cidfmap.zh_CN的原内容保持不变
/BousungEG-Light-GB << /FileType /TrueType /Path (/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
/GBZenKai-Medium    << /FileType /TrueType /Path (/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
/MSungGBK-Light     /BousungEG-Light-GB ;
/Adobe-GB1      /BousungEG-Light-GB ;

% 新增Windows字体的支持
/STSong-Light << /FileType /TrueType /Path (/usr/share/fonts/winfonts/simsun.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
/STFangsong-Light << /FileType /TrueType /Path (/usr/share/fonts/winfonts/simfang.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;
/STHeiti-Regular << /FileType /TrueType /Path (/usr/share/fonts/winfonts/simhei.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;
/STKaiti-Regular << /FileType /TrueType /Path (/usr/share/fonts/winfonts/simkai.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;

用编辑器新建一个PS文件(是的,PS文件其中就是纯文本,可以直接用编辑器编辑!),名为gs_test.ps,其内容为:

%! PS-Adobe-3. 0
/STSong-Light--UniGB-UTF8-H findfont 20 scalefont setfont
150 400 moveto
(Song Typeface 宋体) show

/STFangsong-Light--UniGB-UTF8-H findfont 20 scalefont setfont
150 375 moveto
(Fangsong Typeface 仿宋体) show

/STHeiti-Regular--UniGB-UTF8-H findfont 20 scalefont setfont
150 350 moveto
(Hei Typeface 黑体) show

/STKaiti-Regular--UniGB-UTF8-H findfont 20 scalefont setfont
150 325 moveto
(Kai Typeface 楷体) show

showpage
%%Trailer
%%EOF

用gs查看该PS文件,若正确显示中文如下图,则表明gs的中文配置没有问题。

gs-chinese

需要说明如下几点:

  • 这里仅仅以Windows字体为例,对于其他中文甚至日韩字体来说,方法类似;
  • PS文件中的中文字体为CIDFont--CMap,这里CMap选择的是UniGB-UTF8-H,在Windows下似乎应该选择GB-EUC-H,尚不清楚原理;

使GMT支持中文

修改配置文件

打开GMT中文配置文件/opt/GMT-4.5.12/share/pslib/PS_font_info.d,在文件最后加入如下语句(以Windows字体为例):

STSong-Light--UniGB-UTF8-H  0.700    1
STFangsong-Light--UniGB-UTF8-H  0.700    1
STHeiti-Regular--UniGB-UTF8-H   0.700   1
STKaiti-Regular--UniGB-UTF8-H   0.700   1

第一列为字体名,第二列为字母A的高度,第三列与编码有关。

查看GMT当前支持的字体

pstext -L命令查看GMT当前的字体配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ pstext -L
Font #  Font Name
------------------------------------
0   Helvetica
1   Helvetica-Bold
...    ......
32  Palatino-BoldItalic
33  ZapfChancery-MediumItalic
34  ZapfDingbats
35 STSong-Light--UniGB-UTF8-H
36 STFangsong-Light--UniGB-UTF8-H
37 STHeiti-Regular--UniGB-UTF8-H
38 STKaiti-Regular--UniGB-UTF8-H

其中0-34为GMT/gs默认支持的西文字体,35至38为新添加的中文字体。

GMT中文测试

GMT4测试脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
gmtset HEADER_FONT 35

pstext -R0/7/0/7 -JX6i/6i -B1/1:."GMT中文支持": -P > cn.ps <<EOF
1.5 5 35 0 35 LM GMT宋体
1.5 4 35 0 36 LM GMT仿宋
1.5 3 35 0 37 LM GMT黑体
1.5 2 35 0 38 LM GMT楷体
EOF

rm .gmt*

成图效果如下

gmt4-chinese

GMT5测试脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
gmt gmtset FONT_TITLE 40p,35,black

gmt pstext -R0/7/0/7 -JX6i/6i -Bafg -B+t"GMT中文支持" -F+a+c+f -P > gmt5_cn.ps << EOF
3.5 5 0 LM 45p,35,red   GMT宋体
3.5 4 0 LM 45p,36,blue  GMT仿宋
3.5 3 0 LM 45p,37,black GMT黑体
3.5 2 0 LM 45p,38,green GMT楷体
EOF

rm gmt.*

成图效果如下

gmt5-chinese

可移植性的一些测试

  • 本机:用vi打开PS文件,中文正常显示;
  • 本机:gs查看正常;
  • 本机:ps2raster转换为PDF,用evince、zathura查看正常;
  • 本机:ps2pdf转换为PDF,用evince、zathura查看正常;

由于目前无其他机器可用,因而暂时不测试可移植性。

本文永久更新链接地址

相关内容