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_optionssont traduites en règles CSS@pageinjecté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
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.