# Résumer des PDF avec Python — Tutoriel API de résumé de PDF

Ajoutez la génération de résumés PDF à un script Python, un notebook ou un backend en quelques lignes. Ce tutoriel couvre l'authentification, une première requête, le format de réponse, le streaming, le traitement d'un dossier entier et la gestion correcte des erreurs.

## Key facts

- Point de terminaison : POST https://pdf-summarize.com/api/summarize.php avec multipart/form-data, champ file.
- Authentification : en-tête Authorization: Bearer sk_... — clé gratuite à l'inscription, sans carte bancaire.
- Options : length (short/medium/long/extensive), format (paragraph/bullets/mixed), outputLang (auto ou un code langue), includeKeywords.
- Réponse : JSON avec summary, keywords, page_count, processing_time, requests_remaining.
- Ajoutez ?stream=1 pour recevoir le résumé sous forme de Server-Sent Events.

## Prérequis

- Python 3.8+ et la bibliothèque `requests` (`pip install requests`).
- Une clé API : [créez un compte gratuit](/signup) et copiez votre clé depuis le tableau de bord. Stockez-la dans une variable d'environnement plutôt que directement dans le code :

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

## Votre premier résumé de PDF en Python

1. **Installer requests** — pip install requests.
2. **Définir votre clé API** — Dans la variable d'environnement PDF_SUMMARIZE_KEY.
3. **Envoyer le PDF** — Au format multipart/form-data avec le nom de champ file.
4. **Lire le JSON** — Le résumé se trouve dans summary ; vérifiez success et le code d'état HTTP.

```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("Pages :", result["page_count"], "| Mots-clés :", result.get("keywords"))
```

## La réponse

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

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

## Traiter un dossier de PDF

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

> **Vous voulez tester sans coder ?** — Essayez le même moteur directement dans votre navigateur, gratuitement.

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

## FAQ

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

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