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
-