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:
  2. tables -- Tabellen mit Pipe-Trennzeichen
  3. fenced_code -- Codeblöcke mit dreifachen Backticks
  4. codehilite -- Syntax-Highlighting
  5. toc -- Inhaltsverzeichnis über die [TOC]-Markierung
  6. attr_list -- HTML-Attribute über die {.class #id}-Syntax

  7. HTML zu PDF mit WeasyPrint und einem integrierten Stylesheet, das Folgendes bereitstellt:

  8. System-Font-Stack, zentriertes Layout mit 800px Maximalbreite
  9. Gestylte Codeblöcke, Tabellen, Blockquotes und Bilder
  10. 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)#

{
    "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#

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)

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.