API HTML in PDF#

L'API HTML in PDF converte un file HTML caricato in un PDF di alta qualità usando il rendering di WeasyPrint. Invia un file .html o .htm a POST /v1/convert/html-to-pdf e il PDF renderizzato viene restituito in modo sincrono, come byte grezzi per impostazione predefinita, oppure come metadati JSON con un URL di download prefirmato quando direct_download=false. Formato pagina, margini, orientamento, header, footer e output in scala di grigi si controllano tutti tramite pdf_options.


Endpoint#

POST /v1/convert/html-to-pdf

Content-Type: multipart/form-data

Input accettato: file .html o .htm (codificati in UTF-8)

Formato di output: .pdf (application/pdf)


Autenticazione#

Richiede una chiave API privata oppure un token JWT ottenuto da una chiave pubblica.

X-API-Key: sk_your_private_key

Oppure:

Authorization: Bearer <jwt_token>

Parametri della richiesta#

Parametro Tipo Obbligatorio Predefinito Descrizione
file file -- Il file .html o .htm da convertire. Deve essere codificato in UTF-8.
output_filename string No Nome file di input Nome file di output personalizzato. L'estensione .pdf viene aggiunta automaticamente.
direct_download boolean No true Con true, restituisce i byte PDF grezzi. Con false, restituisce metadati JSON con un URL di download prefirmato.
pdf_options string No null Stringa JSON con le opzioni di configurazione del PDF. Vedi sotto.

Opzioni PDF#

Passa una stringa JSON nel campo form pdf_options. Tutti i campi sono opzionali.

Parametro Tipo Predefinito Descrizione
page_size string "A4" Formato pagina con nome. Ignorato quando sono impostati sia page_width sia page_height.
page_width float null Larghezza pagina personalizzata in millimetri. page_width e page_height vanno impostati insieme.
page_height float null Altezza pagina personalizzata in millimetri.
orientation string "portrait" "portrait" oppure "landscape".
margins object {"top": 10, "bottom": 10, "left": 10, "right": 10} Margini della pagina in millimetri.
grayscale boolean false Converte l'output in scala di grigi tramite post-elaborazione Ghostscript.
header object null Header di pagina. Formato: {"content": "<text>", "height": 15}. Supporta le variabili template.
footer object null Footer di pagina. Stesso formato dell'header.

Formati pagina supportati: A0, A1, A2, A3, A4, A5, A6, B0, B1, B2, B3, B4, B5, Letter, Legal, Tabloid, Ledger

Variabili template per header/footer: {{page}}, {{total_pages}}, {{date}}, {{title}}, {{url}}


Dettagli della conversione#

  • Usa WeasyPrint per il rendering PDF basato su CSS
  • Le pdf_options vengono tradotte in regole CSS @page iniettate nell'HTML prima del rendering
  • WeasyPrint rispetta gli stili CSS propri del documento oltre alle regole di pagina iniettate
  • Tutto il rendering è sincrono e lato server
Nota: Le risorse esterne referenziate tramite URL nell'HTML (immagini, fogli di stile, font) potrebbero non essere risolte. Per risultati ottimali, usa CSS inline e immagini codificate in base64, oppure assicurati che tutte le risorse siano accessibili pubblicamente.

Risposta#

Download diretto (direct_download=true, predefinito)#

HTTP 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="document_20260405_123456789.pdf"

Restituisce i byte PDF grezzi.

Risposta con metadati (direct_download=false)#

{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/html-to-pdf/document_20260405_123456789.pdf",
    "filename": "document_20260405_123456789.pdf",
    "file_size": 45678,
    "conversion_time_seconds": 1.2
}

Esempi di codice#

Python#

import requests
import json

with open("report.html", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/html-to-pdf",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("report.html", f, "text/html")},
        data={
            "pdf_options": json.dumps({
                "page_size": "A4",
                "orientation": "portrait",
                "margins": {"top": 20, "bottom": 20, "left": 15, "right": 15}
            })
        }
    )

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

Node.js#

const form = new FormData();
form.append("file", fs.createReadStream("report.html"));
form.append("pdf_options", JSON.stringify({
    page_size: "A4",
    orientation: "portrait",
    margins: { top: 20, bottom: 20, left: 15, right: 15 }
}));

const response = await fetch("https://api.enconvert.com/v1/convert/html-to-pdf", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

fs.writeFileSync("report.pdf", Buffer.from(await response.arrayBuffer()));

PHP#

$ch = curl_init("https://api.enconvert.com/v1/convert/html-to-pdf");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => [
        "file" => new CURLFile("report.html", "text/html"),
        "pdf_options" => json_encode([
            "page_size" => "A4",
            "margins" => ["top" => 20, "bottom" => 20, "left" => 15, "right" => 15]
        ])
    ]
]);
$pdf = curl_exec($ch);
curl_close($ch);
file_put_contents("report.pdf", $pdf);

Go#

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)

part, _ := writer.CreateFormFile("file", "report.html")
file, _ := os.Open("report.html")
io.Copy(part, file)

writer.WriteField("pdf_options", `{"page_size":"A4","margins":{"top":20,"bottom":20,"left":15,"right":15}}`)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/html-to-pdf", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)

Risposte di errore#

Stato Condizione
400 Bad Request Il file non è un file .html o .htm
400 Bad Request Codifica HTML non valida (attesa UTF-8)
400 Bad Request Conversione da HTML a PDF non riuscita
400 Bad Request JSON di pdf_options non valido
401 Unauthorized Chiave API / token JWT mancante o non valido
402 Payment Required Quota mensile di ops esaurita
402 Payment Required Limite di archiviazione raggiunto
413 Payload Too Large Il file supera la dimensione massima prevista dal piano

Limiti#

Limite Valore
Dimensione massima del file Dipende dal piano (Founding: 5 MB)
Codifica di input Solo UTF-8
Contenuto header/footer Massimo 2000 caratteri
Intervallo di scala 0.1 -- 2.0
Conversioni mensili Dipende dal piano

Domande frequenti#

Come convertire HTML in PDF con un'API REST?#

Invia una richiesta multipart/form-data a POST /v1/convert/html-to-pdf con il file .html o .htm nel campo file, autenticandoti con X-API-Key o un JWT Bearer. Per impostazione predefinita la risposta contiene i byte PDF grezzi con Content-Type: application/pdf.

Posso impostare formato pagina, margini o orientamento personalizzati per il PDF?#

Sì. Passa una stringa JSON nel campo form pdf_options con page_size (es. A4, Letter, Legal), margins in millimetri e orientation (portrait o landscape). Per dimensioni non standard, imposta page_width e page_height insieme in millimetri.

Imposta header o footer in pdf_options come {"content": "<text>", "height": 15}. Il contenuto supporta le variabili template {{page}}, {{total_pages}}, {{date}}, {{title}} e {{url}}, ed è limitato a 2000 caratteri.

Perché immagini, font o fogli di stile mancano dal mio PDF?#

Le risorse esterne referenziate tramite URL nell'HTML potrebbero non essere risolte durante il rendering lato server. Usa CSS inline e immagini codificate in base64, oppure assicurati che tutte le risorse referenziate siano accessibili pubblicamente.

Posso ottenere un URL di download invece dei byte PDF grezzi?#

Sì. Imposta direct_download=false e l'endpoint restituisce metadati JSON che includono presigned_url, object_key, filename, file_size e conversion_time_seconds al posto del corpo PDF.