API Markdown vers PDF#
L'API Markdown vers PDF convertit un fichier Markdown en document PDF stylisé via POST /v1/convert/markdown-to-pdf. Votre fichier .md ou .markdown est d'abord rendu en HTML, avec prise en charge des tableaux, des blocs de code délimités avec coloration syntaxique et d'une table des matières. Il est ensuite converti en PDF avec WeasyPrint. La réponse contient les octets bruts du PDF par défaut, ou des métadonnées JSON avec une URL de téléchargement présignée si direct_download=false ; tailles de page personnalisées, marges, en-têtes, pieds de page et sortie en niveaux de gris sont disponibles via pdf_options.
Endpoint#
POST /v1/convert/markdown-to-pdf
Content-Type : multipart/form-data
Entrée acceptée : fichiers .md ou .markdown (encodés en UTF-8)
Format de sortie : .pdf (application/pdf)
Authentification#
Nécessite soit une clé API privée, soit un token JWT issu d'une clé publique.
X-API-Key: sk_your_private_key
Ou :
Authorization: Bearer <jwt_token>
Paramètres de requête#
| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
file |
file | Oui | -- | Le fichier .md ou .markdown à 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 |
Si true, renvoie les octets bruts du PDF. Si 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 du PDF. Voir ci-dessous. |
Options PDF#
À passer sous forme de 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" |
Taille de page nommée. |
page_width |
float |
null |
Largeur de page personnalisée en millimètres. La largeur et la hauteur doivent être définies 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. |
header |
object |
null |
En-tête de page. Format : {"content": "<text>", "height": 15}. |
footer |
object |
null |
Pied de page. Même format que l'en-tête. |
Tailles de page prises en charge : A0-A6, B0-B5, Letter, Legal, Tabloid, Ledger
Variables de template pour en-tête/pied de page : {{page}}, {{total_pages}}, {{date}}, {{title}}, {{url}}
Détails de la conversion#
La conversion se déroule en deux étapes :
- Markdown vers HTML avec Python-Markdown et ses extensions :
tables-- tableaux délimités par des barres verticalesfenced_code-- blocs de code entre triples backtickscodehilite-- coloration syntaxiquetoc-- table des matières via le marqueur[TOC]-
attr_list-- attributs HTML via la syntaxe{.class #id} -
HTML vers PDF avec WeasyPrint et une feuille de style intégrée qui fournit :
- Pile de polices système, mise en page centrée avec largeur maximale de 800px
- Blocs de code, tableaux, citations et images stylisés
- Dimensionnement responsive des images (
max-width: 100%)
Les pdf_options sont injectées sous forme de règles CSS @page avant le rendu.
Réponse#
Téléchargement direct (direct_download=true, par défaut)#
HTTP 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="readme_20260405_123456789.pdf"
Réponse avec métadonnées (direct_download=false)#
{
"presigned_url": "https://spaces.example.com/...",
"object_key": "env/files/{project_id}/markdown-to-pdf/readme_20260405_123456789.pdf",
"filename": "readme_20260405_123456789.pdf",
"file_size": 34567,
"conversion_time_seconds": 0.8
}
Exemples de code#
Python#
import requests
import json
with open("README.md", "rb") as f:
response = requests.post(
"https://api.enconvert.com/v1/convert/markdown-to-pdf",
headers={"X-API-Key": "sk_your_private_key"},
files={"file": ("README.md", f, "text/markdown")},
data={
"pdf_options": json.dumps({
"page_size": "Letter",
"margins": {"top": 25, "bottom": 25, "left": 20, "right": 20},
"footer": {"content": "Page {{page}} of {{total_pages}}", "height": 10}
})
}
)
with open("README.pdf", "wb") as out:
out.write(response.content)
Node.js#
const form = new FormData();
form.append("file", fs.createReadStream("README.md"));
form.append("pdf_options", JSON.stringify({
page_size: "Letter",
footer: { content: "Page {{page}} of {{total_pages}}", height: 10 }
}));
const response = await fetch("https://api.enconvert.com/v1/convert/markdown-to-pdf", {
method: "POST",
headers: { "X-API-Key": "sk_your_private_key" },
body: form
});
fs.writeFileSync("README.pdf", Buffer.from(await response.arrayBuffer()));
PHP#
$ch = curl_init("https://api.enconvert.com/v1/convert/markdown-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("README.md", "text/markdown"),
"pdf_options" => json_encode(["page_size" => "Letter", "grayscale" => true])
]
]);
$pdf = curl_exec($ch);
curl_close($ch);
file_put_contents("README.pdf", $pdf);
Go#
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "README.md")
file, _ := os.Open("README.md")
io.Copy(part, file)
writer.WriteField("pdf_options", `{"page_size":"Letter","grayscale":true}`)
writer.Close()
req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/markdown-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)
Réponses d'erreur#
| Statut | Condition |
|---|---|
400 Bad Request |
Le fichier n'est pas un fichier .md ou .markdown |
400 Bad Request |
Encodage Markdown invalide (UTF-8 attendu) |
400 Bad Request |
Échec de la conversion Markdown vers PDF |
400 Bad Request |
JSON pdf_options invalide |
401 Unauthorized |
Clé API ou token JWT manquant ou invalide |
402 Payment Required |
Quota mensuel d'ops épuisé |
402 Payment Required |
Limite de stockage atteinte |
413 Payload Too Large |
Le fichier dépasse la taille maximale autorisée par le plan |
Limites#
| Limite | Valeur |
|---|---|
| Taille maximale de fichier | Selon le plan (Founding : 5 MB) |
| Encodage d'entrée | UTF-8 uniquement |
| Extensions acceptées | .md, .markdown |
| Contenu en-tête/pied de page | 2000 caractères max |
| Conversions mensuelles | Selon le plan |
Questions fréquentes#
Comment convertir un fichier Markdown en PDF avec une API REST ?#
Envoyez une requête multipart/form-data à POST /v1/convert/markdown-to-pdf avec votre fichier .md ou .markdown (encodé en UTF-8) dans le champ file, authentifiée via X-API-Key ou un JWT Bearer. Par défaut, les octets bruts du PDF sont renvoyés directement.
La conversion Markdown vers PDF prend-elle en charge les tableaux et la coloration syntaxique du code ?#
Oui. Le Markdown est rendu avec les extensions Python-Markdown, dont tables pour les tableaux délimités par des barres verticales, fenced_code pour les blocs de code entre triples backticks et codehilite pour la coloration syntaxique, puis stylisé par une feuille de style intégrée.
Puis-je ajouter une table des matières au PDF généré ?#
Oui. Placez un marqueur [TOC] dans votre Markdown : l'extension toc le rend sous forme de table des matières dans le document de sortie.
Comment ajouter des numéros de page à un PDF Markdown ?#
Définissez un footer (ou un header) dans le JSON pdf_options, par exemple {"content": "Page {{page}} of {{total_pages}}", "height": 10}. Les variables de template prises en charge sont {{page}}, {{total_pages}}, {{date}}, {{title}} et {{url}}.
Pourquoi ma requête renvoie-t-elle 400 Bad Request ?#
Causes fréquentes : le fichier n'est pas .md ou .markdown, le contenu n'est pas encodé en UTF-8, le champ pdf_options n'est pas du JSON valide, ou la conversion elle-même a échoué. Consultez le message d'erreur précis dans le corps de la réponse.