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

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