トップ «前の日記(2013年05月21日) 最新 次の日記(2013年06月25日)» 編集

Masa's blog

検索キーワード:

2013年06月23日 Linux(ghostscript, ps2pdf)で、Eudc.TTE(外字 PUA)を使ったPDFを作成する方法 [長年日記]

_ Eudc.TTEをMS-WindowsからLinuxに持って来る

Slackware-14.0で色々試してみた。

# cp /mnt/MS-Windows/WINDOWS/Fonts/Eudc.TTE /usr/share/fonts/TTF/eudc.ttf

Linux側での拡張子は.ttfにしておくこと。

xlib経由でのアクセスのための設定を行う。

# cd /usr/share/fonts/TTF/
# mkfontscale -e /usr/X11R6/lib/X11/fonts/encodings -e /usr/X11R6/lib/X11/fonts/encodings/large
# mkfontdir -e /usr/X11R6/lib/X11/fonts/encodings -e /usr/X11R6/lib/X11/fonts/encodings/large

mkfontscaleで/usr/share/fonts/TTF/fonts.scaleが生成される。mkfontdirで/usr/share/fonts/TTF/fonts.dirが生成される。fonts.scaleやfonts.dirを手で編集している場合は、編集内容がスッ飛ぶので注意すること。

fontconfig経由でのアクセスのための設定を行う。

# fc-cache -f -v

ここまでの設定で、

$ xfd -fn "-misc-eudc.ttf-medium-r-normal--0-0-0-0-p-0-iso10646-1"

で、外字フォントを画面で確認出来たり、OpenOffice|LibreOffice上で、[挿入(I)], [記号と特殊文字(P)], [フォント(F)]からEUDCを選択して外字フォントを利用できる状態になっている。

_ CMapファイルの作成

さて、ここからが肝心のghostscript対応となる。

Eudc.TTEのコード範囲(Unicodeでの、U+E000からU+F8FFまで)のUTF-8とCIDとの対応テーブル(CMap)を作成するのだが、/usr/share/ghostscript/9.05/Resource/CMap/Identity-UTF16-HというCMapファイル(こちらはUTF-16とCIDの対応テーブル。たぶん1対1の対応なのだが...)があるので、これを雛型にする。

begincidrangeの内容を手書きするのは大変なので、プログラムで生成する。UTF-8 - ウィキペディア - Wikipediaを参考。

#include <stdio.h>
main()
{
	unsigned int i, start, base1, base2, base3, byte1, byte2, byte3;

	base1 = 0xe0;
	base2 = 0x80;
	base3 = 0x80;
	for (i = 0xe000; i <= 0xf8ff; i++){
		byte1 = ((i >> 12) & 0xf) | base1;
		byte2 = ((i >> 6) & 0x3f) | base2;
		byte3 = (i & 0x3f) | base3;
		if (byte3 == 0x80){
			printf("<%02x%02x%02x> ", byte1, byte2, byte3);
			start = i;
		}else if (byte3 == 0xbf){
			printf("<%02x%02x%02x> %d\n", byte1, byte2, byte3, start);
		}
	}
}

上記のプログラムの出力を雛型に組み込んで、多少ごにょごにょして以下のCMapをでっちあげた。

/usr/share/ghostscript/9.05/Resource/CMap/PUA-UTF8-H

% Copyright (C) 2003 Artifex Software.  All rights reserved.
%
% This software is provided AS-IS with no warranty, either express or
% implied.
%
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
%
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.
%
% $Id$
% PUA-UTF8-H CMap
% An identity mapping of UTF8 codes to CIDs.
%
% ----------------------------------------------------------------------
% This is created on Slackware-14.0 by Masahiko Ito.
% This is based on Identity-UTF16-H.
%
% This is cmap file for Eudc.TTE created in MS-Windows.
% I assume Eudc.TTE has font images for PUA(Private User Area : 6400 chars).
% Unicode U+E000           - U+F8FF
% UTF-8   0xee8080         - 0xefa3bf
% CID     57344(0xe000)    - 63743(0xf8ff)
%
% "Masahiko Ito"<m-ito@myh.no-ip.org>
% ----------------------------------------------------------------------
%

/CIDInit /ProcSet findresource begin

12 dict begin

begincmap

/CIDSystemInfo 3 dict dup begin
  /Registry (Artifex) def
  /Ordering (Unicode) def
  /Supplement 0 def
end def

/CMapName /PUA-UTF8-H def
/CMapVersion 1.000 def
/CMapType 1 def

/UIDOffset 0 def
% No XUID yet obtained.

/WMode 0 def

1 begincodespacerange
  <EE8080>   <EFA3BF>
endcodespacerange

