# Résumer des PDF avec JavaScript et Node.js — Tutoriel API

Appelez l'API PDF Summarizer depuis Node.js (ou tout autre environnement d'exécution JavaScript côté serveur) avec simplement fetch et FormData. Ce tutoriel couvre votre premier appel, le streaming, un petit point de terminaison Express pour votre propre application et la gestion des erreurs.

## Key facts

- Fonctionne avec Node.js 18+ (fetch, FormData, Blob natifs) — aucun SDK requis.
- POST https://pdf-summarize.com/api/summarize.php, multipart/form-data, champ file, en-tête Authorization: Bearer sk_....
- Options : length, format, outputLang, includeKeywords.
- Ajoutez ?stream=1 et lisez le corps de la réponse sous forme de Server-Sent Events (flux d'événements server-sent).
- N'exposez jamais votre clé dans le code du navigateur — faites transiter les requêtes par votre serveur.

## Votre premier appel dans Node.js

1. **Obtenez une clé API gratuite** — Inscrivez-vous et copiez-la depuis votre tableau de bord.
2. **Stockez-la dans une variable d'environnement** — PDF_SUMMARIZE_KEY.
3. **Créez un FormData** — Ajoutez le PDF en tant que Blob sous le champ file.
4. **Envoyez la requête POST et lisez le JSON.** — 

```js
// summarize.mjs — node summarize.mjs report.pdf
import { readFile } from 'node:fs/promises';
import { basename } from 'node:path';

const API_URL = 'https://pdf-summarize.com/api/summarize.php';
const KEY = process.env.PDF_SUMMARIZE_KEY;

export async function summarizePdf(path, { length = 'medium', format = 'bullets', outputLang = 'auto' } = {}) {
  const form = new FormData();
  form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
  form.append('length', length);
  form.append('format', format);
  form.append('outputLang', outputLang);

  const res = await fetch(API_URL, {
    method: 'POST',
    headers: { Authorization: `Bearer ${KEY}` },
    body: form,
    signal: AbortSignal.timeout(180_000),
  });
  const data = await res.json();
  if (!res.ok || !data.success) throw new Error(`${res.status}: ${data.error ?? JSON.stringify(data)}`);
  return data;
}

const result = await summarizePdf(process.argv[2]);
console.log(result.summary);
console.log(`${result.page_count} pages, ${result.processing_time}s, ${result.requests_remaining} requêtes restantes`);
```

## Générer le résumé en streaming

```js
export async function streamSummary(path, onText) {
  const form = new FormData();
  form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
  form.append('length', 'long');

  const res = await fetch(API_URL + '?stream=1', { method: 'POST', headers: { Authorization: `Bearer ${KEY}` }, body: form });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);

  const decoder = new TextDecoder();
  let buffer = '';
  for await (const chunk of res.body) {
    buffer += decoder.decode(chunk, { stream: true });
    const lines = buffer.split('\n');
    buffer = lines.pop();
    for (const line of lines) {
      if (!line.startsWith('data: ')) continue;
      const payload = line.slice(6);
      if (payload === '[DONE]') return;
      const event = JSON.parse(payload);
      if (event.error) throw new Error(event.error);
      if (event.type === 'summary') onText(event.content);
    }
  }
}

await streamSummary('paper.pdf', (t) => process.stdout.write(t));
```

## Un point de terminaison Express pour votre propre application

Votre frontend envoie le fichier à **votre** serveur, qui ajoute la clé et transmet le fichier :

```js
import express from 'express';
import multer from 'multer';

const app = express();
const upload = multer({ limits: { fileSize: 20 * 1024 * 1024 } });

app.post('/summarize', upload.single('file'), async (req, res) => {
  if (!req.file) return res.status(400).json({ error: 'Aucun fichier' });
  const form = new FormData();
  form.append('file', new Blob([req.file.buffer], { type: 'application/pdf' }), req.file.originalname);
  form.append('length', req.body.length ?? 'medium');
  const r = await fetch('https://pdf-summarize.com/api/summarize.php', {
    method: 'POST', headers: { Authorization: `Bearer ${process.env.PDF_SUMMARIZE_KEY}` }, body: form,
  });
  res.status(r.status).json(await r.json());
});

app.listen(3000);
```

## Gestion des erreurs

| Statut | Signification |
|---|---|
| 400 | Fichier manquant, format non PDF ou limite de pages dépassée |
| 401 | Clé manquante ou invalide |
| 413 | Fichier trop volumineux |
| 422 | Aucun texte lisible dans le PDF |
| 429 | Limite de taux ou quota atteint — réessayez plus tard avec une temporisation exponentielle |
| 500 | Erreur de résumé temporaire — réessayez |

> **Découvrez le moteur en action** — Essayez l'outil web gratuit avec l'un de vos PDF.

## FAQ

### Puis-je appeler l'API directement depuis le navigateur ?

Techniquement oui, mais votre clé serait visible par n'importe qui. Faites transiter les requêtes par votre backend comme dans l'exemple Express.

### Est-ce compatible avec Deno, Bun ou Cloudflare Workers ?

Oui — tout environnement d'exécution prenant en charge fetch et FormData de manière standard fonctionne de la même façon.

### Existe-t-il un SDK TypeScript ?

Pas encore. L'API consiste en un unique point de terminaison multipart, un petit wrapper typé autour de fetch suffit amplement.

### Où se trouve la documentation de référence complète ?

Dans la documentation de l'API, qui détaille tous les paramètres et propose des exemples dans plusieurs langages.

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