Novolis Docs
novolis-documents / model.md

Document model

dotnetpdfdocumentsnovolis

PagedDocument is the immutable root. Builders and mappers both produce this shape; layout and PDF only consume it.

PagedDocument

PropertyRole
MetaTitle and bibliographic fields
SetupTrim size, margins, header/footer band heights
TypographyFont sizes and spacing
BodyMain flow blocks (not First/Last content)
Header / FooterOptional page header/footer
WatermarkOptional diagonal text
FirstOptional title-page overrides + lines
IncludeCoverEmit First page from Meta when true
IncludeTocEmit TOC page(s) from level-1 titles
LastOptional closing page
HasFirstPage`IncludeCover \\First is not null`

DocumentMeta

FieldNotes
TitleRequired
Subtitle, SeriesDisplayed on First when set
Author, ContributorsPeople lines
PublisherImprint
Subject, DescriptionTopic / abstract
KeywordsIReadOnlyList<string>
IdentifierISBN, DOI, internal id, …
LanguageBCP-47 style tag (en, nb-NO)
VersionEdition label
DateDateOnly?
RightsCopyright line

PageSetup

PropertyMeaning
TrimFinished page size (Size from Math.Measure)
MarginContent margins (Thickness)
HeaderBand / FooterBandReserved vertical bands (Length)

TrimPresets

PresetSize
Inch6x96×9″ (trade default)
Inch5_5x8_55.5×8.5″
A5ISO A5
A4ISO A4
USLetterUS Letter
DefaultMarginPrint-oriented: binding 0.75″ / outer 0.5″ / head 0.5″ / foot 0.65″
ReportMarginUniform 1″

Typography

PropertyDefault role
BodyFontFamilyInformational name; Skia embeds Liberation Serif unless overridden
BodyFontSizePt, H1SizePt–H3SizePtType scale
TableFontSizePt≤0 → body size (EffectiveTableFontSizePt)
LineHeightMultiplier
ParagraphSpacingPtAfter most blocks
AfterLevel1SpacingPt / AfterHeadingSpacingPtAfter headings
TableCellPaddingPt / TableRuleStrokePtTable paint

FirstPage / LastPage

FirstPage — optional overrides for title/subtitle/series/author/rights, plus centered Lines. Missing fields fall back to Meta.

LastPage — optional Title, plain Lines, and richer Blocks after the lines.

Immutability

All model types use init / required. Treat instances as frozen after construction. Builders allocate new graphs on Build().