Vereisten
- Python 3.8+ en de bibliotheek
requests(pip install requests). - Een API-sleutel: maak een gratis account aan en kopieer je sleutel uit het dashboard. Sla deze op in een omgevingsvariabele in plaats van hardcoded in je code:
export PDF_SUMMARIZE_KEY="sk_live_..."
Je eerste pdf-samenvatting in Python
- Requests installeren
pip install requests. - Je API-sleutel instellenIn de omgevingsvariabele
PDF_SUMMARIZE_KEY. - De pdf versturenAls multipart/form-data met de veldnaam
file. - De JSON lezenDe samenvatting staat in
summary; controleersuccessen de 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("Pagina's:", result["page_count"], "| Trefwoorden:", result.get("keywords"))
De respons
{
"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:
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
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 |
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.
Veelgestelde vragen
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.