CharacterFormatting.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // 演示 GcDocs.Pdf 中字符格式化的基础知识。
    // 
    // GcDocs.Pdf 中的字符格式是通过 GrapeCity.Documents.Text.TextFormat 类完成的。
    // 具有所需格式选项的该类的实例
    // 被传递给 GcDocs.Pdf 中可用的大多数文本渲染方法(例如 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;
            var ip = new PointF(In, In);

            // 1. 必须在 TextFormat 上设置的唯一强制属性是 Font:
            var tf = new TextFormat() { Font = StandardFonts.Times };

            g.DrawString("1. 必须始终在 TextFormat 上设置的唯一强制属性是 Font。" +
                "", 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 = GCTEXT.FontStyle.BoldItalic;
            tf.FontSize = 12;
            g.DrawString("3. 使用TextFormat.FontStyle.BoldItalic 模拟粗体斜体样式。", tf, ip);
            ip.Y += vStep;

            // 4.其他属性包括前景色和背景色:
            tf.FontStyle = GCTEXT.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. 不同的文本格式可以很容易地混合在同一个段落中", 
                new TextFormat() { Font = StandardFonts.Times });
            tl.Append("当使用 TextLayout 构建段落时",
                new TextFormat() { Font = StandardFonts.TimesBold, BackColor = Color.PaleTurquoise });
            tl.Append("如本示例段落所示。",
                new TextFormat() { Font = StandardFonts.HelveticaBoldItalic, ForeColor = Color.DarkOrange });
            tl.Append("TextFormat 上还有各种其他选项,包括",
                new TextFormat() { Font = StandardFonts.Times, ForeColor = Color.DarkSlateBlue });
            tl.Append("字形提前系数",
                new TextFormat() { Font = StandardFonts.TimesBoldItalic, Underline = true });
            tl.Append("(扩展字形",
                new TextFormat() { Font = StandardFonts.Times, GlyphAdvanceFactor = 1.5f, ForeColor = Color.BlueViolet });
            tl.Append("或者将它们放在一起),",
                new TextFormat() { Font = StandardFonts.Times, GlyphAdvanceFactor = 0.8f, ForeColor = Color.BlueViolet });
            tl.Append("横向偏移",
                new TextFormat() { Font = StandardFonts.TimesBoldItalic, Underline = true });
            tl.Append("(将字形降低到基线以下,",
                new TextFormat() { Font = StandardFonts.Times, TransverseOffset = -5, ForeColor = Color.MediumVioletRed });
            tl.Append("或将它们提高到其上方)",
                new TextFormat() { Font = StandardFonts.Times, TransverseOffset = 5, ForeColor = Color.MediumVioletRed });
            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);
            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}