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;
}
}
}