StartEndDoc.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

'' 演示如何使用更少的内存创建大型文档。
'' 
'' GcDocs.Pdf 提供两种创建 PDF 文件的方法:
'' - 通常更方便的方法:首先完全构建文档,
''   添加文本、图形和其他元素。然后在文档上调用 Save()
''   传递文件名或要保存到的流。这种方法允许
''   修改已创建的内容 - 例如您可以在任何地方插入页面
''   在文档中,或修改已添加的页面。
'' - StartDoc/EndDoc 方法:通过这种方法,您可以提供流
''   在向文档添加任何内容之前,先保存到,
''   通过调用文档上的 StartDoc() 方法。然后写入所有内容
''   直接到该流,并且您无法返回并更新已创建的页面。
''   要完成文档,请调用 EndDoc() 方法。如果您尝试执行
''   不允许的操作,将会抛出异常。虽然这种方法是
''   有些限制(例如,在此模式下 Linearized 不能设置为 true),它使用
''   内存较少,尤其是在创建非常大的文档时可能更可取。
'' 
'' 此示例演示了 StartDoc/EndDoc 方法。
'' 
'' 本质上相同的代码,但不使用 StartDoc/EndDoc,由
'' LargeDocument2 示例。另请参阅LinearizedPdf。
Public Class StartEndDoc
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' 生成的页数:
        Dim N = Util.LargeDocumentIterations
        Dim doc = New GcPdfDocument()
        '' 通过此调用开始创建文档:
        doc.StartDoc(stream)
        '' 准备一个 TextLayout 来保存/格式化文本:
        Dim tl = New TextLayout(72) With {
            .MaxWidth = doc.PageSize.Width,
            .MaxHeight = doc.PageSize.Height,
            .MarginAll = 72
        }
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        '' 从标题页开始:
        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}", Util.TimeNow().ToString("R")), tf1)
        tl.TextAlignment = TextAlignment.Center
        tl.PerformLayout(True)
        doc.Pages.Add().Graphics.DrawTextLayout(tl, PointF.Empty)
        tl.Clear()
        tl.FirstLineIndent = 36
        tl.TextAlignment = TextAlignment.Leading
        '' 生成文档:
        For pageIdx = 1 To N
            tl.Append(Util.LoremIpsum(1))
            tl.PerformLayout(True)
            doc.NewPage().Graphics.DrawTextLayout(tl, PointF.Empty)
            tl.Clear()
        Next
        '' 注意:使用 StartDoc/EndDoc 时,某些操作(例如下面的操作)会抛出错误:
        ''    doc.Pages.Insert(0);
        '' 
        '' 完成 - 调用 EndDoc 而不是 Save():
        doc.EndDoc()
        Return doc.Pages.Count
    End Function
End Class