Zum Inhalt springen

Anwendungsfall

Markdown-zu-PDF-API

Markdown senden, ein PDF erhalten, das wie ein Dokument aussieht: ohne Vorlage, ohne CSS. Ein Bericht, den Ihr Code schreibt, Release Notes oder die Antwort eines Modells gehen als markdown hinein; das Theme document setzt sie mit Tabellen, Zitaten und Code, in Schriften und Farbe Ihres Brand-Kits, wo Sie eines haben, und HTML im Text bleibt als Text sichtbar, statt ausgeführt zu werden.

Kostenloser Plan mit 100 Einheiten im Monat, keine Kreditkarte

GitHub Flavored Markdown

Tabellen mit ihrer Ausrichtung, Aufgabenlisten, Durchgestrichenes, Fußnoten und Links zwischen Überschriften, die im PDF funktionieren.

Rohes HTML bleibt Text

Ein <script> oder ein onerror im Text wird als Zeichen gedruckt, sodass Text Ihrer Nutzer oder eines Modells nichts ausführen kann. settings.markdown.html: "allow" lässt Ihr eigenes HTML durch.

Ein Dokument ohne CSS

Das Theme document gestaltet Überschriften, Tabellen, Zitate und Code; theme: "none" und css geben ihm ein eigenes Aussehen.

Titel und Lesezeichen

Der Titel kommt aus dem Front Matter oder der ersten Überschrift, eine Zeile \newpage bricht die Seite um, und pdf.outline schreibt Lesezeichen aus den Überschriften.

PDF/UA-1 und PDF/A

Überschriften geschlossen, leere Zellen gefüllt und der Titel gesetzt, sodass pdf.ua die Datei mit veraPDF an den Regeln von PDF/UA-1 misst; pdf.pdfa macht sie zu einer PDF/A-Datei für die Archivierung.

Aus der CLI und für Agenten

formfeed pdf convert notes.md wandelt eine Datei mit den Bildern daneben um, und KI-Agenten haben das MCP-Werkzeug markdown_to_pdf.

Eine Markdown-Datei in ein PDF verwandeln

bericht.mdMarkdown
---
title: Quartalsbericht Q3 2026
author: Fennlor Studio GmbH
---

# Quartalsbericht Q3 2026

