# PDFs mit Python zusammenfassen — PDF-Zusammenfassungs-API-Tutorial

Fügen Sie einem Python-Skript, Notebook oder Backend mit wenigen Zeilen eine PDF-Zusammenfassungsfunktion hinzu. Dieses Tutorial deckt Authentifizierung, die erste Anfrage, das Antwortformat, Streaming, die Verarbeitung ganzer Ordner und ordnungsgemäßes Fehlerhandling ab.

## Key facts

- Endpunkt: POST https://pdf-summarize.com/api/summarize.php mit multipart/form-data, Feld file.
- Auth: Header Authorization: Bearer sk_... – kostenloser Key bei Registrierung, keine Kreditkarte.
- Optionen: length (short/medium/long/extensive), format (paragraph/bullets/mixed), outputLang (auto oder Sprachcode), includeKeywords.
- Antwort: JSON mit summary, keywords, page_count, processing_time, requests_remaining.
- Fügen Sie ?stream=1 hinzu, um die Zusammenfassung als Server-Sent Events zu empfangen.

## Voraussetzungen

- Python 3.8+ und die Bibliothek `requests` (`pip install requests`).
- Ein API-Key: [Erstellen Sie ein kostenloses Konto](/signup) und kopieren Sie Ihren Key aus dem Dashboard. Speichern Sie ihn in einer Umgebungsvariable statt direkt im Code:

```bash
export PDF_SUMMARIZE_KEY="sk_live_..."
```

## Ihre erste PDF-Zusammenfassung in Python

1. **Requests installieren** — pip install requests.
2. **API-Key festlegen** — In der Umgebungsvariable PDF_SUMMARIZE_KEY.
3. **PDF senden** — Als multipart/form-data mit dem Feldnamen file.
4. **JSON auslesen** — Die Zusammenfassung befindet sich in summary; prüfen Sie success und den HTTP-Status.

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

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

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

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

> **Möchten Sie es zuerst ohne Code testen?** — Probieren Sie dieselbe Engine kostenlos in Ihrem Browser aus.

## 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](/docs).

## FAQ

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

---
Source: https://pdf-summarize.com/de/guides/pdf-summary-api-python — PDF Summarizer (free PDF summarizer, Q&A with page citations, OCR, REST API). Site overview: https://pdf-summarize.com/llms.txt
