PageHeaders.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 '' Demonstrates a simple way to generate left/centered/right aligned page headers and footers. Public Class PageHeaders '' The document being generated: Private _doc As GcPdfDocument '' Utility method to draw a part of a page header or footer. '' Parameters: '' - text: The part's text. '' - tf: The text format to use. '' - pageIdx: The page index. '' - header: True if this is a header, false if a footer. '' - horzAlign: Horizontal alignment (left/center/right). 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" margins, adjust as needed: tl.MarginLeft = 72 tl.MarginRight = 72 '' 1/3" spacing above top/below bottom header, adjust as needed: tl.MarginTop = 72 / 3 tl.MarginBottom = tl.MarginTop '' Vertical alignment: tl.ParagraphAlignment = If(header, ParagraphAlignment.Near, ParagraphAlignment.Far) '' Horizontal alignment: tl.TextAlignment = horzAlign tl.Append(text, tf) '' NOTE: if some part of a header or footer is static, we could cache the corresponding TextLayout '' object and save some cycles by just drawing that cached TextLayout on each page w/out anything else: tl.PerformLayout(True) '' Draw the header at (0,0) (header located by margins and alignment): page.Graphics.DrawTextLayout(tl, PointF.Empty) End Sub '' The main program. Function CreatePDF(ByVal stream As Stream) As Integer _doc = New GcPdfDocument() Dim page = _doc.NewPage() '' Add a note about flipping landscape: Dim noteRect = Util.AddNote( "We flip page orientation in this sample only to show that these page headers can adapt to the changing page size.", page) '' '' Prepare a TextLayout with some long text and print it (see PaginatedText for details): 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 '' Add sample text: tl.Append(Util.LoremIpsum(20)) '' Calculate glyphs and perform layout (see also PerformLayout call in the loop below): tl.PerformLayout(True) '' In a loop, split and render the text: 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() '' For sample sake, toggle page orientation: page.Landscape = Not _doc.Pages(_doc.Pages.Count - 2).Landscape '' Update layout size to reflect the new page orientation: tl.MaxWidth = page.Size.Width tl.MaxHeight = page.Size.Height '' Because we changed layout size, we must perform layout again - '' but can do it without recalculating glyphs: tl.PerformLayout(False) End While '' Render the headers in a separate loop (so that we can provide 'Page X of Y' header): 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 '' '' Done: _doc.Save(stream) Return _doc.Pages.Count End Function End Class