Der Umsatz stieg um **12 %** auf 1,48 Mio. €[^1], getragen vom Norden und den
neuen Abonnements. Alle Zahlen stehen in der [Tabelle unten](#umsatz-nach-region).

## Umsatz nach Region

| Region | Q2 2026     | Q3 2026     | Änderung |
| :----- | ----------: | ----------: | -------: |
| Nord   | 410.000 €   | 486.000 €   | +18 %    |
| Süd    | 392.000 €   | 415.000 €   | +6 %     |
| Ost    | 301.000 €   | 322.000 €   | +7 %     |
| West   | 217.000 €   | 257.000 €   | +18 %    |

> Der Norden wuchs am stärksten: Im Juli kamen zwei neue Vertriebspartner hinzu.

## Was erledigt ist

- [x] Den Shop auf den neuen Zahlungsanbieter umstellen
- [x] Zwei Personen für den Support einstellen
- [ ] Das Büro in Musterstadt eröffnen

Ein Tag aus der Antwort eines Modells bleibt Text: <img src=x onerror=alert(1)>

\newpage

## Ausblick

1. Den Preis der Abonnements bis Jahresende halten.
2. Im Januar ein eigenes Vertriebsteam für den Osten aufbauen.
3. Die ersten Zahlen des neuen Büros in Q1 2027 berichten.

```text
Prognose Q4 2026: 1,55 bis 1,62 Mio. €
```

[^1]: Ungeprüfte Zahlen; die geprüften folgen mit dem Jahresabschluss.
Shell
jq -Rs '{markdown: ., locale: "de-DE", settings: {pdf: {outline: true}}}' bericht.md \
  | curl -X POST "https://api-eu.formfeed.dev/v1/renders?output=binary" \
      -H "Authorization: Bearer $FORMFEED_API_KEY" \
      -H "Content-Type: application/json" \
      --data-binary @- -o bericht.pdf

Vollständige Anfrage- und Antwortformate in der Doku.

Das kommt heraus

Ein echtes Rendering der Beispielvorlage für diesen Anwendungsfall, direkt aus dem Render-Worker. Ein Klick öffnet die Datei.

PDF · 2 Seiten · 53 KB ↓ herunterladen

Was Sie senden können

Der Text geht als markdown hinein, bis 1 MB in UTF-8, das sind mehrere hundert Seiten Fließtext. Ein YAML-Block als Front Matter am Anfang gibt dem PDF Titel, Autor, Thema und Stichwörter; ohne ihn ist die erste Überschrift der Titel. Eine Zeile \newpage beginnt eine neue Seite, [^1] macht eine Fußnote, und ein Link auf #umsatz-nach-region springt im PDF zu dieser Überschrift.

Ein Bild, das mit einem bloßen Dateinamen wie logo.png benannt ist, ist eine Datei der Dateibibliothek des Workspace; öffentliche https-Adressen und data:image/-Adressen funktionieren ebenso. Der Befehl oben fragt mit ?output=binary nach der Datei selbst; ohne das ist die Antwort JSON mit einem signierten Download-Link, der Seitenzahl und den Einheiten.

Text Ihrer Nutzer und von Modellen

In der Vorgabe erscheint rohes HTML im Text als Text, und nur <br> und einige Formatierungs-Tags wie <sup> und <mark> bleiben Tags, ohne Attribute. Links bleiben bei http, https, mailto und tel, Bilder bei https, data:image/ und der Bibliothek, sodass die Antwort eines Modells weder ein Skript ausführen noch einen Link auf javascript: setzen kann.

Für Markdown, das Sie selbst geschrieben haben, mit einem gestalteten Kasten oder einem eingebetteten Widget, schreibt settings.markdown.html: "allow" das HTML, wie es steht, so wie ein HTML-Rendering es tut:

POST /v1/rendersJSON
{
  "markdown": "# Release notes\n\n<div class=\"note\">Version 2.4 is out.</div>",
  "settings": { "markdown": { "html": "allow" } }
}

Das Aussehen: das Theme, Ihr CSS, Ihre Marke

Das Theme document setzt den Text in Noto Sans und Code in einer Festbreitenschrift, hält Überschriften bei dem, was ihnen folgt, und bricht um, was breiter wäre als die Seite. Hat Ihre Organisation ein Brand-Kit, nehmen Überschriften und Text seine Schriften und Links seine Primärfarbe. theme: "none" lässt nur den Druck-Reset, und css, bis 256 kB, kommt nach beiden:

POST /v1/rendersJSON
{
  "markdown": "# Release notes\n\n…",
  "settings": {
    "markdown": {
      "theme": "none",
      "css": ".ff-markdown { font-family: Georgia, serif; } .ff-markdown h1 { color: #0f766e; }"
    }
  }
}

Markdown mit Daten

Mit engine auf jinja2, liquid oder handlebars ist der Text eine Vorlage für die data, die Sie mitsenden, und wird danach als Markdown gelesen, mit allen Helpern für Beträge, Datumsangaben und Codes. Werte werden maskiert, sodass ein Wert Markdown bringen kann, aber kein HTML.

POST /v1/rendersJSON
{
  "markdown": "# Report for {{ customer.name }}\n\n{% for item in items %}- {{ item.name }}: {{ item.total | money }}\n{% endfor %}",
  "engine": "jinja2",
  "data": {
    "customer": { "name": "Olvarest GmbH" },
    "items": [{ "name": "Consulting", "total": 960 }]
  }
}

Lesezeichen, PDF/UA-1 und PDF/A

Der Konverter schließt die Ebenen der Überschriften und füllt leere Tabellenzellen, und der Titel kommt aus dem Front Matter oder der ersten Überschrift. Mit settings.pdf.ua misst veraPDF die Datei vor der Auslieferung an den maschinell prüfbaren Regeln von PDF/UA-1, und das Rendering trägt das Urteil; die Alternativtexte schreiben Sie. settings.pdf.pdfa macht die Datei zu PDF/A-2b oder PDF/A-3b für die Archivierung, und settings.pdf.outline schreibt kostenlos Lesezeichen aus den Überschriften.

Was ein PDF kostet

Jeder Plan rendert Markdown. Ein PDF mit bis zu fünf Seiten ist eine Einheit, und je weitere fünf Seiten kommt eine hinzu. Der Free-Plan hat 100 Einheiten im Monat und fragt nach keiner Kreditkarte; Starter hat 3.000 Einheiten für 19 € im Monat. Renderings mit einem Test-Schlüssel kosten nichts, und ein Rendering, das fehlschlägt, wird nie gezählt. Alle Pläne stehen auf der Preisseite.

Aus dem Blog

FAQ

Welches Markdown wird gelesen?
GitHub Flavored Markdown: Tabellen, Aufgabenlisten, Durchgestrichenes und Autolinks, dazu Fußnoten und ein YAML-Block als Front Matter. Die IDs der Überschriften folgen der Regel von GitHub, sodass Links zwischen Überschriften, die für eine README geschrieben sind, im PDF funktionieren.
Was geschieht mit HTML im Markdown?
Es erscheint als Text, solange die Anfrage nicht settings.markdown.html: "allow" sagt. Einige Formatierungs-Tags ohne Attribute, etwa <br>, <sup>, <sub> und <mark>, bleiben Tags.
Lässt sich eine README mit ihren Bildern umwandeln?
Ja: formfeed pdf convert README.md schickt die Bilder in ihrem Ordner mit und lehnt einen Pfad ab, der aus ihm hinausführt. Über die API kommt ein Bild, das mit einem bloßen Dateinamen benannt ist, aus der Dateibibliothek.
Wie groß darf ein Dokument sein?
Bis 1 MB in UTF-8 je Anfrage, mit einem Stylesheet bis 256 kB. Ein längerer Text wird mit 400 invalid_request abgelehnt, bevor etwas gezählt wird.
Funktioniert es im Free-Plan?
Ja, in jedem Plan, zu den Einheiten jedes PDF: eine Einheit je angefangene fünf Seiten. Test-Schlüssel kosten nichts.

Weitere Anwendungsfälle

Heute mit dem Rendern beginnen

Der kostenlose Plan enthält 100 Einheiten im Monat und kostenlose Testrenderings. Wechseln Sie den Plan, wenn Sie mehr brauchen.