---
seo_title: Markdown-zu-PDF-API: .md-Dateien in PDF umwandeln | EnConvert
meta_desc: Markdown per REST API in PDF umwandeln. POST /v1/convert/markdown-to-pdf rendert .md-Dateien zu gestylten PDFs mit Tabellen, Code-Highlighting und Fußzeilen.
keywords: markdown in pdf umwandeln api, markdown zu pdf api, md in pdf konvertieren api, markdown to pdf rest api, readme in pdf umwandeln, markdown pdf api python, markdown pdf api node js, markdown zu pdf mit syntax highlighting
---

# Markdown-zu-PDF-API

Die Markdown-zu-PDF-API konvertiert eine Markdown-Datei über `POST /v1/convert/markdown-to-pdf` in ein gestyltes PDF-Dokument. Ihre `.md`- oder `.markdown`-Datei wird zunächst zu HTML gerendert, inklusive Unterstützung für Tabellen, Fenced-Code-Blöcke mit Syntax-Highlighting und ein Inhaltsverzeichnis. Anschließend wird das HTML mit WeasyPrint in ein PDF umgewandelt. Die Antwort besteht standardmäßig aus rohen PDF-Bytes oder, bei `direct_download=false`, aus JSON-Metadaten mit einer vorsignierten Download-URL; benutzerdefinierte Seitengrößen, Ränder, Kopf- und Fußzeilen sowie Graustufen-Ausgabe sind über `pdf_options` verfügbar.

---

## Endpunkt

```
POST /v1/convert/markdown-to-pdf
```

**Content-Type:** `multipart/form-data`

**Akzeptierte Eingabe:** `.md`- oder `.markdown`-Dateien (UTF-8-kodiert)

**Ausgabeformat:** `.pdf` (`application/pdf`)

---

## Authentifizierung

Erfordert entweder einen privaten API-Schlüssel oder ein JWT-Token von einem öffentlichen Schlüssel.

```
X-API-Key: sk_your_private_key
```

Oder:

```
Authorization: Bearer <jwt_token>
```

---

## Request-Parameter

| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|-----------|------|----------|---------|-------------|
| `file` | file | Ja | -- | Die zu konvertierende `.md`- oder `.markdown`-Datei. Muss UTF-8-kodiert sein. |
| `output_filename` | `string` | Nein | Name der Eingabedatei | Benutzerdefinierter Ausgabedateiname. Die Erweiterung `.pdf` wird automatisch angehängt. |
| `direct_download` | `boolean` | Nein | `true` | Bei `true` werden rohe PDF-Bytes zurückgegeben. Bei `false` werden JSON-Metadaten mit einer vorsignierten Download-URL zurückgegeben. |
| `pdf_options` | `string` | Nein | `null` | JSON-String mit PDF-Konfigurationsoptionen. Siehe unten. |

### PDF-Optionen

Wird als JSON-String im Formularfeld `pdf_options` übergeben. Alle Felder sind optional.

| Parameter | Typ | Standard | Beschreibung |
|-----------|------|---------|-------------|
| `page_size` | `string` | `"A4"` | Benannte Seitengröße. |
| `page_width` | `float` | `null` | Benutzerdefinierte Seitenbreite in Millimetern. Breite und Höhe müssen zusammen gesetzt werden. |
| `page_height` | `float` | `null` | Benutzerdefinierte Seitenhöhe in Millimetern. |
| `orientation` | `string` | `"portrait"` | `"portrait"` oder `"landscape"`. |
| `margins` | `object` | `{"top": 10, "bottom": 10, "left": 10, "right": 10}` | Seitenränder in Millimetern. |
| `grayscale` | `boolean` | `false` | Wandelt die Ausgabe in Graustufen um. |
| `header` | `object` | `null` | Seitenkopfzeile. Format: `{"content": "<text>", "height": 15}`. |
| `footer` | `object` | `null` | Seitenfußzeile. Gleiches Format wie die Kopfzeile. |

**Unterstützte Seitengrößen:** `A0`-`A6`, `B0`-`B5`, `Letter`, `Legal`, `Tabloid`, `Ledger`

**Template-Variablen für Kopf-/Fußzeilen:** `{{page}}`, `{{total_pages}}`, `{{date}}`, `{{title}}`, `{{url}}`

---

## Konvertierungsdetails

Die Konvertierung ist ein zweistufiger Prozess:

