---
seo_title: API HTML vers PDF — Convertir du HTML en PDF | EnConvert
meta_desc: Convertissez du HTML en PDF avec une API REST. POST /v1/convert/html-to-pdf rend vos fichiers HTML en PDF via WeasyPrint — formats, marges, en-têtes, pieds de page.
keywords: api html vers pdf, convertir html en pdf api, html en pdf api rest, générer pdf depuis html api, weasyprint html pdf api, html en pdf python api, html en pdf node js api, créer pdf à partir de html api
---

# API HTML vers PDF

L'API HTML vers PDF convertit un fichier HTML envoyé en un PDF de haute qualité grâce au rendu WeasyPrint. Envoyez un fichier `.html` ou `.htm` vers `POST /v1/convert/html-to-pdf` et le PDF rendu est renvoyé de manière synchrone — en octets bruts par défaut, ou en métadonnées JSON avec une URL de téléchargement présignée lorsque `direct_download=false`. Format de page, marges, orientation, en-têtes, pieds de page et sortie en niveaux de gris se contrôlent via `pdf_options`.

---

## Endpoint

```
POST /v1/convert/html-to-pdf
```

**Content-Type :** `multipart/form-data`

**Entrée acceptée :** fichiers `.html` ou `.htm` (encodés en UTF-8)

**Format de sortie :** `.pdf` (`application/pdf`)

---

## Authentification

Nécessite une clé API privée ou un token JWT obtenu à partir d'une clé publique.

```
X-API-Key: sk_live_your_private_key
```

Ou :

```
Authorization: Bearer <jwt_token>
```

---

## Paramètres de requête

| Paramètre | Type | Obligatoire | Défaut | Description |
|-----------|------|----------|---------|-------------|
| `file` | file | Oui | -- | Le fichier `.html` ou `.htm` à convertir. Doit être encodé en UTF-8. |
| `output_filename` | `string` | Non | Nom du fichier d'entrée | Nom de fichier de sortie personnalisé. L'extension `.pdf` est ajoutée automatiquement. |
| `direct_download` | `boolean` | Non | `true` | À `true`, renvoie les octets PDF bruts. À `false`, renvoie des métadonnées JSON avec une URL de téléchargement présignée. |
| `pdf_options` | `string` | Non | `null` | Chaîne JSON contenant les options de configuration PDF. Voir ci-dessous. |

### Options PDF

Passez une chaîne JSON dans le champ de formulaire `pdf_options`. Tous les champs sont optionnels.

| Paramètre | Type | Défaut | Description |
|-----------|------|---------|-------------|
| `page_size` | `string` | `"A4"` | Format de page nommé. Ignoré lorsque `page_width` et `page_height` sont tous deux définis. |
| `page_width` | `float` | `null` | Largeur de page personnalisée en millimètres. `page_width` et `page_height` doivent être définis ensemble. |
| `page_height` | `float` | `null` | Hauteur de page personnalisée en millimètres. |
| `orientation` | `string` | `"portrait"` | `"portrait"` ou `"landscape"`. |
| `margins` | `object` | `{"top": 10, "bottom": 10, "left": 10, "right": 10}` | Marges de page en millimètres. |
| `grayscale` | `boolean` | `false` | Convertit la sortie en niveaux de gris via un post-traitement Ghostscript. |
| `header` | `object` | `null` | En-tête de page. Format : `{"content": "<text>", "height": 15}`. Prend en charge les variables de template. |
| `footer` | `object` | `null` | Pied de page. Même format que l'en-tête. |

**Formats de page pris en charge :** `A0`, `A1`, `A2`, `A3`, `A4`, `A5`, `A6`, `B0`, `B1`, `B2`, `B3`, `B4`, `B5`, `Letter`, `Legal`, `Tabloid`, `Ledger`

**Variables de template pour en-tête/pied de page :** `{{page}}`, `{{total_pages}}`, `{{date}}`, `{{title}}`, `{{url}}`

