---
seo_title: API HTML in PDF: converti file HTML in PDF | EnConvert
meta_desc: Converti HTML in PDF con un'API REST. POST /v1/convert/html-to-pdf renderizza file HTML in PDF con WeasyPrint: formati pagina, margini, header e footer.
keywords: html in pdf api, convertire html in pdf api, generare pdf da html api, html to pdf rest api, weasyprint html in pdf api, html in pdf python, html in pdf node js, api conversione html pdf
---

# 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 | Sì | -- | 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

<div class="alert alert-info">
<strong>Nota:</strong> 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.
</div>

---

## 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`)

```json
{
    "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

```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

```javascript
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

```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

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

### Come aggiungo numeri di pagina, header o footer al PDF generato?

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.
