Kommandozeile

PDF mit cURL in Markdown umwandeln

Keine Programmiersprache nötig. Mit curl und jq kannst du ein PDF direkt aus dem Terminal, einem Makefile, einem CI-Schritt oder einem cron-Job in Markdown umwandeln. Kopiere die Vorlage unten, setze deinen Schlüssel und führe sie aus.

Kurze Antwort

Drei curls und eine Abfrageschleife

curl -X POST das PDF an /api/v2/jobs mit deinem Schlüssel, hol die job_id mit jq heraus, schleife über /api/v2/jobs/{job_id}, bis der Status ready ist, und mache dann curl auf /api/v2/jobs/{job_id}/download mit -o, um das Markdown zu speichern. Es ist reines HTTP, läuft also überall dort, wo eine Shell läuft, ohne SDK und ohne etwas zu kompilieren.

Anleitung

Die vollständige Shell-Vorlage

Speichere sie als convert.sh, chmod +x, und führe sie aus. Tausche deinen Schlüssel und das PDF aus.

#!/usr/bin/env bash
set -euo pipefail
API="https://pdf2md.dev/api/v2"
AUTH="Authorization: Bearer p2m_your_key"

# 1) einen Job aus einer PDF-URL anlegen
#    (um eine lokale Datei hochzuladen, nutze: -F [email protected] )
JID=$(curl -fsS -X POST "$API/jobs" -H "$AUTH" \
  -H "Content-Type: application/json" -H "Idempotency-Key: report-2026-01" \
  -d '{"url":"https://example.com/report.pdf"}' | jq -r .job_id)

# 2) abfragen, bis ready oder error
while :; do
  JOB=$(curl -fsS "$API/jobs/$JID" -H "$AUTH")
  STATUS=$(echo "$JOB" | jq -r .status)
  [ "$STATUS" = "ready" ] && break
  if [ "$STATUS" = "error" ]; then
    echo "failed: $(echo "$JOB" | jq -r .error_code)" >&2
    exit 1
  fi
  sleep 3
done

# 3) das Markdown herunterladen
curl -fsS "$API/jobs/$JID/download" -H "$AUTH" -o report.md
echo "report.md gespeichert"

Die Option -f sorgt dafür, dass curl bei HTTP-Fehlern fehlschlägt, und set -euo pipefail stoppt das Skript beim ersten Problem, sodass ein kaputter Lauf nie stillschweigend eine leere Datei schreibt.

Wo es passt

Für Automatisierung gemacht

Da es ein einziges in sich geschlossenes Skript mit einem echten Exit-Code ist, passt die Vorlage dorthin, wo ein vollständiges Programm überdimensioniert wäre.

CI-Pipelines

Füge sie als Build-Schritt hinzu, um Dokumentations-PDFs bei jedem Commit in Markdown umzuwandeln. Eine fehlgeschlagene Konvertierung lässt den Schritt fehlschlagen.

Cron-Jobs

Plane sie so, dass sie einen nächtlichen Bericht abruft und umwandelt und das Markdown dorthin schreibt, wo deine Doku-Seite oder Pipeline es erwartet.

Secrets, keine Literale

Halte den API-Schlüssel in einem CI-Secret oder einer Umgebungsvariable und referenziere ihn im Authorization-Header, niemals fest im Code verdrahtet.

Du willst es lieber in einer App? Sieh dir die Tutorials zu Python, Node.js und Go an.

Die ganze API auf einer Seite

Jeder Endpunkt, jedes Feld und jeder Fehlercode steht im Entwickler-Hub, mit der OpenAPI-Spezifikation, die du in Postman importieren oder aus der du einen Client generieren kannst.

Über bash hinaus

Andere Shells und Webhooks

Die Vorlage ist bash, aber die drei Aufrufe sind nur HTTP, also lassen sie sich überallhin portieren, wo curl läuft.

Windows und PowerShell

curl ist bei modernem Windows dabei, also funktionieren dieselben Aufrufe in PowerShell oder einer .cmd-Datei; du passt nur die Anführungszeichen an (PowerShell bevorzugt einfache Anführungszeichen um das JSON, oder nutze Invoke-RestMethod mit einem Hashtable-Body). In einem Makefile, einem Dockerfile-Build-Schritt oder einem run:-Block von GitHub Actions bleibt das Skript unverändert.

Spar dir die Abfrageschleife

Das Abfragen ist der einfachste Ansatz und reicht für eine Datei oder eine Handvoll. Für viele Dateien oder um das Warten ganz zu vermeiden, registriere einen Webhook, und die API ruft dich zurück, wenn ein Job fertig ist, sodass ein Skript Konvertierungen anstoßen und Ergebnisse verarbeiten kann, sobald sie eintreffen, statt in einer Schleife zu warten.

Egal welche Shell, halte den Schlüssel aus dem Skript-Body heraus: lies ihn aus einer Umgebungsvariable oder einem CI-Secret. Und wenn du ein Ergebnis vor dem Speichern prüfen musst, leite den Download in einen Viewer (curl ... | less) statt -o, da der Endpunkt reinen Markdown-Text zurückgibt.

FAQ

Häufige Fragen

Was brauche ich, um die cURL-Vorlage auszuführen?

Nur curl und jq. curl macht die HTTP-Aufrufe und jq liest job_id und status aus den JSON-Antworten. Beide sind auf den meisten Systemen verfügbar oder nur eine Paketinstallation entfernt.

Wie wandle ich eine lokale Datei mit curl um?

Nutze einen Multipart-Upload: curl -X POST /api/v2/jobs -F [email protected] mit dem Authorization-Header, statt des JSON-Bodys -d, der eine url trägt.

Wie nutze ich das in CI oder einem cron-Job?

Das Skript beendet sich mit einem Exit-Code ungleich null, wenn ein Job fehlschlägt, also passt es in einen CI-Schritt oder einen geplanten cron-Job. Speichere den API-Schlüssel als CI-Secret oder Umgebungsvariable und übergib ihn im Authorization-Header.

Geht es auch ohne jq?

jq ist der sauberste Weg, job_id und status zu lesen, aber du kannst das JSON auch mit grep und sed parsen, falls jq nicht verfügbar ist. jq wird aus Zuverlässigkeitsgründen empfohlen.

Was macht der Idempotency-Key-Header?

Dieselbe Idempotency-Key bei einem wiederholten create zu senden, gibt denselben Job zurück, statt eine doppelte Konvertierung zu starten, was nützlich ist, wenn ein instabiler CI-Schritt erneut läuft.