首頁 > 軟體

Linux下的GMT中文支援

2020-06-16 17:56:55

原生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的中文設定沒有問題。

需要說明如下幾點:

  • 這裡僅僅以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*

成圖效果如下

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.*

成圖效果如下

可移植性的一些測試

  • 本機:用vi開啟PS檔案,中文正常顯示;
  • 本機:gs檢視正常;
  • 本機:ps2raster轉換為PDF,用evince、zathura檢視正常;
  • 本機:ps2pdf轉換為PDF,用evince、zathura檢視正常;

由於目前無其他機器可用,因而暫時不測試可移植性。

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-07/120635.htm


IT145.com E-mail:sddin#qq.com