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フォルダに NotoSerif-Regular.ttf と NotoSerif-BoldItalic.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)
        {
            const string sample = "The quick brown fox jumps over the lazy dog.";
            const string fnRegular = "NotoSerif-Regular.ttf";
            const string fnBoldItalic = "NotoSerif-BoldItalic.ttf";

            var fRegular = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", fnRegular)) ??
                throw new Exception($"{fnRegular} フォントを読み込めません");

            // 読み込んだフォントを利用してテキストを描画します。
            var tf = new TextFormat() { Font = fRegular, FontSize = 12 };
            var doc = new GcPdfDocument();
            var g = doc.NewPage().Graphics;
            g.DrawString($"Font {fRegular.FontFamilyName}, size {tf.FontSize}: {sample}", tf, new PointF(18, 72));
            // フォントサイズを変更することができます。
            tf.FontSize += 2;
            g.DrawString($"Font {fRegular.FontFamilyName}, size {tf.FontSize}: {sample}", tf, new PointF(18, 72 * 2));
            // 通常のフォントで太字や斜体のスタイルをエミュレートすることできます。
            tf.FontStyle = GCTEXT.FontStyle.BoldItalic;
            g.DrawString($"Font {fRegular.FontFamilyName}, emulated Bold Italic: {sample}", tf, new PointF(18, 72 * 3));
            // もちろんエミュレートされたフォントよりも、実際の太字/斜体フォントを使用するほうが優れています。
            // 最後に実際の太字の斜体フォントを得て、それと一緒に行を印刷します。
            var fBoldItalic = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", fnBoldItalic)) ??
                throw new Exception($"{fnBoldItalic} フォントを読み込めません");
            tf.Font = fBoldItalic;
            tf.FontStyle = GCTEXT.FontStyle.Regular;
            g.DrawString($"Font {fBoldItalic.FontFamilyName}, real Bold Italic: {sample}", tf, new PointF(18, 72 * 4));
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}