Outlines.vb
''
'' This code is part of GrapeCity Documents for PDF samples.
'' Copyright (c) GrapeCity, Inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing

'' Shows how to add ouline entries to a document.
'' See also PaginatedText.
Public Class Outlines
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        '' Text layout for main text (default GcPdf resolution is 72dpi):
        Dim tl = New TextLayout(72)
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        tl.FirstLineIndent = 72 / 2
        tl.MaxWidth = doc.PageSize.Width
        tl.MaxHeight = doc.PageSize.Height
        tl.MarginAll = tl.Resolution
        '' Text layout for chapter headers:
        Dim tlCaption = New TextLayout(72)
        tlCaption.DefaultFormat.Font = StandardFonts.TimesBold
        tlCaption.DefaultFormat.FontSize = tl.DefaultFormat.FontSize + 4
        tlCaption.DefaultFormat.Underline = True
        tlCaption.MaxWidth = tl.MaxWidth
        tlCaption.MarginLeft = tlCaption.Resolution
        tlCaption.MarginTop = tlCaption.Resolution
        tlCaption.MarginRight = tlCaption.Resolution
        tlCaption.MarginBottom = tlCaption.Resolution
        '' Split options to control splitting of text between pages:
        Dim tso = New TextSplitOptions(tl) With {
            .RestMarginTop = tl.Resolution,
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        '' Generate a number of "chapters", provide outline entry for each:
        Const NChapters = 20
        For i = 0 To NChapters - 1

            doc.Pages.Add()
            '' Chapter title - print as chapter header and add as outline node:
            Dim chapter = $"Chapter {i + 1}"
            tlCaption.Clear()
            tlCaption.Append(chapter)
            tlCaption.PerformLayout(True)
            '' Add outline node for the chapter:
            doc.Outlines.Add(New OutlineNode(chapter, New DestinationFitH(doc.Pages.Count - 1, tlCaption.MarginTop)))
            '' Print the caption:
            doc.Pages.Last.Graphics.DrawTextLayout(tlCaption, PointF.Empty)
            '' Chapter text:
            tl.Clear()
            tl.FirstLineIsStartOfParagraph = True
            tl.LastLineIsEndOfParagraph = True
            tl.Append(Util.LoremIpsum(7))
            '' Account for chapter header in the main text layout:
            tl.MarginTop = tlCaption.ContentRectangle.Bottom + 12
            tl.PerformLayout(True)
            '' Print the chapter:
            While True
                '' 'rest' will accept the text that did not fit:
                Dim rest As TextLayout = Nothing
                Dim splitResult = tl.Split(tso, rest)
                doc.Pages.Last.Graphics.DrawTextLayout(tl, PointF.Empty)
                If splitResult <> SplitResult.Split Then
                    Exit While
                End If
                tl = rest
                doc.Pages.Add()
            End While
        Next
        ''
        '' Done:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class