Layout reference
Every tag, attribute, value type and limit of the PDF layout language.
The layout is a small XML document. Every template starts with <document>. This page lists every tag and attribute that exists. Anything else is refused when you save, and all problems are listed at once with their line numbers.
Skeleton
<document page="A4" margin="16mm" font-size="10">
<class name="muted" color="#6b7280" font-size="9"/>
<header>
<row valign="bottom">
<col w="8"><h2>{{.org.name}}</h2></col>
<col w="4" align="right"><h1>INVOICE</h1></col>
</row>
<hr/>
</header>
<footer><text class="muted" align="right">Page {page} of {pages}</text></footer>
<text>Hello</text>
</document>
Rules in short
- One root
<document>. Text must sit inside<text>, a heading (<h1>–<h3>) or a<td>. - At most one
<header>and one<footer>. - Text styling (
font,font-size,color,bold,italic,align,line-height) is inherited by everything inside. - Named styles: declare
<class name="…"/>directly under<document>and use it withclass="name other". An element's own attributes win; later classes beat earlier ones. Class names start with a letter and are up to 32 letters, digits,_or-. - Character entities such as
and©are understood. - Fonts are built in (Noto Sans, Noto Serif, Noto Sans Mono) and include characters such as ₹.
Value types
| Type | Accepts |
|---|---|
| Length | A number with pt (default), mm, cm, in or px, for example 12, 4mm, 1in. Up to 5000. |
| Color | Hex such as #1a1a1a or #fff. |
| Boolean | true or false. |
Edges (padding, margin) |
One to four lengths, written like CSS: 8, 8 12, 8 12 8 12. |
align |
left, center, right. |
valign |
top, middle, bottom. |
font |
sans, serif, mono. |
lines |
none, rows, grid. |
orientation |
portrait, landscape. |
line-height |
A multiplier from 0.8 to 3. |
page |
A3, A4, A5, Letter, Legal, or a custom "<width> <height>" such as "80mm 200mm" (each at least 1in). |
Elements
document
The root. Attributes: page (default A4), orientation (default portrait; a landscape setting swaps the page sides), margin (default 15mm), gap, plus the text attributes. Defaults for text are sans font, 10pt, line-height 1.35, near-black. Can contain class, header, footer, pagebreak and any block element.
class
A named bundle of attributes. Takes name and any style attribute that other elements take. It has no content and must sit directly under <document>. Each name can be defined only once.
header and footer
Repeat on every page. Attributes: gap, text attributes, margin-top, margin-bottom. The gap between header and body, and between body and footer, is 12pt unless you set margin-bottom on the header or margin-top on the footer. {page} and {pages} are filled in here.
text, h1, h2, h3
Paragraphs and headings. Attributes: text attributes, margin-top, margin-bottom; <text> also takes background. Headings default to 20pt (h1), 15pt (h2) and 12pt (h3), bold, and are never left alone at the bottom of a page. Inside you can use <b>, <i>, <span> and <br/>.
span, b, i, br
Inline styling. span takes font, font-size, color, bold, italic. b is bold, i is italic, br is a line break.
row and col
A 12-column grid.
rowattributes:gap(default 12),valign,class,margin-top,margin-bottom. It holds only<col>elements and at least one.colattributes:w(whole number 1 to 12),gap, text attributes, box attributes.- Give every
colawand the widths must add up to 12, or give none and the columns split equally. - A row is never split across pages.
box
A container with a look. Attributes: padding, background, border, border-color, radius, gap, text attributes, margin-top, margin-bottom. A border has a default light grey colour. A box that runs onto a second page is drawn again on that page.
table, column, tr, td
tableattributes:lines(rowsby default, ornoneorgrid),line-color,stripe(a colour for alternate rows),cell-padding(default 4), text attributes, margins. It holds<column>and<tr>elements.columnattributes:w(a positive number, relative width) andalign. Declare columns to set widths and alignment.trattributes:header(truefor header rows),background, text attributes. Header rows must come first and repeat at the top of every page.tdattributes:span(a whole number, merges cells),background, text attributes.- A row cannot span more cells than the table declares columns.
image
Attributes: src (required), width, height, align, class, margins. src must be a base64 data:image/…;base64, address (PNG, JPEG or GIF). Size defaults to the image's own size, scaled down to fit the page width. Give one of width or height to keep the proportions.
hr
A horizontal line. Attributes: thickness (default 0.75), color, class, margins.
spacer
Blank vertical space. Attribute: h (default 12).
pagebreak
Starts a new page. No attributes.
Attribute tables
| Group | Attributes |
|---|---|
| Text | font, font-size, color, bold, italic, align, line-height, class |
| Box | padding, background, border, border-color, radius |
| Spacing | margin-top, margin-bottom |
Limits
- Template source: up to 256 KB.
- Filled-in document: up to 8 MB of layout and up to 500 pages.
- Margins, header and footer must leave at least 1 inch for the body.
- Error lists are cut off after 50 problems.
Common errors
| Message | Fix |
|---|---|
not well-formed XML: … |
A tag is not closed or an & is not escaped in fixed text. |
the root element must be <document> |
Wrap everything in <document>. |
unknown element / unknown attribute "x" |
Check the spelling against the lists above. |
not allowed inside <x> |
Move the element. For example <col> belongs inside <row>. |
col widths sum to N, must be 12 |
Adjust the w values. |
give every <col> a w, or none (equal split) |
Set w on all columns or none. |
header rows come first |
Move header="true" rows above body rows. |
row spans N cells but the table declares M columns |
Remove cells or declare more <column> elements. |
image src must be a base64 data: URI |
Embed the image as a data: address. |
unknown class "x" |
Declare <class name="x"/> under <document>. |