HTML-zu-PDF-API#

Die HTML-zu-PDF-API konvertiert eine hochgeladene HTML-Datei per WeasyPrint-Rendering in ein hochwertiges PDF. Senden Sie eine .html- oder .htm-Datei an POST /v1/convert/html-to-pdf, und das gerenderte PDF wird synchron zurückgegeben, standardmäßig als Rohbytes oder bei direct_download=false als JSON-Metadaten mit einer Presigned Download-URL. Seitenformat, Ränder, Ausrichtung, Header, Footer und Graustufenausgabe werden alle über pdf_options gesteuert.


Endpunkt#

POST /v1/convert/html-to-pdf

Content-Type: multipart/form-data

Akzeptierte Eingabe: .html- oder .htm-Dateien (UTF-8-kodiert)

Ausgabeformat: .pdf (application/pdf)


Authentifizierung#

Erfordert entweder einen privaten API-Key oder ein per Public Key ausgestelltes JWT-Token.

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 .html- oder .htm-Datei. Muss UTF-8-kodiert sein.
output_filename string Nein Name der Eingabedatei Eigener Ausgabedateiname. Die Endung .pdf wird automatisch angehängt.
direct_download boolean Nein true Bei true werden die PDF-Rohbytes zurückgegeben. Bei false werden JSON-Metadaten mit einer Presigned Download-URL zurückgegeben.
pdf_options string Nein null JSON-String mit PDF-Konfigurationsoptionen. Siehe unten.

PDF-Optionen#

Als JSON-String im Formularfeld pdf_options übergeben. Alle Felder sind optional.

Parameter Typ Standard Beschreibung
page_size string "A4" Benanntes Seitenformat. Wird ignoriert, wenn page_width und page_height beide gesetzt sind.
page_width float null Eigene Seitenbreite in Millimetern. page_width und page_height müssen gemeinsam gesetzt werden.
page_height float null Eigene 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 Konvertiert die Ausgabe per Ghostscript-Nachbearbeitung in Graustufen.
header object null Seitenkopf. Format: {"content": "<text>", "height": 15}. Unterstützt Template-Variablen.
footer object null Seitenfuß. Gleiches Format wie der Header.

Unterstützte Seitenformate: A0, A1, A2, A3, A4, A5, A6, B0, B1, B2, B3, B4, B5, Letter, Legal, Tabloid, Ledger

Template-Variablen für Header/Footer: {{page}}, {{total_pages}}, {{date}}, {{title}}, {{url}}


Konvertierungsdetails#

  • Verwendet WeasyPrint für CSS-basiertes PDF-Rendering
  • Die pdf_options werden in CSS-@page-Regeln übersetzt, die vor dem Rendern in das HTML injiziert werden
  • WeasyPrint berücksichtigt zusätzlich zu den injizierten Seitenregeln die eigenen CSS-Styles des Dokuments
  • Das gesamte Rendering erfolgt synchron und serverseitig
Hinweis: Per URL referenzierte externe Ressourcen im HTML (Bilder, Stylesheets, Schriften) werden möglicherweise nicht aufgelöst. Verwenden Sie für beste Ergebnisse Inline-CSS und base64-kodierte Bilder, oder stellen Sie sicher, dass alle Ressourcen öffentlich erreichbar sind.

Response#

Direkter Download (direct_download=true, Standard)#

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

Gibt die PDF-Rohbytes zurück.

Metadaten-Response (direct_download=false)#

{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/html-to-pdf/document_20260405_123456789.pdf",
    "filename": "document_20260405_123456789.pdf",
    "file_size": 45678,
    "conversion_time_seconds": 1.2
}

Codebeispiele#

Python#

import requests
import json

with open("report.html", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/html-to-pdf",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("report.html", f, "text/html")},
        data={
            "pdf_options": json.dumps({
                "page_size": "A4",
                "orientation": "portrait",
                "margins": {"top": 20, "bottom": 20, "left": 15, "right": 15}
            })
        }
    )

with open("report.pdf", "wb") as out:
    out.write(response.content)

Node.js#

const form = new FormData();
form.append("file", fs.createReadStream("report.html"));
form.append("pdf_options", JSON.stringify({
    page_size: "A4",
    orientation: "portrait",
    margins: { top: 20, bottom: 20, left: 15, right: 15 }
}));

const response = await fetch("https://api.enconvert.com/v1/convert/html-to-pdf", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

fs.writeFileSync("report.pdf", Buffer.from(await response.arrayBuffer()));

PHP#

$ch = curl_init("https://api.enconvert.com/v1/convert/html-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("report.html", "text/html"),
        "pdf_options" => json_encode([
            "page_size" => "A4",
            "margins" => ["top" => 20, "bottom" => 20, "left" => 15, "right" => 15]
        ])
    ]
]);
$pdf = curl_exec($ch);
curl_close($ch);
file_put_contents("report.pdf", $pdf);

Go#

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)

part, _ := writer.CreateFormFile("file", "report.html")
file, _ := os.Open("report.html")
io.Copy(part, file)

writer.WriteField("pdf_options", `{"page_size":"A4","margins":{"top":20,"bottom":20,"left":15,"right":15}}`)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/html-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 .html- oder .htm-Datei
400 Bad Request Ungültige HTML-Kodierung (UTF-8 erwartet)
400 Bad Request HTML-zu-PDF-Konvertierung fehlgeschlagen
400 Bad Request Ungültiges pdf_options-JSON
401 Unauthorized Fehlender oder ungültiger API-Key / 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
Maximale Dateigröße Planabhängig (Founding: 5 MB)
Eingabekodierung Nur UTF-8
Header-/Footer-Inhalt Max. 2000 Zeichen
Skalierungsbereich 0.1 -- 2.0
Monatliche Konvertierungen Planabhängig

Häufig gestellte Fragen#

Wie konvertiere ich HTML per REST API in PDF?#

Senden Sie einen multipart/form-data-Request an POST /v1/convert/html-to-pdf mit Ihrer .html- oder .htm-Datei im Feld file, authentifiziert via X-API-Key oder Bearer-JWT. Standardmäßig ist die Response das rohe PDF mit Content-Type: application/pdf.

Kann ich Seitenformat, Ränder oder Ausrichtung des PDFs anpassen?#

Ja. Übergeben Sie einen JSON-String im Formularfeld pdf_options mit page_size (z. B. A4, Letter, Legal), margins in Millimetern und orientation (portrait oder landscape). Für abweichende Abmessungen setzen Sie page_width und page_height gemeinsam in Millimetern.

Setzen Sie header oder footer in pdf_options als {"content": "<text>", "height": 15}. Der Inhalt unterstützt die Template-Variablen {{page}}, {{total_pages}}, {{date}}, {{title}} und {{url}} und ist auf 2000 Zeichen begrenzt.

Warum fehlen Bilder, Schriften oder Stylesheets in meiner PDF-Ausgabe?#

Per URL referenzierte externe Ressourcen im HTML werden beim serverseitigen Rendern möglicherweise nicht aufgelöst. Verwenden Sie Inline-CSS und base64-kodierte Bilder, oder stellen Sie sicher, dass alle referenzierten Ressourcen öffentlich erreichbar sind.

Kann ich statt der PDF-Rohbytes eine Download-URL erhalten?#

Ja. Setzen Sie direct_download=false, und der Endpunkt gibt statt des PDF-Bodys JSON-Metadaten zurück, darunter presigned_url, object_key, filename, file_size und conversion_time_seconds.