少しだけ iTextSharp と日本語外字を扱ったのでメモ。
DirectContent を使う場合
外字ファイルを指定した BaseFont オブジェクトを生成します。DirectContent.ShowTextAligned メソッドを使うと自由な位置にテキストを出力できますが、指定できるフォントがひとつのため外字しか出力できません。
外字ファイル EUDC.TTE をコピーして拡張子を TTF へリネームすると扱えるようです。
TechPress » iTextSharpで外字を利用する方法 を参考にしました。
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で日本語外字の対応 を参考にしました(ほとんどそのままです)。
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 としてアクセスするテクニックがあるようです。