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 :

  1. Markdown vers HTML avec Python-Markdown et ses extensions :
  2. tables -- tableaux délimités par des barres verticales
  3. fenced_code -- blocs de code entre triples backticks
  4. codehilite -- coloration syntaxique
  5. toc -- table des matières via le marqueur [TOC]
  6. attr_list -- attributs HTML via la syntaxe {.class #id}

  7. HTML vers PDF avec WeasyPrint et une feuille de style intégrée qui fournit :

  8. Pile de polices système, mise en page centrée avec largeur maximale de 800px
  9. Blocs de code, tableaux, citations et images stylisés
  10. 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.