Leitfaden · REST-API
Serienbrief: eine PDF pro Empfänger
Der Seriendruck in Word erzeugt ein langes Dokument. Ein API-Aufruf erzeugt ein Dokument: Schleife über Ihre Empfänger, dieselbe Vorlage mit den Werten jedes Datensatzes, jede PDF mit eindeutigem Dateinamen. Briefe, Zertifikate, Lohnabrechnungen, Rechnungen.
Wo der Seriendruck in Word aufhört
- Der Seriendruck schreibt eine Datei für alle Datensätze; die Aufteilung in einzelne PDFs braucht Makros oder Handarbeit.
- Er braucht Word auf einem Arbeitsplatz und eine Person, die ihn startet, und passt deshalb in keinen Workflow und keinen Nachtlauf.
- Anhänge, Dateinamen und Archivierung pro Empfänger liegen ausserhalb dessen, was der Seriendruck kann.
Die Anfrage
Eine Anfrage pro Datensatz: die Schleife baut aus jedem Empfänger einen Fields-Envelope und sendet ihn mit der Vorlage. Der Dienst ist zustandslos, Anfragen dürfen parallel laufen; den Dateinamen wählen Sie.
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)
# recipients.json holds one object per letter:
# [ { "name": "Camille Durand", "street": "12 rue de la République", "city": "69002 Lyon" }, ... ]
index=0
jq -c '.[]' recipients.json | while IFS= read -r r; do
index=$((index + 1))
jq -n --argjson r "$r" '{ fields: [
{ name: "recipient.name", value: $r.name },
{ name: "recipient.street", value: $r.street },
{ name: "recipient.city", value: $r.city } ] }' > fields.json
out="letter-$index.pdf"
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 "$out"
doneAus .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"));
var recipients = new[]
{
new { Name = "Camille Durand", Street = "12 rue de la République", City = "69002 Lyon" },
new { Name = "Jonas Keller", Street = "Bahnhofstrasse 10", City = "8001 Zürich" }
};
// One request per recipient; the service is stateless, so run them in parallel if you like.
for (var index = 0; index < recipients.Length; index++)
{
var r = recipients[index];
var request = new
{
filename = "letter.docx",
content = template,
format = "PDF",
fields = new
{
fields = new[]
{
new { name = "recipient.name", value = r.Name },
new { name = "recipient.street", value = r.Street },
new { name = "recipient.city", value = r.City }
}
}
};
var response = await http.PostAsJsonAsync(
"https://api.xgenerate.io/v2/documents/generate", request);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<GenerateResult>();
var file = $"letter-{index + 1}.pdf";
await File.WriteAllBytesAsync(file, Convert.FromBase64String(result!.Content));
}
record GenerateResult(string Filename, string Content, string Format);Die Antwort
Jeder Aufruf streamt eine PDF beim Multipart-Transport zurück oder liefert filename, content, format und warnings beim JSON-Transport. Warnungen nennen Bild-, QR- und Briefkopf-Slots ohne Wert; Seriendruckfelder und Bereiche ohne Daten werden ohne Warnung entfernt.
Das Ergebnis

Was XGenerate nicht tut
Es gibt keinen Batch-Endpoint: eine Anfrage pro Dokument, gesteuert von Ihrer Schleife oder Warteschlange. Der Schweizer QR-Zahlteil ist nur im PDF möglich.
Testen Sie es mit Ihrer eigenen Vorlage
Schicken Sie uns eine Word-Datei, die Sie heute verwenden. Wir rendern sie mit Ihren Daten und senden das PDF zusammen mit der angepassten Vorlage zurück — Ihre Evaluation muss nicht auf uns warten.
Demo anfragen