Voraussetzungen
- Python 3.8+ und die Bibliothek
requests(pip install requests). - Ein API-Key: Erstellen Sie ein kostenloses Konto und kopieren Sie Ihren Key aus dem Dashboard. Speichern Sie ihn in einer Umgebungsvariable statt direkt im Code:
export PDF_SUMMARIZE_KEY="sk_live_..."
Ihre erste PDF-Zusammenfassung in Python
- Requests installieren
pip install requests. - API-Key festlegenIn der Umgebungsvariable
PDF_SUMMARIZE_KEY. - PDF sendenAls multipart/form-data mit dem Feldnamen
file. - JSON auslesenDie Zusammenfassung befindet sich in
summary; prüfen Siesuccessund den HTTP-Status.
import os
import requests
API_URL = "https://pdf-summarize.com/api/summarize.php"
API_KEY = os.environ["PDF_SUMMARIZE_KEY"]
def summarize_pdf(path, length="medium", fmt="bullets", lang="auto"):
with open(path, "rb") as f:
resp = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": (os.path.basename(path), f, "application/pdf")},
data={"length": length, "format": fmt, "outputLang": lang, "includeKeywords": "1"},
timeout=180,
)
data = resp.json()
if resp.status_code != 200 or not data.get("success"):
raise RuntimeError(f"{resp.status_code}: {data.get('error', data)}")
return data
result = summarize_pdf("annual-report.pdf")
print(result["summary"])
print("Seiten:", result["page_count"], "| Schlüsselwörter:", result.get("keywords"))
Die Antwort
{
"success": true,
"summary": "- Der Umsatz stieg um 6 % auf ...",
"keywords": "Umsatz, Marge, Prognose, ...",
"page_count": 48,
"original_length": 182340,
"summary_length": 1210,
"processing_time": 6.214,
"requests_remaining": 4987
}
requests_remaining ist Ihr verbleibendes monatliches Kontingent (-1 bedeutet unbegrenzt).
Zusammenfassung streamen
Für lange Dokumente oder interaktive Anwendungen können Sie die Zusammenfassung während der Generierung streamen:
import json
def stream_summary(path):
with open(path, "rb") as f:
with requests.post(
API_URL + "?stream=1",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": (os.path.basename(path), f, "application/pdf")},
data={"length": "long", "format": "mixed"},
stream=True, timeout=300,
) as resp:
resp.raise_for_status()
for line in resp.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue
payload = line[6:]
if payload == "[DONE]":
break
event = json.loads(payload)
if "error" in event:
raise RuntimeError(event["error"])
if event.get("type") == "summary":
print(event["content"], end="", flush=True)
stream_summary("research-paper.pdf")
Einen Ordner voller PDFs verarbeiten
import pathlib, time
out_dir = pathlib.Path("summaries")
out_dir.mkdir(exist_ok=True)
for pdf in sorted(pathlib.Path("pdfs").glob("*.pdf")):
target = out_dir / (pdf.stem + ".md")
if target.exists():
continue # Unterbrechungssicher
for attempt in range(3):
try:
data = summarize_pdf(str(pdf), length="long", fmt="mixed")
target.write_text(data["summary"], encoding="utf-8")
print("ok", pdf.name, data["page_count"], "Seiten")
break
except RuntimeError as e:
if str(e).startswith("429"):
time.sleep(30 * (attempt + 1)) # Rate-Limit: Warten und erneut versuchen
else:
print("fehlgeschlagen", pdf.name, e)
break
Zu behandelnde Fehler
| Status | Bedeutung | Maßnahme |
|---|---|---|
| 400 | Fehlende Datei, falscher Typ, Seitenlimit überschritten | Datei und Seitenlimit Ihres Tarifs überprüfen |
| 401 | Fehlender oder ungültiger API-Key | Authorization-Header überprüfen |
| 403 | Konto gesperrt | Support kontaktieren |
| 413 | Datei zu groß | PDF komprimieren oder aufteilen |
| 422 | Kein lesbarer Text (leer, geschützt oder unlesbarer Scan) | Passwort entfernen; Scan-Qualität verbessern |
| 429 | Rate-Limit oder monatliches Kontingent erreicht | Warten und wiederholen oder Tarif upgraden |
| 500 | Zusammenfassung vorübergehend nicht verfügbar | Mit Wartezeit erneut versuchen |
Tipps
- Timeouts großzügig bemessen (2–3 Minuten) für lange PDFs.
- Ergebnisse nach Datei-Hash cachen, um dasselbe Dokument nicht doppelt zu bezahlen.
- Keys auf dem Server behalten — geben Sie diese niemals in Frontends oder Mobil-Apps weiter.
- Vollständige Parameter-Referenz: Die API-Dokumentation.
Häufig gestellte Fragen
Gibt es einen kostenlosen API-Tarif?
Ja. Der kostenlose Tarif beinhaltet ein monatliches Abfragekontingent ganz ohne Kreditkarte. Siehe Preise.
Kann ich eine PDF-URL statt einer Datei senden?
Die API nimmt die Datei direkt entgegen. Laden Sie das PDF in Ihrem Code herunter (z. B. mit requests) und senden Sie die Rohdaten (Bytes).
In welchen Sprachen kann die Zusammenfassung erstellt werden?
Verwenden Sie outputLang=auto, um die Sprache des Dokuments beizubehalten, oder einen Sprachcode wie en, fr, es, de.
Wie fasse ich gescannte PDFs über die API zusammen?
Senden Sie sie wie jede andere PDF-Datei; die Texterkennung greift automatisch auf OCR zurück, wenn keine nutzbare Textebene vorhanden ist.