''
'' 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
'' This sample shows how to add page labels to a document.
'' Page labels allow you to subdivide the document into sequences of
'' logically related page ranges (e.g. preface, main body, postface).
'' In this sample consisting of 'chapters', we add a separate
'' page labeling range for each chapter.
'' The code in this sample is similar to the Outlines sample.
Public Class PageLabels
Sub CreatePDF(ByVal stream As Stream)
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.MarginAll = 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
'' Chapter title - print as chapter header and add as outline node:
Dim chapter = $"Chapter {i + 1}"
'' All it takes to add page lables is to add a PageLabelingRange
'' associated with the index of the first page in the range,
'' and the range prefix and numbering style:
doc.PageLabelingRanges.Add(doc.Pages.Count, New PageLabelingRange($"{chapter}, p. ", NumberingStyle.DecimalArabic, 1))
doc.Pages.Add()
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
Dim p = doc.Pages.Add()
End While
Next
'' Done:
doc.Save(stream)
End Sub
End Class