少しだけ iTextSharp と日本語外字を扱ったのでメモ。
DirectContent を使う場合
外字ファイルを指定した BaseFont オブジェクトを生成します。DirectContent.ShowTextAligned メソッドを使うと自由な位置にテキストを出力できますが、指定できるフォントがひとつのため外字しか出力できません。
外字ファイル EUDC.TTE をコピーして拡張子を TTF へリネームすると扱えるようです。
TechPress » iTextSharpで外字を利用する方法 を参考にしました。
//using iTextSharp.text; //using iTextSharp.text.pdf; //using System; //using System.IO; //using System.Linq; //using System.Text; private static void Sample1() { var eudcPath = "EUDC.TTF"; File.Copy(@"c:\Windows\Fonts\EUDC.TTE", eudcPath, true); // 外字ファイルをコピー・リネーム var eudcBaseFont = BaseFont.CreateFont(eudcPath, BaseFont.IDENTITY_H, true); var doc = new Document(); var writer = PdfWriter.GetInstance(doc, new FileStream("sample1.pdf", FileMode.Create)); doc.Open(); var cb = writer.DirectContent; cb.BeginText(); cb.SetFontAndSize(eudcBaseFont, 12); cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "外字テキスト", 100, 100, 0); cb.EndText(); doc.Close(); }
Phrase を使う場合
通常のテキストと外字テキストでフォントの指定を変えた Phrase オブジェクトを生成します。
ゆめみるうみそら 夢見海空 » itextSharpで日本語外字の対応 を参考にしました(ほとんどそのままです)。
//using iTextSharp.text; //using iTextSharp.text.pdf; //using System; //using System.IO; //using System.Linq; //using System.Text; private static void Sample2() { var normalFont = new Font(BaseFont.CreateFont(@"c:\Windows\Fonts\msgothic.ttc,0", BaseFont.IDENTITY_H, true), 12, Font.NORMAL, new BaseColor(0, 0, 0)); var eudcPath = "EUDC.TTF"; File.Copy(@"c:\Windows\Fonts\EUDC.TTE", eudcPath, true); // 外字ファイルをコピー・リネーム var eudcFont = new Font(BaseFont.CreateFont(eudcPath, BaseFont.IDENTITY_H, true), 12, Font.NORMAL, new BaseColor(0, 0, 0)); var doc = new Document(); var writer = PdfWriter.GetInstance(doc, new FileStream("sample2.pdf", FileMode.Create)); doc.Open(); var p = CreatePhrase("外字を含むテキスト", normalFont, eudcFont); doc.Add(p); doc.Close(); } private static Phrase CreatePhrase(string s, Font normalFont, Font eudcFont) { var p = new Phrase(); foreach (var c in s) { var buf = Encoding.GetEncoding("Shift_JIS").GetBytes(c.ToString()); var code = BitConverter.ToUInt16(buf.Reverse().ToArray(), 0); var font = (code >= 0xF000 && code <= 0xFFFC) ? eudcFont : normalFont; p.Add(new Chunk(c, font)); } return p; }
フォント フォルダーをエクスプローラーで開く
フォントフォルダー(通常 c:\Windows\Fonts)をエクスプローラーで開くと、特殊な表示になってしまい、実ファイルを参照できません。
ファイルを参照したい場合、パスを \\コンピューター名\c$\Windows\Fonts としてアクセスするテクニックがあるようです。