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
-