Prérequis
- Python 3.8+ et la bibliothèque
requests(pip install requests). - Une clé API : créez un compte gratuit et copiez votre clé depuis le tableau de bord. Stockez-la dans une variable d'environnement plutôt que directement dans le code :
export PDF_SUMMARIZE_KEY="sk_live_..."
Votre premier résumé de PDF en Python
- Installer requests
pip install requests. - Définir votre clé APIDans la variable d'environnement
PDF_SUMMARIZE_KEY. - Envoyer le PDFAu format multipart/form-data avec le nom de champ
file. - Lire le JSONLe résumé se trouve dans
summary; vérifiezsuccesset le code d'état HTTP.
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("Pages :", result["page_count"], "| Mots-clés :", result.get("keywords"))
La réponse
{
"success": true,
"summary": "- Le chiffre d'affaires a progressé de 6 % pour atteindre...",
"keywords": "chiffre d'affaires, marge, prévisions, ...",
"page_count": 48,
"original_length": 182340,
"summary_length": 1210,
"processing_time": 6.214,
"requests_remaining": 4987
}
requests_remaining correspond à votre quota mensuel restant (-1 indique un nombre illimité).
Diffuser le résumé en continu (streaming)
Pour les documents longs ou les applications interactives, streamez le résumé au fur et à mesure de sa génération :
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")
Traiter un dossier de PDF
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 # Reprise possible (resume-friendly)
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"], "pages")
break
except RuntimeError as e:
if str(e).startswith("429"):
time.sleep(30 * (attempt + 1)) # Limite de taux : attente exponentielle
else:
print("échec", pdf.name, e)
break
Erreurs à gérer
| Statut | Signification | Que faire |
|---|---|---|
| 400 | Fichier manquant, mauvais type, limite de pages dépassée | Vérifiez le fichier et la limite de pages de votre offre |
| 401 | Clé API manquante ou invalide | Vérifiez l'en-tête Authorization |
| 403 | Compte suspendu | Contactez le support |
| 413 | Fichier trop volumineux | Compressez ou divisez le PDF |
| 422 | Aucun texte lisible (vide, protégé ou scan illisible) | Supprimez le mot de passe ; améliorez la qualité du scan |
| 429 | Limite de requêtes ou quota mensuel atteint | Attendez avant de réessayer ou passez à l'offre supérieure |
| 500 | Résumé temporairement indisponible | Réessayez après une pause |
Astuces
- Définissez des délais d'attente (timeouts) généreux (2 à 3 minutes) pour les PDF longs.
- Mettez en cache les résultats en fonction du hachage du fichier pour éviter de payer deux fois pour le même document.
- Gardez les clés côté serveur — ne les incluez jamais dans une application front-end ou mobile.
- Référence complète des paramètres : la documentation de l'API.
Questions fréquentes
Existe-t-il une formule d'API gratuite ?
Oui. La formule gratuite comprend un quota mensuel de requêtes sans nécessiter de carte bancaire. Consultez les tarifs.
Puis-je envoyer l'URL d'un PDF au lieu d'un fichier ?
L'API prend le fichier lui-même en charge. Téléchargez le PDF dans votre code (par exemple avec requests) et envoyez les octets correspondants.
Dans quelles langues le résumé peut-il être rédigé ?
Utilisez outputLang=auto pour conserver la langue du document, ou spécifiez un code de langue tel que en, fr, es, de.
Comment résumer des PDF scannés via l'API ?
Envoyez-les comme n'importe quel PDF ; le pipeline d'extraction bascule automatiquement vers l'OCR lorsqu'aucune couche de texte exploitable n'est détectée.