Branding
Logo, Markenfarben und Typografie in BlockTemplate. Statt Farbwerte und Schriftgrößen in jedem Block zu wiederholen, definierst du Design-Tokens einmal in page und referenzierst sie — ein Wertewechsel aktualisiert die gesamte Vorlage.

Logo
image-Block mit src (URL, Base64 oder Platzhalter). fit: [breite, höhe] skaliert proportional in die Box.
Farben
colorScheme definiert benannte Tokens. Blöcke referenzieren sie via { token: '…' } — ein Wert ändert alle Stellen.
Schriften
defaultFont setzt die Standardfamilie. fontSizes-Tokens halten die Typo-Skala konsistent (body, heading, small, total).
Logo einbinden
Als image-Block mit URL, Base64-Data-URI oder Platzhalter. fit skaliert proportional in eine Zielbox, ohne das Seitenverhältnis zu verzerren.
1{2 "type": "image",3 "data": {4 "src": "https://cdn.example.com/logo.png",5 "fit": [120, 60],6 "alignment": "right"7 }8}9// Alternativ: Base64 Data URI für garantierte Offline-Renderfähigkeit10// "src": "data:image/png;base64,iVBORw0KGgoAAAANS..."Design-Tokens definieren
page.colorScheme und page.fontSizes halten benannte Werte. Namen sind frei wählbar — bewährt haben sich semantische Tokens wie primaryColor oder headingSize.
1{2 "page": {3 "size": "A4",4 "margins": { "top": 40, "right": 40, "bottom": 40, "left": 40 },5 "colorScheme": {6 "primaryColor": "#4f46e5",7 "accentColor": "#8b5cf6",8 "textColor": "#111111",9 "mutedColor": "#6b7280",10 "lineColor": "#e5e7eb"11 },12 "fontSizes": {13 "bodySize": 10,14 "smallSize": 8,15 "headingSize": 18,16 "totalSize": 1217 }18 }19}Tokens referenzieren
Überall, wo ein Block einen Farb- oder Größenwert erwartet, kannst du stattdessen { token: '…' } übergeben.
1{2 "type": "text",3 "data": {4 "content": "RECHNUNG {{invoiceNumber}}",5 "fontSize": { "token": "headingSize" },6 "color": { "token": "primaryColor" },7 "bold": true8 }9}10 11{12 "type": "table",13 "data": {14 "dataSource": "{{items}}",15 "headerFillColor": { "token": "primaryColor" },16 "headerTextColor": "#FFFFFF",17 "fontSize": { "token": "bodySize" },18 "columns": [ /* ... */ ]19 }20}Benannte Styles für wiederkehrende Elemente
Das styles-Objekt bündelt Font-, Farb- und Margin-Presets. Blöcke verweisen per style-Property darauf. Design-Tokens sind auch hier erlaubt.
1{2 "styles": {3 "h1": { "fontSize": 22, "bold": true, "color": { "token": "primaryColor" } },4 "h2": { "fontSize": 14, "bold": true, "margin": [0, 0, 0, 6] },5 "muted": { "color": { "token": "mutedColor" } },6 "total": { "fontSize": 14, "bold": true, "alignment": "right" }7 }8}9 10// Blöcke referenzieren Styles per Name:11{ "type": "text", "data": { "content": "RECHNUNG", "style": "h1" } }Header & Footer
header und footer sind optional. Mit repeatOnAllPages: true erscheinen sie auf jeder Seite; andernfalls nur auf der letzten. Beide akzeptieren dieselben 9 Block-Typen wie body.
1{2 "header": {3 "height": 80,4 "repeatOnAllPages": true,5 "blocks": [6 {7 "type": "columns",8 "data": {9 "columns": [10 { "width": "*", "blocks": [11 { "type": "text", "data": { "content": "{{seller.name}}", "style": "h2" } }12 ]},13 { "width": "auto", "blocks": [14 { "type": "image", "data": { "src": "https://cdn.example.com/logo.png", "fit": [120, 60] } }15 ]}16 ]17 }18 }19 ]20 },21 "footer": {22 "repeatOnAllPages": true,23 "blocks": [24 { "type": "line", "data": { "thickness": 0.5, "color": { "token": "lineColor" } } },25 { "type": "text", "data": {26 "content": "{{seller.name}} • USt-IdNr. {{seller.vatId}} • {{seller.email?}}",27 "fontSize": { "token": "smallSize" },28 "color": { "token": "mutedColor" },29 "alignment": "center"30 }}31 ]32 }33}