FontFromFile.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;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // この短いサンプルは、フォントをファイルから読み込んで、コード内でテキスト
    // のレンダリングに使用する方法を示しています。サンプルは、Resources/Fonts
    // フォルダに存在するフォントファイルGabriola.ttf および timesbi.ttf に依存
    // しています。
    // 
    // 注記1: Font.FromFile() を使用すると、実際のデータがオンデマンドでロード
    // されるため、通常は Font インスタンスがあまりにも多くの領域を占有することは
    // ありません。Font.FromArray() と Font.FromStream() メソッドを使用して作成
    // されたフォントでは状況が異なります。その場合、フォント全体がすぐにメモリに
    // 読み込まれます。フォントは依然としてオンデマンドでのみ解析されますが、
    // メモリ消費量はやや高いので、一般的には Font.FromFile() を使用するのが望ま
    // しいでしょう。
    // 
    // 注記2: PDF でテキストをレンダリングするために、前述の静的コンストラクタの
    // いずれかを使用して作成された異なるフォントインスタンスが使用される場合、
    // グリフが同じであったとしても、DsPdf はそれらが同じ物理フォントを表すことを
    // 知る方法がないため、各インスタンスは別個のサブセットを埋め込むことになります。
    // そのため、それぞれの物理フォントに対して1つの Font インスタンスが作成されて
    // いることを確認するか、FontCollection クラスを使用して必要なフォントを追加し、
    // TextFormat.FontName で指定することをお勧めします。
    public class FontFromFile
    {
        public int CreatePDF(Stream stream)
        {
            var gabriola = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "Gabriola.ttf"));
            if (gabriola == null)
                throw new Exception("Gabriola フォントを読み込めません");

            // 既存のフォントを利用してテキストを描画します。
            var tf = new TextFormat() { Font = gabriola, FontSize = 16 };
            var doc = new GcPdfDocument();
            var g = doc.NewPage().Graphics;
            g.DrawString($"{gabriola.FontFamilyName} で描画したサンプルテキスト", tf, new PointF(72, 72));
            // フォントサイズを変更することができます。
            tf.FontSize += 4;
            g.DrawString("The quick brown fox jumps over the lazy dog.", tf, new PointF(72, 72 * 2));
            // 太字または斜体ではないフォントで太字または斜体をエミュレートすることができます。その例です。
            tf.FontStyle = GCTEXT.FontStyle.Bold;
            g.DrawString("この行は、エミュレートされた太字のスタイルを使用して、同じフォントで印刷されます。", tf, new PointF(72, 72 * 3));
            // もちろんエミュレートされたフォントよりも、実際の太字/斜体フォントを使用するほうが優れています。
            // 最後に実際の太字の斜体フォントを得て、それと一緒に行を印刷します。
            var timesbi = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "timesbi.ttf"));
            tf.Font = timesbi ?? throw new Exception("timesbi フォントを読み込めません");
            tf.FontStyle = GCTEXT.FontStyle.Regular;
            g.DrawString($"{timesbi.FullFontName} で描画したサンプルテキスト", tf, new PointF(72, 72 * 4));
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}