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

namespace DsPdfWeb.Demos.Basics
{
    // 此示例演示如何呈现跨多个页面的长文本。
    public class PaginatedText
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // 使用 TextLayout 渲染文本:
            var tl = new TextLayout(72);
            // 如果没有指定单独运行的格式,我们必须提供
            // TextLayout.DefaultFormat 上的字体和字体大小:
            tl.DefaultFormat.Font = StandardFonts.Times;
            tl.DefaultFormat.FontSize = 12;
            // 第一行偏移 1/2":
            tl.FirstLineIndent = 72 / 2;
            //
            // 所有其他格式设置属性均保留默认值。
            // 特别是,TextLayout 的默认分辨率是 72 dpi -
            // 与GcDocs.Pdf相同,WordWrap也是如此。
            // 
            // 将 TextLayout 的区域设置为整个页面:
            tl.MaxWidth = doc.PageSize.Width;
            tl.MaxHeight = doc.PageSize.Height;
            // ...并让它管理页边距(周围 1 英寸):
            tl.MarginAll = tl.Resolution;
            //
            // 附加文本(20 段,这样一页就放不下)
            // (请注意,TextLayout 将“\r\n”解释为段落分隔符):
            tl.Append(Common.Util.LoremIpsum(20));
            //
            // 添加所有文本后,我们必须计算渲染文本所需的字形,
            // 并进行布局。这可以通过一次调用 PerformLayout 来完成,将 true 传递给
            // 首先重新计算字形(即使文本不完全适合指定的最大大小,
            // 我们只需要调用 PerformLayout 一次):
            tl.PerformLayout(true);
            // 使用分割选项来提供寡妇/孤儿控制:
            var to = new TextSplitOptions(tl);
            to.MinLinesInFirstParagraph = 2;
            to.MinLinesInLastParagraph = 2;
            // 在循环中,分割并渲染文本:
            while (true)
            {
                // 'rest' 将接受不适合的文本:
                var splitResult = tl.Split(to, out TextLayout rest);
                doc.Pages.Add().Graphics.DrawTextLayout(tl, PointF.Empty);
                if (splitResult != SplitResult.Split)
                    break;
                tl = rest;
            }
            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}