Enum CssMarginBox
The sixteen page-margin boxes around a page's content (CSS Paged Media 3 section 5.1), clockwise from the top left.
public enum CssMarginBox
Fields
BottomCenter = 10@bottom-center.BottomLeft = 11@bottom-left.BottomLeftCorner = 12@bottom-left-corner.BottomRight = 9@bottom-right.BottomRightCorner = 8@bottom-right-corner.LeftBottom = 13@left-bottom.LeftMiddle = 14@left-middle.LeftTop = 15@left-top.RightBottom = 7@right-bottom.RightMiddle = 6@right-middle.RightTop = 5@right-top.TopCenter = 2@top-center.TopLeft = 1@top-left.TopLeftCorner = 0@top-left-corner.TopRight = 3@top-right.TopRightCorner = 4@top-right-corner.
Examples
CssStyleSheet sheet = CssStyleSheet.Parse("""
@page { size: A4; margin: 2cm; font: 9pt serif;
@bottom-center { content: counter(page) } }
@page :first { margin-top: 5cm; @bottom-center { content: none } }
@page :left { margin-left: 3cm }
@page appendix { size: A4 landscape }
h1.appendix { page: appendix; break-before: right }
""");
CssPageRule first = (CssPageRule)sheet.Rules[1];
CssPageSelector selector = first.Selectors[0]; // :first, specificity (0, 1, 0)
CssPageMarginRule footer = ((CssPageRule)sheet.Rules[0]).MarginRules[0]; // CssMarginBox.BottomCenter
// Cascade the page rules for each page the layout makes, then compute the page context from the root element's
// computed style and each margin box from the page context's.
var cascade = new CssCascade([(sheet, CssOrigin.Author)]);
CssPageStyle pageStyle = cascade.CascadePage(new CssPage(Name: null, IsFirst: false, IsLeft: true));
CssComputedStyle root = cascade.Compute(new CssCascadedStyle(), null);
CssComputedStyle page = cascade.Compute(pageStyle.Page, root);
string? marginLeft = page.GetValueText("margin-left"); // "3cm"
bool isSize = CssPageSize.TryParse(page.GetValueText("size")!, out CssPageSize a4); // 210mm by 297mm
CssComputedStyle box = cascade.Compute(pageStyle.MarginBoxes[CssMarginBox.BottomCenter], page);
string? content = box.GetValueText("content"); // "counter(page)"
string? fontSize = box.GetValueText("font-size"); // "9pt": inherited from the page context
// A named page: the appendix pages turn A4 to landscape.
CssPageStyle appendix = cascade.CascadePage(new CssPage("appendix", IsFirst: false, IsLeft: false));
bool isTurned = CssPageSize.TryParse(appendix.Page.GetValueText("size")!, out CssPageSize turned);
bool landscape = turned.Orientation == CssPageOrientation.Landscape; // true: 297mm by 210mm