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