# Pdf's samenvatten met Python — PDF Summary API-tutorial

Voeg pdf-samenvatting toe aan een Python-script, een notebook of een backend in slechts een paar regels. Deze tutorial behandelt authenticatie, een eerste verzoek, de responsindeling, streaming, het verwerken van een hele map en correcte foutafhandeling.

## Key facts

- Eindpunt: POST https://pdf-summarize.com/api/summarize.php met multipart/form-data, veld file.
- Authenticatie: header Authorization: Bearer sk_... — gratis sleutel bij registratie, geen creditcard vereist.
- Opties: length (short/medium/long/extensive), format (paragraph/bullets/mixed), outputLang (auto of een taalcode), includeKeywords.
- Respons: JSON met summary, keywords, page_count, processing_time, requests_remaining.
- Voeg ?stream=1 toe om de samenvatting te ontvangen als Server-Sent Events.

## Vereisten

- Python 3.8+ en de bibliotheek `requests` (`pip install requests`).
- Een API-sleutel: [maak een gratis account aan](/signup) en kopieer je sleutel uit het dashboard. Sla deze op in een omgevingsvariabele in plaats van hardcoded in je code:

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

## Je eerste pdf-samenvatting in Python

1. **Requests installeren** — pip install requests.
2. **Je API-sleutel instellen** — In de omgevingsvariabele PDF_SUMMARIZE_KEY.
3. **De pdf versturen** — Als multipart/form-data met de veldnaam file.
4. **De JSON lezen** — De samenvatting staat in summary; controleer success en de 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("Pagina's:", result["page_count"], "| Trefwoorden:", result.get("keywords"))
```

## De respons

```json
{
  "success": true,
  "summary": "- Omzet groeide met 6% tot ...",
  "keywords": "omzet, marge, verwachting, ...",
  "page_count": 48,
  "original_length": 182340,
  "summary_length": 1210,
  "processing_time": 6.214,
  "requests_remaining": 4987
}
```

`requests_remaining` is je resterende maandelijkse quotum (`-1` betekent onbeperkt).

## De samenvatting streamen

Voor lange documenten of interactieve apps kun je de samenvatting streamen terwijl deze wordt gegenereerd:

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

## Een map met pdf's verwerken

```python
import pathlib, time

out_dir = pathlib.Path("samenvattingen")
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                      # hervatvriendelijk
    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"], "pagina's")
            break
        except RuntimeError as e:
            if str(e).startswith("429"):
                time.sleep(30 * (attempt + 1))   # snelheidslimiet: even wachten
            else:
                print("mislukt", pdf.name, e)
                break
```

## Te verwerken fouten

| Status | Betekenis | Wat te doen |
|---|---|---|
| 400 | Ontbrekend bestand, verkeerd type, paginalimiet overschreden | Controleer het bestand en de paginalimiet van je abonnement |
| 401 | Ontbrekende of ongeldige API-sleutel | Controleer de `Authorization`-header |
| 403 | Account opgeschort | Neem contact op met de ondersteuning |
| 413 | Bestand te groot | Comprimeer of splits de pdf |
| 422 | Geen leesbare tekst (leeg, beveiligd of onleesbare scan) | Verwijder wachtwoord; verbeter de scan |
| 429 | Snelheidslimiet of maandelijks quotum bereikt | Wacht even en probeer opnieuw, of upgrade |
| 500 | Samenvatten tijdelijk niet beschikbaar | Probeer het opnieuw met een pauze |

> **Wil je het eerst zonder code testen?** — Probeer dezelfde engine gratis in je browser.

## Tips

- **Stel timeouts ruim in** (2-3 minuten) voor lange pdf's.
- **Cache resultaten** op basis van bestands-hash om te voorkomen dat je twee keer betaalt voor hetzelfde document.
- **Bewaar sleutels server-side** — verzend ze nooit in een frontend- of mobiele app.
- Volledige parameterreferentie: de [API-documentatie](/docs).

## FAQ

### Is er een gratis API-abonnement?

Ja. Het gratis abonnement bevat een maandelijks quotum aan verzoeken zonder creditcard. Bekijk de prijzen.

### Kan ik een pdf-url sturen in plaats van een bestand?

De API ontvangt het bestand zelf. Download de pdf in je code (bijv. met requests) en stuur de bytes mee.

### In welke talen kan de samenvatting worden gemaakt?

Gebruik outputLang=auto om de taal van het document te behouden, of een taalcode zoals nl, en, fr, es, de.

### Hoe vat ik gescande pdf's samen via de API?

Stuur ze op zoals elke andere pdf; de extractiepipeline schakelt automatisch over op OCR wanneer er geen bruikbare tekstlaag is.

---
Source: https://pdf-summarize.com/nl/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
