今回は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のものを抜き出します。
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
ここまで情報が揃ったらフォントの埋め込み処理はできたも同然です。