PaginatedText.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing

'' 此示例演示如何呈现跨多个页面的长文本。
Public Class PaginatedText
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        ''
        '' 使用 TextLayout 渲染文本:
        Dim 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(Util.LoremIpsum(20))
        ''
        '' 添加所有文本后,我们必须计算渲染文本所需的字形,
        '' 并进行布局。这可以通过一次调用 PerformLayout 来完成,将 true 传递给
        '' 首先重新计算字形(即使文本不完全适合指定的最大大小,
        '' 我们只需要调用 PerformLayout 一次):
        tl.PerformLayout(True)
        '' 使用分割选项来提供寡妇/孤儿控制:
        Dim tso = New TextSplitOptions(tl)
        tso.MinLinesInFirstParagraph = 2
        tso.MinLinesInLastParagraph = 2
        '' 在循环中,分割并渲染文本:
        While (True)
            '' 'rest' 将接受不适合的文本:
            Dim rest As TextLayout = Nothing
            Dim splitResult = tl.Split(tso, rest)
            doc.Pages.Add().Graphics.DrawTextLayout(tl, PointF.Empty)
            If splitResult <> SplitResult.Split Then
                Exit While
            End If
            tl = rest
        End While
        ''
        '' 完毕:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class