ディーバ Blog

大阪発 C#の会社、株式会社ディーバの Blog です。

iTextSharp で外字を PDF に出力

少しだけ 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 としてアクセスするテクニックがあるようです。