# PDFs zusammenfassen mit JavaScript & Node.js – API-Tutorial

Rufen Sie die PDF Summarizer API von Node.js (oder einer beliebigen serverseitigen JavaScript-Laufzeitumgebung) mit nichts weiter als fetch und FormData auf. Dieses Tutorial behandelt einen ersten Request, Streaming, einen kleinen Express-Endpunkt für Ihre eigene App und die Fehlerbehandlung.

## Key facts

- Funktioniert mit Node.js 18+ (integriertes fetch, FormData, Blob) – kein SDK erforderlich.
- POST https://pdf-summarize.com/api/summarize.php, multipart/form-data, Feld file, Header Authorization: Bearer sk_....
- Optionen: length, format, outputLang, includeKeywords.
- Fügen Sie ?stream=1 hinzu und lesen Sie den Antwort-Body als Server-Sent Events (SSE).
- Geben Sie Ihren API-Schlüssel niemals im Browser-Code preis – leiten Sie Requests über Ihren Server weiter.

## Ihr erster Request in Node.js

1. **Kostenlosen API-Schlüssel erhalten** — Registrieren Sie sich und kopieren Sie ihn aus Ihrem Dashboard.
2. **In einer Umgebungsvariable speichern** — PDF_SUMMARIZE_KEY.
3. **FormData erstellen** — Hängen Sie das PDF als Blob unter dem Feld file an.
4. **Als POST senden und das JSON auslesen.** — 

```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} Seiten, ${result.processing_time}s, ${result.requests_remaining} Verbleibende Requests`);
```

## Zusammenfassung streamen

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

## Ein Express-Endpunkt für Ihre eigene App

Ihr Frontend lädt Daten auf **Ihren** Server hoch, welcher den Schlüssel hinzufügt und die Datei weiterleitet:

```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: 'Keine Datei' });
  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);
```

## Fehlerbehandlung

| Status | Bedeutung |
|---|---|
| 400 | Fehlende Datei, kein PDF oder Seitenlimit überschritten |
| 401 | Fehlender oder ungültiger Schlüssel |
| 413 | Datei zu groß |
| 422 | Kein lesbarer Text im PDF gefunden |
| 429 | Rate-Limit oder Kontingent erreicht – später mit Backoff erneut versuchen |
| 500 | Vorübergehender Fehler bei der Zusammenfassung – erneut versuchen |

> **Erleben Sie die Engine in Aktion** — Testen Sie das kostenlose Web-Tool mit einem Ihrer PDFs.

## FAQ

### Kann ich die API direkt aus dem Browser aufrufen?

Technisch ja, aber Ihr Schlüssel wäre für jeden sichtbar. Leiten Sie Requests über Ihr Backend weiter, wie im Express-Beispiel gezeigt.

### Funktioniert es mit Deno, Bun oder Cloudflare Workers?

Ja – jede Laufzeitumgebung mit standardisiertem fetch und FormData funktioniert auf dieselbe Weise.

### Gibt es ein TypeScript-SDK?

Noch nicht. Die API besteht aus einem einzigen Multipart-Endpunkt, sodass ein kleiner typisierter Wrapper um fetch völlig ausreicht.

### Wo finde ich die vollständige Referenz?

In der API-Dokumentation finden Sie alle Parameter und Beispiele in mehreren Sprachen.

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