1. **Markdown zu HTML** mit Python-Markdown und folgenden Extensions:
   - `tables` -- Tabellen mit Pipe-Trennzeichen
   - `fenced_code` -- Codeblöcke mit dreifachen Backticks
   - `codehilite` -- Syntax-Highlighting
   - `toc` -- Inhaltsverzeichnis über die `[TOC]`-Markierung
   - `attr_list` -- HTML-Attribute über die `{.class #id}`-Syntax

2. **HTML zu PDF** mit WeasyPrint und einem integrierten Stylesheet, das Folgendes bereitstellt:
   - System-Font-Stack, zentriertes Layout mit 800px Maximalbreite
   - Gestylte Codeblöcke, Tabellen, Blockquotes und Bilder
   - Responsive Bildgrößen (`max-width: 100%`)

Die `pdf_options` werden vor dem Rendern als CSS-`@page`-Regeln injiziert.

---

## Antwort

### Direktdownload (`direct_download=true`, Standard)

```
HTTP 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="readme_20260405_123456789.pdf"
```

### Metadaten-Antwort (`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
}
```

---

## Codebeispiele

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

---

## Fehlerantworten

| Status | Bedingung |
|--------|-----------|
| `400 Bad Request` | Datei ist keine `.md`- oder `.markdown`-Datei |
| `400 Bad Request` | Ungültige Markdown-Kodierung (UTF-8 erwartet) |
| `400 Bad Request` | Markdown-zu-PDF-Konvertierung fehlgeschlagen |
| `400 Bad Request` | Ungültiges `pdf_options`-JSON |
| `401 Unauthorized` | Fehlender oder ungültiger API-Schlüssel / JWT-Token |
| `402 Payment Required` | Monatliches Ops-Kontingent aufgebraucht |
| `402 Payment Required` | Speicherlimit erreicht |
| `413 Payload Too Large` | Datei überschreitet die maximale Dateigröße des Plans |

---

## Limits

| Limit | Wert |
|-------|-------|
| Max. Dateigröße | Planabhängig (Founding: 5 MB) |
| Eingabekodierung | Nur UTF-8 |
| Akzeptierte Erweiterungen | `.md`, `.markdown` |
| Kopf-/Fußzeileninhalt | Max. 2000 Zeichen |
| Monatliche Konvertierungen | Planabhängig |

## Häufig gestellte Fragen

### Wie konvertiere ich eine Markdown-Datei per REST API in ein PDF?

Senden Sie eine `multipart/form-data`-Anfrage an `POST /v1/convert/markdown-to-pdf` mit Ihrer `.md`- oder `.markdown`-Datei (UTF-8-kodiert) im Feld `file`, authentifiziert über `X-API-Key` oder ein Bearer-JWT. Standardmäßig werden die rohen PDF-Bytes direkt zurückgegeben.

### Unterstützt die Markdown-zu-PDF-Konvertierung Tabellen und Syntax-Highlighting für Code?

Ja. Das Markdown wird mit Python-Markdown-Extensions gerendert, darunter `tables` für Tabellen mit Pipe-Trennzeichen, `fenced_code` für Codeblöcke mit dreifachen Backticks und `codehilite` für Syntax-Highlighting, und anschließend mit einem integrierten Stylesheet gestylt.

### Kann ich dem generierten PDF ein Inhaltsverzeichnis hinzufügen?

Ja. Platzieren Sie eine `[TOC]`-Markierung in Ihrem Markdown. Die `toc`-Extension rendert sie als Inhaltsverzeichnis im Ausgabedokument.

### Wie füge ich einem Markdown-PDF Seitenzahlen hinzu?

Setzen Sie einen `footer` (oder `header`) im `pdf_options`-JSON, z. B. `{"content": "Page {{page}} of {{total_pages}}", "height": 10}`. Unterstützte Template-Variablen sind `{{page}}`, `{{total_pages}}`, `{{date}}`, `{{title}}` und `{{url}}`.

### Warum gibt meine Anfrage 400 Bad Request zurück?

Häufige Ursachen: Die Datei ist keine `.md`- oder `.markdown`-Datei, der Inhalt ist nicht UTF-8-kodiert, das Feld `pdf_options` enthält kein gültiges JSON oder die Konvertierung selbst ist fehlgeschlagen. Prüfen Sie die konkrete Fehlermeldung im Response-Body.
