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

namespace GcPdfWeb.Samples.Basics
{
    // GcPdf における文字書式設定の基本を紹介します。
    // 
    // GcPdf の文字書式設定は、GrapeCity.Documents.Text.TextFormat クラスを介して行われます。
    // 必要な書式設定オプションを持つそのクラスのインスタンスは、GcPdfで使用できるほとんどの
    // テキストレンダリングメソッド(DrawStringなど)に渡されます。
    // TextLayout/DrawTextLayout を使用して、同じ段落内の異なる
    // 文字書式のテキストを描画します。
    // TextRenderingMultiFormattedTextParagraphAlign、
    // ParagraphFormattingTextAlign も参照してください。
    public class CharacterFormatting
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            const float In = 72f, vStep = In / 2;
            PointF ip = new PointF(In, In);
            const string fontname = "Yu Gothic";

            // 1. TextFormat に設定する必要がある唯一の必須プロパティは Font です。
            TextFormat tf = new TextFormat() { FontName = fontname };

            g.DrawString(
                "1.常に TextFormat に設定する必要がある唯一の必須プロパティは Font です。\r\n" +
                "FontSize であってもオプションで、デフォルトは12ポイントです。", 
                tf, ip);
            ip.Y += vStep * 2;

            // 2. 標準的なフォントプロパティが利用できます。
            tf.Underline = true;
            tf.Strikethrough = true;
            tf.FontSize = 10;
            g.DrawString(
                "2.標準プロパティが使用可能です。下線と取り消し線をオンにし、FontSize を 10 に設定します。",
                tf, ip);
            ip.Y += vStep;

            // 3. TextFormat.FontStyle では、通常のフォントを使用して太字または斜体の
            // スタイルをエミュレートできます(BoldItalicEmulation も参照してください)。
            tf.Underline = tf.Strikethrough = false;
            tf.FontStyle = FontStyle.BoldItalic;
            tf.FontSize = 12;
            g.DrawString(
                "3.太字、斜体のフォントスタイルを設定するには TextFormat を使用します。",
                tf, ip);
            ip.Y += vStep;

            // 4. その他のプロパティには、前景色と背景色があります。
            tf.FontStyle = FontStyle.Regular;
            tf.ForeColor = Color.DarkSlateBlue;
            tf.BackColor = Color.PaleGreen;
            g.DrawString(
                "4. TextFormat.ForeColor と TextFormat.BackColor を使用してテキスト色を設定します。",
                tf, ip);
            ip.Y += vStep;

            // 5. 異なるテキストフォーマットを同じ段落に混在させることができます。
            // そのためには、TextLayout と GcPdfGraphics.DrawTextLayout を使用する必要があります。
            TextLayout tl = g.CreateTextLayout();
            tl.Append(
                "5.この段落が示すように、段落が TextLayout で構築されている場合、",
                new TextFormat() { FontName = fontname });
            tl.Append(
                "異なる段落の書式を同じ段落に",
                new TextFormat() { FontName = fontname, FontBold=true, BackColor = Color.PaleTurquoise });
            tl.Append(
                "簡単に混在させることができます。",
                new TextFormat() { Font = StandardFonts.HelveticaBoldItalic, ForeColor = Color.DarkOrange });
            tl.Append(
                "以下のような、さまざまなオプションが TextFormat で利用できます。",
                new TextFormat() { FontName = fontname, ForeColor = Color.DarkSlateBlue });
            tl.AppendLine();
            tl.Append(
                "GlyphAdvanceFactor は",
                new TextFormat() { FontName = fontname, FontStyle = FontStyle.BoldItalic, Underline = true });
            tl.Append(
                "グリフを広げたり、",
                new TextFormat() { FontName = fontname, GlyphAdvanceFactor = 1.5f, ForeColor = Color.BlueViolet });
            tl.Append(
                "狭めたりすることができます。",
                new TextFormat() { FontName = fontname, GlyphAdvanceFactor = 0.8f, ForeColor = Color.BlueViolet });
            tl.AppendLine();
            tl.Append(
                "TransverseOffset を設定して",
                new TextFormat() { FontName = fontname, FontStyle = FontStyle.BoldItalic, Underline = true });
            tl.Append(
                "ベースラインの下にあるグリフを下げる、",
                new TextFormat() { FontName = fontname, TransverseOffset = -5, ForeColor = Color.MediumVioletRed });
            tl.Append(
                "または上に上げることができます。",
                new TextFormat() { FontName = fontname, TransverseOffset = 5, ForeColor = Color.MediumVioletRed });
            tl.AppendLine();
            tl.Append(
                "さらに、特定フォントの機能を TextFormat.FontFeatures を通じて操作することも可能です。",
                new TextFormat() { Font = StandardFonts.Times, FontFeatures = new FontFeature[] { new FontFeature(FeatureTag.clig) } });

            // このサンプルでは、テキストレイアウトの最大幅を設定するだけですが、
            // 実際のアプリではおそらく、少なくとも MaxHeight を設定することになります。
            tl.MaxWidth = page.Size.Width - In * 2;
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, ip);
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}