FontCollection.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

'' このサンプルは、FontCollection クラスを作成、初期化、および使用する方法を示します。
'' FontCollection クラスは、フォントを管理し、GcPdf でテキストをレンダリングするときに
'' 使用する推奨される方法です。
'' 
'' GcPdf で FontCollection を使用する際に留意すべき主なポイントと推奨する手順は次のとおりです:
'' 
'' 1. FontCollection クラスのインスタンスを作成します。
''    FontCollection は静的クラスではありません。使用するインスタンスが必要です。
''    また、それは Font オブジェクトの標準的な .NET コレクションです。
''    そのため、通常のコレクション操作(Add、Insert、Remove など)が使用できます。
'' 
'' 2. 次のいずれかの方法を使用して、フォントコレクションにフォントを追加します。
''    - RegisterDirectory(): 指定されたディレクトリにあるすべてのフォントを登録
''    - RegisterFont(): 指定されたファイル内のフォントを登録
''    - Add(Font): 作成したフォントインスタンスを追加
''    ディレクトリやフォントをフォントコレクションに登録することは、高速かつ軽量な操作で
''    あることに注意してください。ディレクトリまたは個々のフォントが登録されている場合、
''    実際にフォントコレクションにはすべてのフォントデータが読み込まれるわけではありません。
''    代わりに、最小限の情報だけが読み込まれるため、必要なときにすばやく効率的にフォント
''    を検索して提供できます。
'' 
'' 3. 正しいフォントが見つかるように、フォントコレクションのインスタンスを
''    TextLayout.FontCollection(GcGraphics.MeasureString/DrawString を使用する場合は
''    GcGraphics.FontCollection)に割り当てます。
'' 
'' 4. テキストを描画する際のコードでは、フォント名(TextFormat.FontName、名前は正確に一致
''    する必要がありますが、大文字と小文字は区別されません)、フォント太字と斜体フラグ
''    (TextFormat.FontBold/FontItalic)を指定してフォントを選択します。要求されたフォント
''    の適切な太字/斜体のバージョンがコレクション内に見つかった場合は、そのフォントが使用
''    されます。それ以外の場合はフォントエミュレーションが適用されます。
'' 
'' 5. FontCollection のメソッドとプロパティはスレッドセーフなので、フォントコレクションが
''    一旦生成されると、セッションやアプリケーションのモジュール間でキャッシュして共有でき
''    ます。異なるスレッドから同時にフォントコレクションを変更したりアクセスしたりするとき
''    は、コレクションの状態のチェックとそのチェックのアクションの間で変更される可能性が
''    あるため、注意する必要があります。このような場合、FontCollection.SyncRoot プロパティ
''    が提供され、使用される必要があります。
'' 
''    以下のサンプルコードでは、上記で説明した内容を実装しています。
Public Class FontCollectionTest
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' FontCollection のインスタンスを作成します。
        Dim fc = New FontCollection()
        '' 指定したディレクトリのフォントを登録します。
        fc.RegisterDirectory(Path.Combine("Resources", "Fonts"))

        '' サンプルドキュメントを生成時にフォントコレクションを使用してフォントを提供。
        Dim doc = New GcPdfDocument()
        Dim page = doc.Pages.Add()
        Dim g = page.Graphics

        '' TextLayout/TextFormat がフォントコレクションを使用できるようにするには、
        '' そのように関連付ける必要があります。
        Dim tl = New TextLayout(72) With {.FontCollection = fc}

        '' フォントコレクションからいくつかの異なるフォントを使って文字列を描画します。
        Dim tf = New TextFormat() With {.FontName = "times new roman", .FontSize = 16}
        tl.Append("FontCollectionを使用したフォントの管理とテキストの描画" + vbCrLf + vbCrLf, tf)
        tf.FontSize = 12
        tl.Append("Text rendered using Times New Roman regular font." + vbCrLf, tf)
        '' フォントスタイル(太字または斜体)を設定すると、適切なフォントを検索するように
        '' フォントコレクションに指示されます(見つからない場合、エミュレーションが使用されます)。
        tf.FontItalic = True
        tl.Append("Text rendered using Times New Roman italic font." + vbCrLf, tf)
        '' テキスト形式は、テキストが追加されたときにテキスト実行に適用されるため、
        '' 同じ形式を再利用し、そのプロパティを変更して異なる形式のテキストを
        '' 描画することができます。
        tf.FontBold = True
        tl.Append("Text rendered using Times New Roman bold italic font." + vbCrLf, tf)
        tf.FontItalic = False
        tl.Append("Text rendered using Times New Roman bold font." + vbCrLf, tf)
        tf.FontName = "segoe ui"
        tl.Append("Text rendered using Segoe UI bold font." + vbCrLf, tf)
        tf.FontBold = False
        tl.Append("Text rendered using Segoe UI regular font." + vbCrLf, tf)

        '' ページレイアウトにページ設定を適用し、ページを描画します。
        tl.MaxWidth = page.Size.Width
        tl.MaxHeight = page.Size.Height
        tl.MarginAll = 72
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)

        '' GcGraphics.DrawString/MeasureString を使用している場合、GcGraphics によって内部的に作成された
        '' TextLayout は、フォントコレクション内の指定されたフォントを見つけることができます。
        g.FontCollection = fc

        '' GcGraphics.DrawString を使用して、FontCollection が一度設定されると、
        '' フォントコレクションがグラフィックスでも使用されることを示します。
        g.DrawString("Segoe UI bold を指定したテキスト - GcGraphics.DrawString() メソッドを使用した場合",
            New TextFormat() With {.FontName = "segoe ui", .FontBold = True, .FontSize = 10},
            New PointF(72, tl.ContentRectangle.Bottom + 12))
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class