2021-05-12 14:32:11
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_CN和FAPIcidfmap.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;
- 字型檔案似乎只能是ttc或ttf格式的,當然修改引數也有可能可以使用其他格式的字型;
- 由於Linux下中文字型並不統一,所以要注意檢查組態檔中的字型檔案路徑是否正確;
CMap
CMap位於/usr/share/ghostscript/9.07/Resource/CMap目錄下,可以看到其中有很多檔案,CMap檔案的具體含義不知。暫且留在這裡。只需要知道有UniGB-UTF8-H和GB-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
相關文章