Guida · API REST
Compilare un template Word dal codice, senza Word
Due chiamate. La prima legge il template e restituisce ogni segnaposto che dichiara: campi unione, regioni ripetute, slot immagine e QR. La seconda invia i valori e restituisce il PDF o il DOCX finito. Niente Word sul server, niente interop Office, nessun componente aggiuntivo.
Cosa va storto senza un'API
- L'interop Office su un server è lento, a thread singolo e non supportato in modalità non presidiata.
- Modificare a mano document.xml si rompe appena qualcuno ridisegna il template in Word.
- Gli elenchi di segnaposto divergono: il codice attende campi che il template non ha più, o ne ignora di nuovi.
La richiesta
La chiamata di estrazione prende solo il template e risponde con la busta iniziale: una voce per segnaposto, valori null. Compili quella busta e la rimandi con il template all'endpoint di generazione.
TOKEN=$(curl -sS https://auth.xgenerate.io/realms/xgenerate/protocol/openid-connect/token \
-d grant_type=client_credentials \
-d client_id="$XGENERATE_CLIENT_ID" \
-d client_secret="$XGENERATE_CLIENT_SECRET" | jq -r .access_token)
# 1. Discover the placeholders: the seed envelope lists every field, region, image and QR-bill slot.
curl -sS https://api.xgenerate.io/v2/documents/fields \
-H "Authorization: Bearer $TOKEN" \
-F "file=@letter.docx" \
| jq '{fields: [.fields[].name], lists: [.lists[].name], images: [.images[].name]}'
# 2. Fill it: send the same template with the values.
cat > fields.json <<'JSON'
{ "fields": [
{ "name": "recipient.name", "value": "Camille Durand" },
{ "name": "letter.date", "value": "25.10.2026" },
{ "name": "letter.subject", "value": "Your contract renewal" } ] }
JSON
curl -sS https://api.xgenerate.io/v2/documents/generate \
-H "Authorization: Bearer $TOKEN" \
-F "file=@letter.docx" \
-F "fields=@fields.json;type=application/json" \
-F "format=PDF" \
-o letter.pdfDa .NET
using System.Net.Http.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new("Bearer", token);
var template = Convert.ToBase64String(await File.ReadAllBytesAsync("letter.docx"));
// 1. Discover the placeholders the template declares.
var extracted = await http.PostAsJsonAsync(
"https://api.xgenerate.io/v2/documents/fields", new { content = template });
extracted.EnsureSuccessStatusCode();
var seed = await extracted.Content.ReadFromJsonAsync<Envelope>();
// seed!.Fields holds one entry per merge field, each with Value null.
// 2. Fill them and render.
var request = new
{
filename = "letter.docx",
content = template,
format = "PDF",
fields = new
{
fields = new[]
{
new { name = "recipient.name", value = "Camille Durand" },
new { name = "letter.subject", value = "Your contract renewal" }
}
}
};
var response = await http.PostAsJsonAsync(
"https://api.xgenerate.io/v2/documents/generate", request);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<GenerateResult>();
await File.WriteAllBytesAsync(result!.Filename, Convert.FromBase64String(result.Content));
record Field(string Name, string? Value);
record Envelope(Field[] Fields);
record GenerateResult(string Filename, string Content, string Format);La risposta
La chiamata di estrazione restituisce la busta DocumentFields in JSON. La chiamata di generazione restituisce il PDF come byte grezzi sul trasporto multipart, oppure filename, content, format e warnings sul trasporto JSON; gli avvisi indicano gli slot immagine, QR e intestazione senza valore, e i campi unione senza dati vengono rimossi senza avviso.
Il risultato

Cosa XGenerate non fa
I template usano campi unione Word standard, regioni TableStart / TableEnd e segnaposto immagine tramite testo alternativo. Le espressioni di calcolo vengono valutate tramite un file di binding opzionale o l'API /bindings/evaluate, fuori dal template Word. I blocchi condizionali per valore non sono supportati; i campi IF di Word attorno a un testo sì.
Lo provi sul Suo template
Ci invii un file Word che usa oggi. Lo renderizziamo con i Suoi dati e Le restituiamo il PDF insieme al template adattato, così la Sua valutazione non deve aspettare noi.
Richiedi una demo