1. ホーム
  2. ガイド
  3. JavaScriptによるPDF要約API

JavaScriptとNode.jsを使ったPDFの要約 — APIチュートリアル

Node.js(または任意のサーバーサイドJavaScriptランタイム)から、fetchとFormDataだけで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 として読み込みます。
  • ブラウザコードにAPIキーを絶対に露出させないでください — リクエストはサーバー経由でプロキシしてください。
更新日 読了時間: 約 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}ページ、処理時間: ${result.processing_time}秒、残りリクエスト数: ${result.requests_remaining}`);

要約のストリーミング

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エンドポイント

フロントエンドから自社のサーバーへアップロードし、サーバー側でAPIキーを付与してファイルを転送します:

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: 'ファイルがありません' });
  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 APIキーの欠落または無効
413 ファイルサイズが大きすぎる
422 PDFに読み取り可能なテキストがない
429 レート制限またはクオータに達した — バックオフを伴うリトライを後で実行してください
500 一時的な要約エラー — リトライしてください
まずはエンジンの実際の動作を確認するお持ちのPDFを使って無料のWebツールを試してみる。
ツールを試す →

よくある質問

ブラウザから直接APIを呼び出せますか?

技術的には可能ですが、APIキーが誰からでも見える状態になってしまいます。Expressの例のように、バックエンド経由でリクエストをプロキシしてください。

Deno、Bun、Cloudflare Workersでも動作しますか?

はい — 標準のfetchとFormDataをサポートするランタイムであれば、同様に動作します。

TypeScript SDKはありますか?

現在はありません。APIは単一のマルチパートエンドポイントであるため、fetchの周りに小さな型付きラッパーを記述するだけで十分です。

完全なリファレンスはどこにありますか?

APIドキュメントに、すべてのパラメータと複数の言語によるサンプルが掲載されています。

PDF Summarizerチームによる執筆。当サイトのテキスト抽出および要約パイプラインの開発・運用を手がけています。ここで説明しているすべての手法は、実際のドキュメントを用いてテストされています。最終確認日: 2026年10月19日。エラーを見つけましたか?お知らせください。