Guide · API REST

Remplir un modèle Word depuis le code, sans Word

Deux appels. Le premier lit le modèle et renvoie chaque espace réservé qu'il déclare : champs de fusion, régions répétées, emplacements d'images et de QR. Le second envoie les valeurs et renvoie le PDF ou le DOCX fini. Pas de Word sur le serveur, pas d'interop Office, pas de complément.

Ce qui se passe mal sans API

  • L'interop Office sur un serveur est lente, monothread et non prise en charge en mode non surveillé.
  • Éditer document.xml à la main casse dès que quelqu'un restyle le modèle dans Word.
  • Les listes d'espaces réservés dérivent : le code attend des champs que le modèle n'a plus, ou en ignore de nouveaux.

La requête

L'appel d'extraction prend le modèle seul et répond avec l'enveloppe initiale : une entrée par espace réservé, valeurs null. Remplissez cette enveloppe et renvoyez-la avec le modèle au point de terminaison de génération.

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.pdf

Depuis .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 réponse

L'appel d'extraction renvoie l'enveloppe DocumentFields en JSON. L'appel de génération renvoie le PDF en octets bruts sur le transport multipart, ou filename, content, format et warnings sur le transport JSON ; les avertissements nomment les emplacements d'image, de QR et d'en-tête sans valeur, et les champs de fusion sans données sont supprimés sans avertissement.

Le résultat

Première page de la facture de référence rendue : en-tête, bloc d'adresse, tableau des lignes et totaux
La facture de référence, rendue à partir d'un modèle Word avec des champs de fusion standard. Modèle, requête et PDF attendu : exemple publié

Ce que XGenerate ne fait pas

Les modèles utilisent les champs de fusion Word standard, les régions TableStart / TableEnd et des emplacements d'images par texte alternatif. Les expressions de calcul sont évaluées via un fichier de liaisons optionnel ou l'API /bindings/evaluate, en dehors du modèle Word. Les blocs conditionnels selon une valeur ne sont pas pris en charge ; les champs IF de Word autour d'un texte le sont.

Essayez-le sur votre propre modèle

Envoyez-nous un fichier Word que vous utilisez aujourd'hui. Nous le rendons avec vos données et vous renvoyons le PDF avec le modèle adapté, pour que votre évaluation ne dépende pas de nous.

Demander une démo

Guides associés