LargeDocument3.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' 使用单个 TextLayout 生成大型 PDF。
'' 与其他“大文档”示例(StartEndDocLargeDocument2)不同,
'' 该示例实际上将整个文档作为单个段落序列进行分页,
'' 以最佳且正确的方式用文本填充每个页面。拆分选项,例如
'' 还支持在每页上保留至少 2 行段落。
'' 由于需要额外的工作,该示例需要更长的时间才能完成。
Public Class LargeDocument3
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' 生成的页数:
        Const N = Util.LargeDocumentIterations
        Dim start = Util.TimeNow()
        Dim doc = New GcPdfDocument()
        '' 准备一个 TextLayout 来保存/格式化文本:
        Dim tl = New TextLayout(72) With {
            .MaxWidth = doc.PageSize.Width,
            .MaxHeight = doc.PageSize.Height,
            .MarginAll = 72,
            .FirstLineIndent = 36
        }
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        '' 生成文档:
        For paraIdx = 1 To N
            tl.AppendLine(Util.LoremIpsum(1))
        Next
        '' 拆分并渲染 TextLayout,如 PaginatedText 示例所示:
        Dim tso = New TextSplitOptions(tl) With {
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        tl.PerformLayout(True)
        '' 循环分割和渲染布局:
        Dim tls = New TextLayoutSplitter(tl)

        Dim tlPage = tls.Split(tso)
        While Not tlPage Is Nothing
            doc.NewPage().Graphics.DrawTextLayout(tlPage, PointF.Empty)
            tlPage = tls.Split(tso)
        End While

        tl.Clear()
        '' 插入标题页(如果使用 StartDoc/EndDoc 则无法完成):
        tl.FirstLineIndent = 0
        Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "yumin.ttf"))
        Dim tf0 = New TextFormat() With {.FontSize = 24, .FontBold = True, .Font = fnt}
        tl.Append(String.Format("大型文档" + vbLf + "{0} Lorem Ipsum 段落" + vbLf + vbLf, N), tf0)
        Dim tf1 = New TextFormat(tf0) With {.FontSize = 14, .FontItalic = True}
        tl.Append(String.Format("于 {0} 上的 {1:m\m\s\s\fff\m\s} 中生成。", Util.TimeNow().ToString("R"), Util.TimeNow() - start), tf1)
        tl.TextAlignment = TextAlignment.Center
        tl.PerformLayout(True)
        doc.Pages.Insert(0).Graphics.DrawTextLayout(tl, PointF.Empty)
        '' 完毕:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class