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", "arial.ttf"))
        fc.RegisterFont(Path.Combine("Resources", "Fonts", "times.ttf"))
        fc.RegisterFont(Path.Combine("Resources", "Fonts", "ipag.ttc"))
        fc.RegisterFont(Path.Combine("Resources", "Fonts", "msgothic.ttc"))
        fc.RegisterFont(Path.Combine("Resources", "Fonts", "YuGothR.ttc"))

        '' フォントコレクションにMS Gothicをフォールバックとして使用するように指示します。
        fc.AppendFallbackFonts(fc.FindFamilyName("MS Gothic"))

        '' Arial フォントを使用すると、適切なグリフが Aria lに存在しないため、テスト文字列が空の長方形としてレンダリングされます。
        tf.Font = fc.FindFamilyName("Arial", False, False)
        g.DrawString($"Arial: {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 フォントを Arial にリンク - これにより、Arial で描画された文字列において、EUDC の文字はこのフォントで検索されます。
        Dim fnt = fc.FindFamilyName("Arial")
        fnt.AddEudcFont(eudcF0)
        '' MS Gothic も同様に。
        fnt = fc.FindFamilyName("MS Gothic")
        fnt.AddEudcFont(eudcF1)
        '' 別の EUDC フォントを Yu Gothic にリンク。
        fnt = fc.FindFamilyName("Yu Gothic")
        fnt.AddEudcFont(eudcF1)

        '' 独自の EUDC フォントがリンクされているフォントを使用して、EUDC 文字列を描画します。
        tf.Font = fc.FindFamilyName("Arial", False, False)
        g.DrawString($"Arial, Eudc0.tte をリンク: {tstr}", tf, ip)
        ip.Y += dy
        tf.Font = fc.FindFileName("times.ttf")
        g.DrawString($"Times, MS Gothic 経由のフォールバック: {tstr}", tf, ip)
        ip.Y += dy
        tf.Font = fc.FindFamilyName("MS Gothic")
        g.DrawString($"MS Gothic, Eudc1.tte をリンク: {tstr}", tf, ip)
        ip.Y += dy
        tf.Font = fc.FindFamilyName("Yu Gothic")
        g.DrawString($"Yu Gothic, Eudc1.tte をリンク: {tstr}", tf, ip)
        ip.Y += dy

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