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

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

        '' FontCollection を使用すると、ファミリ名でフォントを取得できます。
        Dim 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 Sans JP", False, False)
        g.DrawString($"Noto Sans: {tstr} (EUDCフォントはまだリンクされていません)", tf, ip)
        ip.Y += dy

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

        '' 1つの EUDC フォントを Noto Sans にリンク - これにより、Noto Sans で描画された文字列において、EUDC の文字はこのフォントで検索されます。
        Dim fnt = fc.FindFamilyName("Noto Sans JP")
        fnt.AddEudcFont(eudcF0)
        '' Noto Serif も同様に。
        fnt = fc.FindFamilyName("Noto Serif JP")
        fnt.AddEudcFont(eudcF1)
        '' 別の EUDC フォントを IPAゴシック にリンク。
        fnt = fc.FindFamilyName("IPAGothic")
        fnt.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 フォントはコレクションにないフォントにリンクできます。
        fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "VLADIMIR.TTF"))
        fnt.AddEudcFont(eudcF0)
        tf.Font = fnt
        g.DrawString($"VLADIMIR Font, Eudc0.tte をリンク: {tstr}", tf, ip)
        ip.Y += dy
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class