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

'' 演示生成左/居中/右对齐页眉和页脚的简单方法。
Public Class PageHeaders

    '' 正在生成的文档:
    Private _doc As GcPdfDocument

    '' 绘制页眉或页脚的一部分的实用方法。
    '' 参数:
    '' - 文本:该部分的文本。
    '' - tf:要使用的文本格式。
    '' - pageIdx:页面索引。
    '' - header:如果这是页眉,则为 true;如果是页脚,则为 false。
    '' - horzAlign:水平对齐(左/中/右)。
    Private Sub RenderHeader(ByVal text As String, ByVal tf As TextFormat, ByVal pageIdx As Integer, ByVal header As Boolean, ByVal horzAlign As TextAlignment)
        Dim page = _doc.Pages(pageIdx)
        Dim tl = New TextLayout(72) With {.Resolution = page.Graphics.Resolution}
        tl.MaxWidth = page.Size.Width
        tl.MaxHeight = page.Size.Height
        '' 1" 边距,根据需要调整:
        tl.MarginLeft = 72
        tl.MarginRight = 72
        '' 顶部/底部标题上方 1/3" 间距,根据需要调整:
        tl.MarginTop = 72 / 3
        tl.MarginBottom = tl.MarginTop
        '' 垂直对齐:
        tl.ParagraphAlignment = If(header, ParagraphAlignment.Near, ParagraphAlignment.Far)
        '' 水平对齐:
        tl.TextAlignment = horzAlign
        tl.Append(text, tf)
        '' 注意:如果页眉或页脚的某些部分是静态的,我们可以缓存相应的 TextLayout
        '' 对象并通过在每个页面上绘制缓存的 TextLayout 来节省一些周期,而不需要任何其他内容:
        tl.PerformLayout(True)
        '' 在 (0,0) 处绘制标题(标题由边距和对齐方式定位):
        page.Graphics.DrawTextLayout(tl, PointF.Empty)
    End Sub

    '' 主程序。
    Function CreatePDF(ByVal stream As Stream) As Integer
        _doc = New GcPdfDocument()
        Dim page = _doc.NewPage()
        '' 添加关于翻转横向的注释:
        Dim noteRect = Util.AddNote(
                "我们在此示例中翻转页面方向只是为了表明这些页眉可以适应不断变化的页面大小。",
                page)
        ''
        '' 准备一个包含一些长文本的 TextLayout 并打印它(详细信息请参阅PaginatedText):
        Dim tl = page.Graphics.CreateTextLayout()
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        tl.MaxWidth = _doc.PageSize.Width
        tl.MaxHeight = _doc.PageSize.Height
        tl.MarginAll = tl.Resolution
        tl.MarginTop = noteRect.Bottom + 18
        '' 添加示例文本:
        tl.Append(Util.LoremIpsum(20))
        '' 计算字形并执行布局(另请参阅下面循环中的 PerformLayout 调用):
        tl.PerformLayout(True)
        '' 在循环中,分割并渲染文本:
        While True
            Dim rest As TextLayout = Nothing
            Dim splitResult = tl.Split(Nothing, rest)
            page.Graphics.DrawTextLayout(tl, PointF.Empty)
            If splitResult <> SplitResult.Split Then
                Exit While
            End If
            tl = rest
            tl.MarginTop = tl.Resolution
            page = _doc.Pages.Add()
            '' 为了示例,切换页面方向:
            page.Landscape = Not _doc.Pages(_doc.Pages.Count - 2).Landscape
            '' 更新布局大小以反映新的页面方向:
            tl.MaxWidth = page.Size.Width
            tl.MaxHeight = page.Size.Height
            '' 因为我们改变了布局尺寸,所以我们必须再次进行布局 -
            '' 但无需重新计算字形即可做到这一点:
            tl.PerformLayout(False)
        End While
        '' 在单独的循环中渲染标题(以便我们可以提供“Page X of Y”标题):
        Dim tf = New TextFormat() With {.Font = StandardFonts.Helvetica, .FontSize = 10, .ForeColor = Color.Gray}
        Dim now = Util.TimeNow().ToString("u")
        For pageIdx = 0 To _doc.Pages.Count - 1
            RenderHeader(now, tf, pageIdx, True, TextAlignment.Leading)
            RenderHeader("Easy Page Headers Sample", tf, pageIdx, True, TextAlignment.Center)
            RenderHeader($"Page {pageIdx + 1} of {_doc.Pages.Count}", tf, pageIdx, True, TextAlignment.Trailing)
            RenderHeader("Page footer - left", tf, pageIdx, False, TextAlignment.Leading)
            RenderHeader("DsPdf", tf, pageIdx, False, TextAlignment.Center)
            RenderHeader("Page footer - right", tf, pageIdx, False, TextAlignment.Trailing)
        Next
        ''
        '' 完毕:
        _doc.Save(stream)
        Return _doc.Pages.Count
    End Function
End Class