Header, footer, and watermark
One-column pages to Skia PDF
Page bands sit outside the content box. Layout reserves PageSetup.HeaderBand / FooterBand; Skia paints text into those bands when a page’s ShowHeader / ShowFooter flags are set.
Include flags
Both Header and Footer use the same include model (defaults differ):
| Flag | Page kind | Header default | Footer default |
|---|---|---|---|
| `IncludeFirstPage` | Opening / title (`PageKind.Cover`, including overflow First pages) | off | off |
| `IncludeToc` | TOC pages | off | off |
| `IncludeBody` | Main flow | on | on |
| `IncludeLastPage` | Closing (`PageKind.Last`, including overflow Last pages) | off | off |
Header and footer share the same include defaults: Body only. First and Last are normally one page each; if content overflows, extra First/Last pages still use these include flags (no separate “multipage” switch).
Fluent builders mirror these names:
.Header(h => h
.Template("{title}")
.IncludeBody()
.UseChapterTitle())
.Footer(f => f
.Template("{page} / {pages}")
.IncludeBody())
// Opt in: .IncludeFirstPage().IncludeToc().IncludeLastPage()Shortcuts on DocumentPageBuilder:
.Header("{title}")→ template + body only.Footer("{page} / {pages}")→ template + body only
Templates
Supported placeholders (case-sensitive):
| Token | Source |
|---|---|
| `{page}` | 1-based page number |
| `{pages}` | Total page count |
| `{title}` | `Meta.Title` |
| `{subtitle}` | `Meta.Subtitle` |
| `{author}` | `Meta.Author` |
| `{series}` | `Meta.Series` |
| `{publisher}` | `Meta.Publisher` |
| `{subject}` | `Meta.Subject` |
| `{identifier}` | `Meta.Identifier` |
| `{version}` | `Meta.Version` |
| `{language}` | `Meta.Language` |
| `{date}` | `Meta.Date` (formatted) |
| `{rights}` | `Meta.Rights` |
| `{chapter}` | Current chapter title (body pages) |
Header and footer text are centered in their bands. Font size: FontSizePt (default 9).
Chapter title header
.Header(h => h.Template("{title}").IncludeBody().UseChapterTitle())When UseChapterTitle is true, body pages paint the current chapter title (last level-1 heading) instead of expanding the template. If no chapter is active yet, the template is used.
PageSlice.ChapterTitle carries that string for layout/PDF.
Band heights
.Page(p => p.Bands(headerPt: 16f, footerPt: 16f))If the band is too small for the font, glyphs may clip — raise the band or lower FontSizePt.
Watermark
Diagonal text painted under content (after white clear, before blocks).
.Watermark(w => w
.Text("DRAFT")
.Color(DocumentColor.Red) // default
.Opacity(0.12f)
.FontSize(54f)
.Rotation(-32f)
.On(WatermarkPages.All))| Property | Default |
|---|---|
| `Text` | required (`DRAFT` in builder) |
| `Color` | `DocumentColor.Red` |
| `Opacity` | `0.12` |
| `FontSizePt` | `54` |
| `RotationDegrees` | `-32` |
| `Pages` | `WatermarkPages.All` |
WatermarkPages is a flags enum: First, Toc, Body, Last, All (First/Last cover every page of those regions when they overflow).
Named colors: DocumentColor.Red, .Gray, .Black, plus FromRgb / Parse("#RRGGBB").
Remove with .NoWatermark() or leave PagedDocument.Watermark null.
Naming notes
- Types are `Header` and `Footer` — not “RunningHeader”, not “Chrome”.
- First page (not “cover” in the public model; layout still uses
PageKind.Coverinternally for that slot). - Toc is the contents page; the main flow is Content / Body.