---
seo_title: API Markdown vers PDF : convertir du Markdown en PDF | EnConvert
meta_desc: Convertissez du Markdown en PDF via l'API REST. POST /v1/convert/markdown-to-pdf produit des PDF stylisés : tableaux, coloration syntaxique, en-têtes, pieds de page.
keywords: api markdown vers pdf, convertir markdown en pdf api, md en pdf api rest, markdown en pdf coloration syntaxique, readme en pdf api, api markdown pdf python, markdown en pdf node js, générer pdf depuis markdown api
---

# 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 :
   - `tables` -- tableaux délimités par des barres verticales
   - `fenced_code` -- blocs de code entre triples backticks
   - `codehilite` -- coloration syntaxique
   - `toc` -- table des matières via le marqueur `[TOC]`
   - `attr_list` -- attributs HTML via la syntaxe `{.class #id}`

2. **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`)

```json
{
    "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

```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

```javascript
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

```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

```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.
