TextTrimming.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // 该示例演示了如何显示省略号
    // 如果字符串不适合分配的空间。
    public class TextTrimming
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            const float In = 72;

            var str = "This is a long line of text which does not fit in the allocated space.";
            var wid = In * 4;
            var dy = 0.3f;

            var rc = Common.Util.AddNote(
                "TextLayout 允许您显示省略号(或其他字符)" +
                "",
                page);
            var top = rc.Bottom + 36;

            var ip = new PointF(rc.Left, top);

            var tl = g.CreateTextLayout();
            tl.DefaultFormat.Font = StandardFonts.Times;
            tl.DefaultFormat.FontSize = 12;
            tl.MaxWidth = wid;
            tl.WrapMode = WrapMode.NoWrap;

            // TrimmingGranularity 默认为 None:
            tl.Append(str);
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            // 文字修剪:
            tl.TrimmingGranularity = TrimmingGranularity.Character;
            // 注意 PerformLayout 的 recalculateGlyphsBeforeLayout 参数
            // 第一次调用后可能为 false,因为文本/字体没有改变:
            tl.PerformLayout(false);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            // 词汇修剪:
            tl.TrimmingGranularity = TrimmingGranularity.Word;
            tl.PerformLayout(false);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            // tl.EllipsisCharCode 默认为 Horizo​​ntalEllipsis (0x2026)。
            // 将其更改为波形符:
            tl.EllipsisCharCode = 0x007E;
            tl.PerformLayout(false);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            // 我们还可以将 tl.EllipsisCharCode 设置为 0 来修剪文本
            // 不渲染任何修剪字符:
            tl.EllipsisCharCode = 0;
            tl.PerformLayout(false);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            // 另一个有趣的功能是由这对提供的
            // DelimiterCharCode 和 DelimiterCharCount 属性。
            // 这些通常用于缩短长路径
            // 在字符串尾部保留指定数量的部分:
            tl.Clear();
            tl.EllipsisCharCode = 0x2026;
            tl.Append(@"c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
            tl.DelimiterCharCode = '\\';
            tl.DelimiterCharCount = 2;
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, ip);
            ip.Y += tl.ContentHeight + dy;

            g.DrawRectangle(new RectangleF(rc.Left, top, wid, ip.Y - top), Color.OrangeRed);

            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}