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