Guida · API REST

Un motore di template DOCX da chiamare, non da installare

Campi unione Word standard, regioni TableStart e TableEnd, segnaposto immagine: il template resta un semplice .docx che chiunque può modificare. Il Suo codice invia file e dati, il motore restituisce il documento finito. Niente da installare, niente Word sul server, nessuna sintassi da imparare.

Cosa Le costa una libreria nel processo

  • Una libreria DOCX La lega a un linguaggio e a un runtime; il servizio successivo, in un altro stack, ricomincia da capo.
  • Renderizzare documenti con Word su un server richiede di mantenere e aggiornare un'installazione Office oltre all'applicazione.
  • I motori con una sintassi propria di segnaposto trasformano ogni template in lavoro da sviluppatore.

La richiesta

La chiamata curl mostra il trasporto multipart; gli esempi .NET, Java e Python qui sotto usano il trasporto JSON (template codificato in base64 in content) o multipart, secondo ciò che è comodo in ciascuno stack. La busta fields è la stessa ovunque.

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

Da .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 risposta

Byte grezzi sul trasporto multipart, un oggetto JSON con filename, content, format e warnings sul trasporto JSON. Gli avvisi indicano i segnaposto per immagini, QR e carta intestata rimasti senza valore, oltre a note di rendering come la sostituzione dei font; i campi unione e le regioni senza dati vengono rimossi senza avviso. La richiesta riesce in ogni caso.

Il risultato

Prima pagina della fattura di riferimento renderizzata: intestazione, blocco indirizzo, tabella delle righe e totali
La fattura di riferimento, renderizzata da un template Word con campi unione standard. Template, richiesta e PDF atteso: esempio pubblicato

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

Guide correlate