Skip to content

Side-by-side rows

Row lays content side by side - the tool for letterheads, address blocks, and any two-column arrangement that isn’t tabular data.

doc.Row(row => row
.RelativeItem(left => left
.Text("Billed to", Label)
.Text("Acme Corp.", Section),
weight: 1.2f)
.FixedItem(210f, right => right
.Text("Invoice date", Label)
.Text("09 Jul 2026", Body)));
  • RelativeItem(configure, weight) - shares the width left over after fixed items, proportionally to weight (default 1f).
  • FixedItem(width, configure) - exactly width points.

Each item is itself a container: it accepts the same Text calls a paragraph does, stacked vertically.

Use a row when you’re arranging blocks of content spatially. Use a table when the data is tabular - tables add borders, cell backgrounds, spans, and repeating headers. A borderless table can emulate a row, but rows express the intent more directly and compose more naturally with paragraphs around them.

doc.Row(row => row
.RelativeItem(left => left
.Text("INVOICE", Title)
.Text("INV-20260709-001", new TextStyle(Color: Colors.Blue.Medium)),
weight: 1.35f)
.RelativeItem(right => right
.Text("Northwind Studio Ltd", Section)
.Text("12 Harbour Lane", Body)
.Text("London EC1V 4AB", Body)));

This is the top of your first invoice - the title block takes a bit more than half the width, the sender block the rest.