LargeDocument3.vb
''
'' This code is part of Document Solutions for PDF demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' Generates a large PDF using a single TextLayout.
'' Unlike other 'large document' samples (StartEndDoc, LargeDocument2),
'' this sample actually paginates the whole document as a single sequence of paragraphs,
'' optimally and correctly filling each page with text. Split options such as
'' keeping at least 2 lines of paragraph on each page are also supported.
'' Due to the extra work, this sample takes significantly more time to complete.
Public Class LargeDocument3
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' Number of pages to generate:
        Const N = Util.LargeDocumentIterations
        Dim start = Util.TimeNow()
        Dim doc = New GcPdfDocument()
        '' Prep a TextLayout to hold/format the text:
        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
        '' Generate the document:
        For paraIdx = 1 To N
            tl.AppendLine(Util.LoremIpsum(1))
        Next
        '' Split and render TextLayout as shown in the PaginatedText sample:
        Dim tso = New TextSplitOptions(tl) With {
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        tl.PerformLayout(True)
        '' The loop splitting and rendering the layout:
        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()
        '' Insert a title page (cannot be done if using 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("Large Document" + vbLf + "{0} Paragraphs of Lorem Ipsum" + vbLf + vbLf, N), tf0)
        Dim tf1 = New TextFormat(tf0) With {.FontSize = 14, .FontItalic = True}
        tl.Append(String.Format("Generated on {0} in {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)
        '' Done:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class