1. 首页
  2. 指南
  3. 使用 JavaScript 的 PDF 总结 API

使用 JavaScript 和 Node.js 总结 PDF — API 教程

仅使用 fetch 和 FormData 即可从 Node.js(或任何服务端 JavaScript 运行时)调用 PDF Summarizer API。本教程涵盖首次请求、流式传输、用于您自己的应用程序的小型 Express 端点以及错误处理。

核心要点
  • 适用于 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。
  • 切勿在浏览器代码中公开您的密钥 — 请通过您的服务器代理请求。
更新于 阅读时间约 1 分钟 PDF Summarizer 团队

在 Node.js 中进行您的首次请求

  1. 获取免费 API 密钥注册 并从您的控制面板中复制它。
  2. 将其存储在环境变量中PDF_SUMMARIZE_KEY。
  3. 构建 FormData将 PDF 作为 Blob 附加到 file 字段下。
  4. 通过 POST 发送并读取 JSON。
// 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`);

流式传输总结

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 端点

您的前端上传到您的服务器,服务器添加密钥并转发文件:

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 试用免费网页工具。
体验工具 →

常见问题

可以直接从浏览器调用 API 吗?

从技术上讲可以,但您的密钥将对任何人都可见。请像 Express 示例中那样通过您的后端代理请求。

它适用于 Deno、Bun 或 Cloudflare Workers 吗?

可以 — 任何具有标准 fetch 和 FormData 的运行时都能以相同方式工作。

是否有 TypeScript SDK?

暂无。该 API 是一个单一的 multipart 端点,因此围绕 fetch 构建的一个小型类型化包装器就足够了。

完整的参考文档在哪里?

请参阅 API 文档,其中包含所有参数以及多种语言的示例。

本文由 PDF Summarizer 团队撰写,我们负责构建并维护本站背后的文本提取与摘要处理管线。我们会在真实文档上测试此处描述的每一个方法。最后审阅日期:2026年10月19日。发现错误?请告诉我们。