100 begincidrange
<ee8080> <ee80bf> 57344
<ee8180> <ee81bf> 57408
<ee8280> <ee82bf> 57472
<ee8380> <ee83bf> 57536
<ee8480> <ee84bf> 57600
<ee8580> <ee85bf> 57664
<ee8680> <ee86bf> 57728
<ee8780> <ee87bf> 57792
<ee8880> <ee88bf> 57856
<ee8980> <ee89bf> 57920
<ee8a80> <ee8abf> 57984
<ee8b80> <ee8bbf> 58048
<ee8c80> <ee8cbf> 58112
<ee8d80> <ee8dbf> 58176
<ee8e80> <ee8ebf> 58240
<ee8f80> <ee8fbf> 58304
<ee9080> <ee90bf> 58368
<ee9180> <ee91bf> 58432
<ee9280> <ee92bf> 58496
<ee9380> <ee93bf> 58560
<ee9480> <ee94bf> 58624
<ee9580> <ee95bf> 58688
<ee9680> <ee96bf> 58752
<ee9780> <ee97bf> 58816
<ee9880> <ee98bf> 58880
<ee9980> <ee99bf> 58944
<ee9a80> <ee9abf> 59008
<ee9b80> <ee9bbf> 59072
<ee9c80> <ee9cbf> 59136
<ee9d80> <ee9dbf> 59200
<ee9e80> <ee9ebf> 59264
<ee9f80> <ee9fbf> 59328
<eea080> <eea0bf> 59392
<eea180> <eea1bf> 59456
<eea280> <eea2bf> 59520
<eea380> <eea3bf> 59584
<eea480> <eea4bf> 59648
<eea580> <eea5bf> 59712
<eea680> <eea6bf> 59776
<eea780> <eea7bf> 59840
<eea880> <eea8bf> 59904
<eea980> <eea9bf> 59968
<eeaa80> <eeaabf> 60032
<eeab80> <eeabbf> 60096
<eeac80> <eeacbf> 60160
<eead80> <eeadbf> 60224
<eeae80> <eeaebf> 60288
<eeaf80> <eeafbf> 60352
<eeb080> <eeb0bf> 60416
<eeb180> <eeb1bf> 60480
<eeb280> <eeb2bf> 60544
<eeb380> <eeb3bf> 60608
<eeb480> <eeb4bf> 60672
<eeb580> <eeb5bf> 60736
<eeb680> <eeb6bf> 60800
<eeb780> <eeb7bf> 60864
<eeb880> <eeb8bf> 60928
<eeb980> <eeb9bf> 60992
<eeba80> <eebabf> 61056
<eebb80> <eebbbf> 61120
<eebc80> <eebcbf> 61184
<eebd80> <eebdbf> 61248
<eebe80> <eebebf> 61312
<eebf80> <eebfbf> 61376
<ef8080> <ef80bf> 61440
<ef8180> <ef81bf> 61504
<ef8280> <ef82bf> 61568
<ef8380> <ef83bf> 61632
<ef8480> <ef84bf> 61696
<ef8580> <ef85bf> 61760
<ef8680> <ef86bf> 61824
<ef8780> <ef87bf> 61888
<ef8880> <ef88bf> 61952
<ef8980> <ef89bf> 62016
<ef8a80> <ef8abf> 62080
<ef8b80> <ef8bbf> 62144
<ef8c80> <ef8cbf> 62208
<ef8d80> <ef8dbf> 62272
<ef8e80> <ef8ebf> 62336
<ef8f80> <ef8fbf> 62400
<ef9080> <ef90bf> 62464
<ef9180> <ef91bf> 62528
<ef9280> <ef92bf> 62592
<ef9380> <ef93bf> 62656
<ef9480> <ef94bf> 62720
<ef9580> <ef95bf> 62784
<ef9680> <ef96bf> 62848
<ef9780> <ef97bf> 62912
<ef9880> <ef98bf> 62976
<ef9980> <ef99bf> 63040
<ef9a80> <ef9abf> 63104
<ef9b80> <ef9bbf> 63168
<ef9c80> <ef9cbf> 63232
<ef9d80> <ef9dbf> 63296
<ef9e80> <ef9ebf> 63360
<ef9f80> <ef9fbf> 63424
<efa080> <efa0bf> 63488
<efa180> <efa1bf> 63552
<efa280> <efa2bf> 63616
<efa380> <efa3bf> 63680
endcidrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end

%%EndResource
%%EOF

_ cidfmapへの追加

/usr/share/ghostscript/9.05/Resource/Init/cidfmapへ以下の行を追加する。

/Eudc                           << /FileType /TrueType /Path (eudc.ttf) /CSI [(Artifex) (Unicode) 0] >> ;

これで、環境周りの設定は完了!

_ postscriptの記述方法

超テキトウなpsファイルの例。もちろんエンコーディングはUTF-8で。

上記の環境設定で、外字フォントとして、/Eudc-PUA-UTF8-Hが指定できるようになっている。

%!PS-Adobe-3.0

% 描画開始位置への移動
100 100 moveto

% 一般的なフォントの指定
/Ryumin-Light-UniJIS-UTF8-H findfont
20 scalefont
setfont

% 文字列の描画
(外字を含まない文字列) show

% 外字フォント(Eudc.TTF)の指定
/Eudc-PUA-UTF8-H findfont
20 scalefont
setfont

% 外字で出来た文字列の描画
(外字のみの文字列) show

showpage

このpsファイルをgsコマンドで表示すれば、外字も含めて正常に表示できるし、もちろん、ps2pdfで作成したPDFファイルも正常に表示される。