''
'' 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 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 DsPdf 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.Last, 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