Guide · API REST

Un moteur de modèles DOCX que l'on appelle, pas que l'on installe

Champs de fusion Word standard, régions TableStart et TableEnd, emplacements d'images : le modèle reste un simple .docx que chacun peut modifier. Votre code envoie le fichier et les données, le moteur renvoie le document fini. Rien à installer, pas de Word sur le serveur, aucune syntaxe à apprendre.

Ce qu'une bibliothèque dans votre processus vous coûte

  • Une bibliothèque DOCX vous lie à un langage et à un runtime ; le service suivant, dans une autre pile, repart de zéro.
  • Rendre des documents avec Word sur un serveur impose de maintenir et de mettre à jour une installation Office en plus de votre application.
  • Les moteurs à syntaxe propriétaire font de chaque modèle un travail de développeur.

La requête

L'appel curl montre le transport multipart ; les exemples .NET, Java et Python ci-dessous utilisent le transport JSON (modèle encodé en base64 dans content) ou multipart, selon ce qui convient à chaque pile. L'enveloppe fields est la même partout.

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)

# The template is a plain .docx with MERGEFIELD placeholders and a TableStart:items region.
curl -sS https://api.xgenerate.io/v2/documents/generate \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@contract.docx" \
  -F "fields=@fields.json;type=application/json" \
  -F "format=PDF" \
  -o contract.pdf

Depuis .NET

using System.Net.Http.Json;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new("Bearer", token);

var request = new
{
    filename = "contract.docx",
    content = Convert.ToBase64String(await File.ReadAllBytesAsync("contract.docx")),
    format = "PDF",
    fields = new
    {
        fields = new[] { new { name = "customer.name", value = "Alpenblick Consulting AG" } }
    }
};
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 GenerateResult(string Filename, string Content, string Format);

From Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

var template = Base64.getEncoder().encodeToString(Files.readAllBytes(Path.of("contract.docx")));
var body = """
    {"filename": "contract.docx", "content": "%s", "format": "PDF",
     "fields": {"fields": [{"name": "customer.name", "value": "Alpenblick Consulting AG"}]}}
    """.formatted(template);

var request = HttpRequest.newBuilder(URI.create("https://api.xgenerate.io/v2/documents/generate"))
    .header("Authorization", "Bearer " + token)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());

// response.body() holds filename, content (base64), format and warnings:
// parse it with your JSON library and Base64-decode content into contract.pdf.

From Python

import requests

token = "..."  # client-credentials token from auth.xgenerate.io

with open("contract.docx", "rb") as template, open("fields.json", "rb") as fields:
    response = requests.post(
        "https://api.xgenerate.io/v2/documents/generate",
        headers={"Authorization": f"Bearer {token}"},
        files={
            "file": ("contract.docx", template),
            "fields": ("fields.json", fields, "application/json"),
        },
        data={"format": "PDF"},
        timeout=60,
    )
response.raise_for_status()

with open("contract.pdf", "wb") as out:
    out.write(response.content)

La réponse

Octets bruts sur le transport multipart, un objet JSON avec filename, content, format et warnings sur le transport JSON. Les avertissements nomment les emplacements d'image, de QR et d'en-tête restés sans valeur, ainsi que les remarques de rendu comme une substitution de police ; les champs de fusion et les régions sans données sont supprimés sans avertissement. La requête réussit dans les deux cas.

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