FontFallbacks.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text

'' フォールバックフォントは、アプリケーションで指定されたフォントには
'' 存在しないグリフを描画するために使用されるフォントです。
'' GcPdf は自動的に初期化されるフォールバックフォントファミリの
'' デフォルトリストを提供し、一般的なフォントにはグリフがない多くの
'' 言語のフォールバックとして使用するのに適した大きなフォントを含みます。
'' これらの自動的に追加されたフォールバックフォントファミリは、
'' FontCollection.SystemFonts 静的コレクションのメソッドを介して使用
'' できます。
'' 独自のフォールバックフォントを用意し、グローバル FontCollection.SystemFonts
'' によって管理されるフォールバックに追加することで、デフォルト
'' (およびシステム依存)の動作をカスタマイズできます。また、それらを 
'' FontCollection の独自のインスタンス、あるいは使用している特定の
'' フォントに追加することによって実現することもできます。
'' このように、フォールバックフォントの振る舞いを細かく調整し、完全に
'' システムに依存しないようにすることができます。
'' 
'' このサンプルでは、フォールバックの基本的な動作(システムフォール
'' バックのクリアと再追加)について説明します。
'' さらに、現在のシステムで見つかったフォールバックフォントのリストを
'' 出力します。
Public Class FontFallbacks
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' GcPdfDocument のセットアップ。
        Dim doc = New GcPdfDocument()
        Dim g = doc.NewPage().Graphics

        '' テキスト行を描画するためのヘルパー変数をいくつか設定します。
        Const margin = 36.0F
        '' テキストの挿入位置(デフォルト解像度は 72 dpi、1/2 インチの余白を使用)。
        Dim ip = New PointF(margin, margin)
        '' 標準フォントの1つでテキスト形式を初期化します。 標準フォントは最小であり、
        '' ラテン文字以外の文字に対しては非常に少数のグリフしか含まれません。
        Dim tf = New TextFormat() With {.Font = StandardFonts.Courier, .FontSize = 14}

        '' フォールバックフォントファミリのリストを取得します。
        Dim fallbacks As String() = FontCollection.SystemFonts.GetFallbackFontFamilies()

        '' グローバルフォールバックフォントリストをクリアします。
        FontCollection.SystemFonts.ClearFallbackFontFamilies()
        FontCollection.SystemFonts.ClearFallbackFonts()

        '' 現在、グローバルなフォールバックフォントは存在しないため、
        '' 標準フォントを使用して作成された日本語テキストでは、実際の日本語文字の代わりに
        '' 「空白ボックス」が作成されます。
        g.DrawString("A Japanese text that won't render: この日本語は表示されません", tf, ip)
        ip.Y += 36

        '' フォールバックフォントファミリの元のリストをグローバル SystemFonts に再追加します。
        FontCollection.SystemFonts.AppendFallbackFontFamilies(fallbacks)
        '' いくつかのシステムでは、デフォルトのシステムフォールバックは日本語の字形を
        '' 提供しない可能性があるので、独自のフォールバックを追加します:
        Dim arialuni = Font.FromFile(Path.Combine("Resources", "Fonts", "arialuni.ttf"))
        FontCollection.SystemFonts.AppendFallbackFonts(arialuni)

        '' フォールバックフォントが再び利用できるようになったので、適切なフォールバックが見つかると、
        '' 同じ日本語のテキストが正しくレンダリングされます。
        g.DrawString("Same text with fallbacks available: この日本語は表示されます", tf, ip)
        ip.Y += 36

        '' 最後に、すべてのフォールバックを列挙し、それぞれを使ってテストラインを出力します。
        Dim drawTestLine As Action(Of String) =
            Sub(fnt_ As String)
                Dim tf1 = New TextFormat() With {.FontName = fnt_}
                Dim tstr = $"{fnt_}: The quick brown fox jumps over the lazy dog."
                Dim s = g.MeasureString(tstr, tf1, doc.PageSize.Width - margin * 2)
                g.DrawString(tstr, tf1, New RectangleF(ip, s))
                ip.Y += s.Height * 1.5F
                If ip.Y > doc.Pages.Last.Size.Height - margin * 2 Then
                    g = doc.NewPage().Graphics
                    ip.Y = 36
                End If
            End Sub

        For Each fnt In fallbacks
            drawTestLine(fnt)
        Next
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class