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
Note : 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.

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

{
    "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#

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#

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#

$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#

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.