---
seo_title: HTML zu PDF API: HTML-Dateien in PDF konvertieren | EnConvert
meta_desc: HTML in PDF konvertieren per REST API. POST /v1/convert/html-to-pdf rendert HTML-Dateien mit WeasyPrint zu PDF: Seitenformate, Ränder, Header, Footer.
keywords: html in pdf umwandeln api, html zu pdf konvertieren api, pdf aus html erzeugen api, html to pdf api, weasyprint html zu pdf api, html zu pdf rest api, html zu pdf python, html zu pdf node js
---

# 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

<div class="alert alert-info">
<strong>Hinweis:</strong> 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.
</div>

---

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

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

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

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

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

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

### Wie füge ich dem generierten PDF Seitenzahlen, Header oder Footer hinzu?

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