EUDC.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // 独自の EUDC フォント(.tte)にて、私用領域(PUA)の Unicode 文字をレンダリングする方法を示します。
    public class EUDC
    {
        public int CreatePDF(Stream stream)
        {
            // EUDC コード文字と通常の文字(& と !)を組み合わせたテスト用文字列。0xE620 0xE621 0xE622 0xE624 amp; 0xE623 !
            const string tstr = "&!";
            // 設定。
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            var tf = new TextFormat() { FontSize = 14 };
            var rc = Common.Util.AddNote(
                "独自の EUDC フォント(.tte)を使用して、私用領域(PUA)の Unicode 文字をレンダリングする方法を示しています。\n" +
                "GrapeCity.Documents.Text.Fontは、EUDC .tte ファイルから作成され、" +
                "Font.AddEudcFont() メソッドを使用して1つ以上のフォントにリンクさせることができます。",
                page);
            const float dy = 36;
            var ip = new PointF(rc.X, rc.Bottom + dy / 2);

            // FontCollection を使用すると、ファミリ名でフォントを取得できます。
            var fc = new FontCollection();

            // グラフィックスの MeasureString/DrawString メソッドがフォールバックフォントを
            // 検出できるように、フォントコレクションをグラフィックスに割り当てます。
            g.FontCollection = fc;

            // 標準のフォントを FontCollection に登録します。
            fc.RegisterFont(Path.Combine("Resources", "Fonts", "NotoSerifJP-Regular.ttf"));
            fc.RegisterFont(Path.Combine("Resources", "Fonts", "NotoSansJP-Regular.ttf"));
            fc.RegisterFont(Path.Combine("Resources", "Fonts", "ipag.ttc"));

            // フォントコレクションにNoto Serifをフォールバックとして使用するように設定します。
            fc.AppendFallbackFonts(fc.FindFamilyName("Noto Serif JP"));

            // Noto Sans フォントを使用すると、適切なグリフが Noto Sans に存在しないため、テスト文字列が空の長方形としてレンダリングされます。
            tf.Font = fc.FindFamilyName("Noto Serif JP", false, false);
            g.DrawString($"Noto Serif: {tstr} (EUDCフォントはまだリンクされていません)", tf, ip);
            ip.Y += dy;

            // 2種類の EUDC フォントを読み込みます。
            var eudcF0 = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "Eudc0.tte"));
            var eudcF1 = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "Eudc1.tte"));

            // 1つの EUDC フォントを Noto Sans にリンク - これにより、Noto Sans で描画された文字列において、EUDC の文字はこのフォントで検索されます。
            var font = fc.FindFamilyName("Noto Sans JP");
            font.AddEudcFont(eudcF0);
            // Noto Serif も同様に。
            font = fc.FindFamilyName("Noto Serif JP");
            font.AddEudcFont(eudcF1);
            // 別の EUDC フォントを IPAゴシック にリンク。
            font = fc.FindFamilyName("IPAGothic");
            font.AddEudcFont(eudcF1);

            // 独自の EUDC フォントがリンクされているフォントを使用して、EUDC 文字列を描画します。
            tf.Font = fc.FindFamilyName("Noto Sans JP", false, false);
            g.DrawString($"Noto Sans, Eudc0.tte をリンク: {tstr}", tf, ip);
            ip.Y += dy;
            tf.Font = fc.FindFileName("NotoSerifJP-Regular.ttf");
            g.DrawString($"Noto Sans, Noto Serif 経由のフォールバック: {tstr}", tf, ip);
            ip.Y += dy;
            tf.Font = fc.FindFamilyName("IPAGothic");
            g.DrawString($"IPAGothic, Noto Serif をリンク: {tstr}", tf, ip);
            ip.Y += dy;
            tf.Font = fc.FindFamilyName("IPAGothic");
            g.DrawString($"IPAGothic, Eudc1.tte をリンク: {tstr}", tf, ip);
            ip.Y += dy;

            // FontCollection はファミリ名によるフォント検索のようないくつかのサービスを追加しますが、
            // EUDC フォントはコレクションにないフォントにリンクできます。
            font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "VLADIMIR.TTF"));
            font.AddEudcFont(eudcF0);
            tf.Font = font;
            g.DrawString($"VLADIMIR Font, Eudc0.tte をリンク: {tstr}", tf, ip);
            ip.Y += dy;
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}