---

## Détails de conversion

- Utilise **WeasyPrint** pour un rendu PDF basé sur CSS
- Les `pdf_options` sont traduites en règles CSS `@page` injectées dans le HTML avant le rendu
- WeasyPrint respecte les styles CSS propres au document en plus des règles de page injectées
- Tout le rendu est synchrone et côté serveur

<div class="alert alert-info">
<strong>Note :</strong> Les ressources externes référencées par URL dans le HTML (images, feuilles de style, polices) peuvent ne pas être résolues. Pour de meilleurs résultats, utilisez du CSS inline et des images encodées en base64, ou assurez-vous que toutes les ressources sont accessibles publiquement.
</div>

---

## Réponse

### Téléchargement direct (`direct_download=true`, par défaut)

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

Renvoie les octets PDF bruts.

### Réponse avec métadonnées (`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
}
```

---

## Exemples de code

### 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_live_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_live_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_live_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_live_your_private_key")
resp, _ := http.DefaultClient.Do(req)
```

---

## Réponses d'erreur

| Statut | Condition |
|--------|-----------|
| `400 Bad Request` | Le fichier n'est pas un fichier `.html` ou `.htm` |
| `400 Bad Request` | Encodage HTML invalide (UTF-8 attendu) |
| `400 Bad Request` | La conversion HTML vers PDF a échoué |
| `400 Bad Request` | JSON `pdf_options` invalide |
| `401 Unauthorized` | Clé API ou token JWT manquant ou invalide |
| `402 Payment Required` | Limite mensuelle de conversions atteinte |
| `402 Payment Required` | Limite de stockage atteinte |
| `413 Payload Too Large` | Le fichier dépasse la taille maximale du plan |

---

## Limites

| Limite | Valeur |
|-------|-------|
| Taille max. de fichier | Selon le plan (Free : 5 MB) |
| Encodage d'entrée | UTF-8 uniquement |
| Contenu en-tête/pied de page | 2000 caractères max |
| Plage d'échelle | 0.1 -- 2.0 |
| Conversions mensuelles | Selon le plan |

## Questions fréquentes

### Comment convertir du HTML en PDF avec une API REST ?

Envoyez une requête `multipart/form-data` vers `POST /v1/convert/html-to-pdf` avec votre fichier `.html` ou `.htm` dans le champ `file`, en vous authentifiant via `X-API-Key` ou un JWT Bearer. Par défaut, la réponse contient les octets PDF bruts avec `Content-Type: application/pdf`.

### Puis-je définir un format de page, des marges ou une orientation personnalisés pour le PDF ?

Oui. Passez une chaîne JSON dans le champ de formulaire `pdf_options` avec `page_size` (p. ex. `A4`, `Letter`, `Legal`), `margins` en millimètres et `orientation` (`portrait` ou `landscape`). Pour des dimensions non standard, définissez `page_width` et `page_height` ensemble, en millimètres.

### Comment ajouter des numéros de page, des en-têtes ou des pieds de page au PDF généré ?

Définissez `header` ou `footer` dans `pdf_options` au format `{"content": "<text>", "height": 15}`. Le contenu prend en charge les variables de template `{{page}}`, `{{total_pages}}`, `{{date}}`, `{{title}}` et `{{url}}`, et est limité à 2000 caractères.

### Pourquoi des images, polices ou feuilles de style manquent-elles dans mon PDF ?

Les ressources externes référencées par URL dans le HTML peuvent ne pas être résolues lors du rendu côté serveur. Utilisez du CSS inline et des images encodées en base64, ou assurez-vous que toutes les ressources référencées sont accessibles publiquement.

### Puis-je obtenir une URL de téléchargement au lieu des octets PDF bruts ?

Oui. Définissez `direct_download=false` et l'endpoint renvoie des métadonnées JSON incluant `presigned_url`, `object_key`, `filename`, `file_size` et `conversion_time_seconds` à la place du corps PDF.
