DoConure

Far stare un valore nello spazio che gli hai lasciato

Un segnaposto può portare un codice di formattazione dopo :::. È sempre facoltativo e cambia solo come il valore viene stampato — mai il valore nel tuo JSON.

ScriviCosa fa
{{ contact.phone:::l:80 }} Al massimo 80 caratteri. Taglia all'ultima parola intera e aggiunge i puntini di sospensione, che contano nel limite — così il risultato non supera mai lo spazio che hai misurato.
{{ address:::one }} Riduce a capo e sequenze di spazi a spazi singoli. Per un indirizzo di tre righe che deve stare su una riga sola.
{{ iban:::wrap:20 }} Permette a una lunga stringa senza spazi — un IBAN, un URL, un codice prodotto — di andare a capo invece di uscire dalla sua colonna. Invisibile: aggiunge punti in cui spezzare, non caratteri.
{% for line in invoice.lines:::max:50 %} Su un ciclo: prende al massimo 50 elementi. Altrimenti una tabella che riceve cinquemila righe diventa duecento pagine.

I codici si possono concatenare: {{ notes:::one:::l:120 }}. Un codice che non riconosciamo viene ignorato e il valore stampato così com'è, con un avviso sulla generazione — un codice scritto male ti costa la formattazione, mai il documento.

Non ci sono codici per grassetto, corsivo o sottolineato. Metti in grassetto il segnaposto stesso in Word e il valore esce in grassetto — l'editor lo fa già, e un codice lo duplicherebbe soltanto.

Formato di numeri e date: i valori sono stampati esattamente come arrivano. Se ti servono 1.234,56 € o 10/09/2026, formattali nel sistema che costruisce il JSON e manda stringhe. Soprattutto le date: il documento parla la lingua del tuo cliente, e il servizio non pretende di sapere quale.

Disegnare un grafico dal payload

Un grafico a barre, a linee o a torta, disegnato dai numeri del payload. Funziona nei template Word e HTML, non in Excel.

{{ sales:::chart }}        <!-- largo 150 mm, il valore predefinito -->
{{ sales:::chart:120 }}    <!-- 120 mm (da 40 a 180) -->

e nel payload:

{
  "sales": {
    "type": "bar",
    "title": "Fatturato 2026",
    "labels": ["T1", "T2", "T3", "T4"],
    "series": [
      {"name": "Italia",  "values": [10, 12.5, 9, 14]},
      {"name": "Francia", "values": [4, 6, 7, 8]}
    ],
    "alt": "Fatturato per trimestre, Italia contro Francia"
  }
}
  • type è bar, line o pie. Una torta prende esattamente una serie di zero o più valori.
  • Limiti: al massimo 6 serie e 60 punti (12 spicchi per una torta); etichette e nomi al massimo 40 caratteri; i valori sono numeri semplici. Oltre un limite il grafico viene omesso, con un avviso, e il documento viene prodotto lo stesso.
  • Il grafico è disegnato da noi. Non si scarica mai nessun indirizzo, e niente nella specifica può portare uno stile, uno script o un link.
  • alt è la descrizione che legge uno screen reader. Se lo ometti ne costruiamo una dal titolo e dai dati. Due o più serie, e ogni torta, hanno una legenda, così nessun significato si affida solo al colore.
  • Un grafico che non si può disegnare non ferma il documento, nei template rigidi come in quelli tolleranti: viene omesso e Validate e gli avvisi della generazione dicono perché. Un campo assente segue la solita regola dei campi mancanti.

Mettere nel documento un'immagine del payload

La foto di uno scontrino, la scansione di una firma, la foto di un prodotto — qualunque cosa porti il payload, invece di qualcosa che è già nel template.

{{ receipt:::img }}        <!-- larga 80 mm, il valore predefinito -->
{{ receipt:::img:120 }}    <!-- 120 mm -->

e nel payload:

{
  "receipt": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ..."
}

Deve essere un data URI. Il base64 nudo è rifiutato, e il motivo vale una frase: una lunga sequenza di lettere è base64 valido, quindi un normale campo di testo verrebbe scambiato per un'immagine e sostituito in silenzio con niente. Il prefisso data:image/jpeg;base64, è una riga da aggiungere in qualunque linguaggio e toglie ogni dubbio.

Mandala a grandezza piena. Ogni immagine viene controllata come vero PNG, JPEG o WebP e poi ridotta per stare su una pagina stampata — una foto da telefono di 4000 pixel arriva a circa un sesto dei byte. Ridurla prima di inviarla costa solo qualità, e il limite del corpo è proprio quello che vorresti evitare: sono 10 MB di JSON, e il base64 aumenta il peso di circa il 37%, quindi circa 7 MB di foto per chiamata.

Un'immagine inutilizzabile costa quell'immagine, non il documento. Viene omessa, le altre sono messe al loro posto, e il job registra un avviso con quante erano. Una nota spese con dieci scontrini non fallisce perché il settimo era lo screenshot di uno screenshot.

Le liste funzionano come ogni altra lista:

{%p for picture in pictures %}
{{ picture.label }}
{{ picture.image:::img:150 }}
{%p endfor %}

Solo template Word. In un template HTML non c'è nulla dentro cui mettere un'immagine, e questo filtro non ti serve: metti lo stesso data URI direttamente in <img src=""> e funziona. Usare :::img in HTML lascia lo spazio vuoto e lo dice negli avvisi del job invece di fallire in silenzio.

Un URL non viene mai scaricato, in nessuno dei due motori. Un link fornito da un chiamante e aperto dal nostro server è una porta verso la nostra rete, e quella porta è chiusa di proposito.

Un codice scritto male è una riga di Errori comuni.