第08回 PDF埋め込みフォントの概要

今回はPDFへのフォント埋め込みの概要~というかフォントについてです。

フォントファイルはいわゆるtrue type fontと、open type fontがあります。
true type fontは少し複雑なので、ここではopen type fontのみを扱うことにします。



フォントファイルというのは文字の「形」を収録したファイルです。
フォントファイルの中には複数の文字の「形」が収録されています。
あまりに当たり前な話ですが、これが埋め込みに際して重要になります。


「A」という文字は1番目の位置に収録されている
「B」という文字は2番目の位置に収録されている
「C」という文字は3番目の位置に収録されている
 ・
 ・
 ・
「を」という文字は999番目の位置に収録されている
「ん」という文字は1000番目の位置に収録されている

フォントを埋め込む際には、
このような"文字"とそれが何番目に収録されているかという対応表が必要になり、

埋め込むテキストはユニコードやshift-jisといった一般的な形式でPDF内に出力するのではなく、
この対応表に基づいた変換結果を入れる必要があります。
(例えば「ABC」という文字列を書き込む場合は「0x0001 0x0002 0x0003」という変換結果のバイナリを書き込みます)




実際に「対応表」を見てみることにします。

まずはフォントファイルの準備。
"C:Windows\Fonts\"フォルダーの中にある「MS ゴシック 標準」(ファイル名:msgothic.ttc)を適当なフォルダにコピーします。

このファイルはtrue type fontのため、open type fontに変換します。
オンラインで変換してくれるこのサイトで、output formatを「otf - OpenType font」として変換します。
https://www.fontconverter.org/
そして変換した結果できたopen type fontファイル「msgothic.otf」をダウンロード/保存します。

次に対応表を見るためのツールをダウンロード。
Microsoftが用意しているttfdumpというツールを利用します。
以下にある「fonttools.exe」をダウンロードし、この中にある「TTFDump.zip」を解凍すると「ttfdump.exe」があるので保存します。
https://www.microsoft.com/en-us/typography/tools.aspx
https://download.microsoft.com/download/f/f/a/ffae9ec6-3bf6-488a-843d-b96d552fd815/FontTools.exe

ついでにopen type fontの情報を見るためのツールもダウンロード。
以下にある「lcdf-typetools-w32」をダウンロードし、「otfinfo.exe」を解凍/保存します。
https://www.lcdf.org/type/index.html
ftp://akagi.ms.u-tokyo.ac.jp/pub/TeX/win32/lcdf-typetools-w32.tar.xz

これらの作業で集まった以下のファイルを同じフォルダに入れます。
・msgothic.otf
・ttfdump.exe
・otfinfo.exe

そして以下のようにしたbatファイルを実行。

otfinfo -i msgothic.otf > otf_info.txt
ttfdump.exe msgothic.otf -tcmap -nx  > otf_cmap.txt
pause


するとファイルが出力されます。
otf_info.txt を見ると、フォントの名前情報が。
otf_cmap.txt には変換表があります。
どちらもPDF埋め込みの際に必要になる情報です。

ユニコード以外からもフォントを扱えるように、変換表は複数入っているのが普通です。
この中から、Platform ID == 3、Specific ID == 1のものを抜き出します。

■otf_info.txt
Family:              MS Gothic				//フォントファミリー名
Subfamily:           Regular
Full name:           MS Gothic
PostScript name:     MS-Gothic				//フォント名
Version:             Version 5.01
Unique ID:           Microsoft:MS Gothic:2009
Trademark:           MS Gothic is a registered trademark of the Microsoft Corporation.
Copyright:           (C)2009 data:RICOH Co.,Ltd. typeface:RYOBI IMAGIX CO.
Vendor ID:           RICO
■otf_cmap.txt
		     Char 253 -> Index 451
		     Char 254 -> Index 449
		     Char 255 -> Index 440
  
Subtable  4.   Platform ID:   3				//Platform ID == 3 はWindows、Specific ID == 1 はユニコードを示す
               Specific ID:   1				//つまりこのセクションにあるのが対応表
               'cmap' Offset: 0x0000002C
	      ->Format:	4 : Segment mapping to delta values
		Length:		34880
		Version:	0
		segCount:	4358  (X2 = 8716)
		searchRange:	8192
		entrySelector:	12
		rangeShift:	524
		Seg   1 : St = 0000, En = 0000, D =      1, RO =     0, gId# = N/A
		Seg   2 : St = 000D, En = 000D, D =    -11, RO =     0, gId# = N/A
		Seg   3 : St = 0020, En = 007E, D =    -29, RO =     0, gId# = N/A
		Seg   4 : St = 00A0, En = 017F, D =    -62, RO =     0, gId# = N/A
		Seg   5 : St = 0192, En = 0193, D =    -80, RO =     0, gId# = N/A

		Seg 4353 : St = FDFC, En = FDFC, D =  16088, RO =     0, gId# = N/A
		Seg 4354 : St = FE45, En = FE46, D =  16016, RO =     0, gId# = N/A
		Seg 4355 : St = FF01, En = FF9F, D =  15830, RO =     0, gId# = N/A
		Seg 4356 : St = FFE0, En = FFE6, D =  15766, RO =     0, gId# = N/A
		Seg 4357 : St = FFE8, En = FFEE, D =  15765, RO =     0, gId# = N/A
		Seg 4358 : St = FFFF, En = FFFF, D =      1, RO =     0, gId# = N/A

		Which Means:
		   1. Char 0000 -> Index 1		//対応表開始
		   2. Char 000D -> Index 2		//ユニコードで0x000Dの文字は、2番目にあるという意味
		   3. Char 0020 -> Index 3		//ユニコードで0x0020の文字は、3番目にあるという意味
		      Char 0021 -> Index 4		//ユニコードで0x0021の文字は、4番目にあるという意味
		      Char 0022 -> Index 5
		      Char 0023 -> Index 6
		      Char 0024 -> Index 7
		      Char 0025 -> Index 8
		      Char 0026 -> Index 9
		      Char 0027 -> Index 10
		      Char 0028 -> Index 11
		      Char 0029 -> Index 12
		      Char 002A -> Index 13
		      Char 002B -> Index 14
		      Char 002C -> Index 15
		      Char 002D -> Index 16
		      Char 002E -> Index 17

		4356. Char FFE0 -> Index 15734
		      Char FFE1 -> Index 15735
		      Char FFE2 -> Index 15736
		      Char FFE3 -> Index 15737
		      Char FFE4 -> Index 15738
		      Char FFE5 -> Index 15739
		      Char FFE6 -> Index 15740
		4357. Char FFE8 -> Index 15741
		      Char FFE9 -> Index 15742
		      Char FFEA -> Index 15743
		      Char FFEB -> Index 15744
		      Char FFEC -> Index 15745
		      Char FFED -> Index 15746
		      Char FFEE -> Index 15747		//対応表終了
  
Subtable  5.   Platform ID:   3
               Specific ID:   10
               'cmap' Offset: 0x0000886C
	      ->Format:	12 : Segmented coverage (32 bit)
		Length:		55732
		Version:	0
		Seg   1 : startCharCode = 00000000, endCharCode = 00000000, startGlyphCode = 1
		Seg   2 : startCharCode = 0000000D, endCharCode = 0000000D, startGlyphCode = 2
		Seg   3 : startCharCode = 00000020, endCharCode = 0000007E, startGlyphCode = 3

ここまで情報が揃ったらフォントの埋め込み処理はできたも同然です。


カテゴリー「PDFを処理する(C#)」 のエントリー