# تلخيص ملفات PDF باستخدام JavaScript وNode.js — دليل واجهة برمجة التطبيقات (API)

استدعِ واجهة برمجة التطبيقات (API) الخاصة بـ PDF Summarizer من Node.js (أو أي بيئة تشغيل JavaScript جانب الخادم) باستخدام fetch وFormData فقط. يغطي هذا الدليل الطلب الأول، والتدفق، ونقطة نهاية Express مصغرة لتطبيقك، ومعالجة الأخطاء.

## Key facts

- يعمل مع Node.js 18+ (دوال fetch وFormData وBlob المدمجة) — لا حاجة لأي حزمة SDK.
- POST https://pdf-summarize.com/api/summarize.php، بصيغة multipart/form-data، حقل file، وترويسة Authorization: Bearer sk_....
- الخيارات: length وformat وoutputLang وincludeKeywords.
- أضف ?stream=1 واقرأ محتوى الاستجابة على شكل أحداث مرسلة من الخادم (Server-Sent Events).
- لا تكشف مفتاحك أبدًا في كود المتصفح — قم بتوجيه الطلبات عبر الخادم الخاص بك.

## طلبك الأول في Node.js

1. **احصل على مفتاح API مجاني** — سجل حساباً جديداً وانسخه من لوحة التحكم الخاصة بك.
2. **قم بتخزينه في متغيّر بيئي** — PDF_SUMMARIZE_KEY.
3. **أنشئ نموذج بيانات (FormData)** — أضف ملف PDF كـ Blob تحت الحقل file.
4. **أرسل الطلب عبر POST واقرأ بصيغة 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} requests left`);
```

## تدفق الملخص (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));
```

## نقطة نهاية Express لتطبيقك الخاص

تقوم الواجهة الأمامية لديك برفع الملف إلى **خادمك**، والذي يضيف بدوره المفتاح ويرسل الملف:

```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: 'No file' });
  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);
```

## معالجة الأخطاء

| الحالة | المعنى |
|---|---|
| 400 | ملف مفقود، أو ليس ملف PDF، أو تم تجاوز حد الصفحات |
| 401 | مفتاح مفقود أو غير صالح |
| 413 | حجم الملف كبير جداً |
| 422 | لا يوجد نص قابل للقراءة في ملف PDF |
| 429 | تم بلوغ حد الاستخدام أو الحصة المسموح بها — أعد المحاولة لاحقاً مع تباعد الطلبات |
| 500 | خطأ مؤقت في التلخيص — أعد المحاولة |

> **شاهد محرك التلخيص قيد العمل أولاً** — جرب الأداة المجانية على الويب باستخدام أحد ملفات PDF الخاصة بك.

## FAQ

### هل يمكنني استدعاء واجهة برمجة التطبيقات (API) مباشرة من المتصفح؟

من الناحية التقنية نعم، ولكن سيكون مفتاحك مرئيًا لأي شخص. قم بتوجيه الطلبات عبر الواجهة الخلفية (Backend) كما في مثال Express.

### هل تعمل مع Deno أو Bun أو Cloudflare Workers؟

نعم — أي بيئة تشغيل تدعم fetch وFormData القياسية ستعمل بنفس الطريقة تمامًا.

### هل توجد حزمة SDK خاصة بلغة TypeScript؟

ليس بعد. واجهة برمجة التطبيقات عبارة عن نقطة نهاية واحدة بصيغة multipart، لذا فإن غلافاً برمجياً بسيطاً ومكتوباً (Typed wrapper) حول fetch يكفي تمامًا.

### أين أجد الوثائق والمراجع الكاملة؟

في توثيق واجهة برمجة التطبيقات (API)، والذي يضم كافة المعلمات والأمثلة بعدة لغات.

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