PageLabels.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing

'' 此示例演示如何向文档添加页面标签。
'' 页面标签允许您将文档细分为以下序列
'' 逻辑相关的页面范围(例如前言、正文、后言)。
'' 在这个由“章节”组成的示例中,我们添加了一个单独的
'' 每章的页面标签范围。
'' 此示例​​中的代码与Outlines示例类似。
Public Class PageLabels
    Sub CreatePDF(ByVal stream As Stream)
        Dim doc = New GcPdfDocument()
        '' 主要文本的文本布局(默认 GcDocs.Pdf 分辨率为 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
        '' 章节标题的文本布局:
        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
        '' 用于控制页面之间文本分割的分割选项:
        Dim tso = New TextSplitOptions(tl) With
        {
            .RestMarginTop = tl.Resolution,
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        '' 生成多个“章节”,为每个章节提供大纲条目:
        Const NChapters = 20
        For i = 0 To NChapters - 1
            '' 章节标题 - 打印为章节标题并添加为大纲节点:
            Dim chapter = $"Chapter {i + 1}"

            '' 添加页面标签所需要做的就是添加 PageLabelingRange
            '' 与范围内第一页的索引相关联,
            '' 以及范围前缀和编号样式:
            doc.PageLabelingRanges.Add(doc.Pages.Count, New PageLabelingRange($"{chapter}, p. ", NumberingStyle.DecimalArabic, 1))

            doc.Pages.Add()
            tlCaption.Clear()
            tlCaption.Append(chapter)
            tlCaption.PerformLayout(True)
            '' 为章节添加大纲节点:
            doc.Outlines.Add(New OutlineNode(chapter, New DestinationFitH(doc.Pages.Last, tlCaption.MarginTop)))
            '' 打印标题:
            doc.Pages.Last.Graphics.DrawTextLayout(tlCaption, PointF.Empty)
            '' 章节正文:
            tl.Clear()
            tl.FirstLineIsStartOfParagraph = True
            tl.LastLineIsEndOfParagraph = True
            tl.Append(Util.LoremIpsum(7))
            '' 在正文布局中考虑章节标题:
            tl.MarginTop = tlCaption.ContentRectangle.Bottom + 12
            tl.PerformLayout(True)
            '' 打印章节:
            While True
                '' 'rest' 将接受不适合的文本:
                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
        '' 完毕:
        doc.Save(stream)
    End Sub
End Class