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

namespace DsPdfWeb.Demos
{
    // このサンプルは、FontCollection クラスを作成、初期化、および使用する方法を示します。
    // FontCollection クラスは、フォントを管理し、DsPdf でテキストをレンダリングするときに
    // 使用する推奨される方法です。
    // 
    // DsPdf で 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
    {
        public int CreatePDF(Stream stream)
        {
            // FontCollection のインスタンスを作成します。
            var fc = new FontCollection();
            // 指定したディレクトリのフォントを登録します。
            fc.RegisterDirectory(Path.Combine("Resources", "Fonts"));

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

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

            // フォントコレクションからいくつかの異なるフォントを使って文字列を描画します。
            var tf = new TextFormat() { FontName = "times new roman", FontSize = 16 };
            tl.Append("FontCollectionを使用したフォントの管理とテキストの描画\n\n", tf);
            tf.FontSize = 12;
            tl.Append("Times New Roman regular を指定したテキスト \n", tf);
            // フォントスタイル(太字または斜体)を設定すると、適切なフォントを検索するように
            // フォントコレクションに指示されます(見つからない場合、エミュレーションが使用されます)。
            tf.FontItalic = true;
            tl.Append("Times New Roman italic を指定したテキスト \n", tf);
            // テキスト形式は、テキストが追加されたときにテキスト実行に適用されるため、
            // 同じ形式を再利用し、そのプロパティを変更して異なる形式のテキストを
            // 描画することができます。
            tf.FontBold = true;
            tl.Append("Times New Roman bold italic を指定したテキスト \n", tf);
            tf.FontItalic = false;
            tl.Append("Times New Roman bold を指定したテキスト \n", tf);
            tf.FontName = "segoe ui";
            tl.Append("Segoe UI bold を指定したテキスト \n", tf);
            tf.FontBold = false;
            tl.Append("Segoe UI regular を指定したテキスト \n", tf);
            tf.FontName = "IPA Gothic";
            tl.Append("IPAゴシック を指定したテキスト \n", tf);
            tf.FontBold = true;
            tl.Append("IPAゴシック 太字 を指定したテキスト \n", 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() { FontName = "segoe ui", FontBold = true, FontSize = 10 },
                new PointF(72, tl.ContentRectangle.Bottom + 12));

            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}