You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pdf2json与pdf-parse无法在Next.js App Router中正常工作?

Next.js App Router 中 pdf2json 与 pdf-parse 无法正常工作的问题及解决方案

问题描述

在 Next.js App Router 项目中使用 pdf2json 和 pdf-parse 实现 PDF 解析时遇到异常:

  • pdf2json 抛出 ReferenceError: nodeUtil is not defined 错误
  • pdf-parse 对应的 API 路由返回 404 错误
    但相同代码在旧版 Pages Router 项目中可正常运行。

复现步骤

  • 执行 npx create-next-app@latest,选择启用 App Router
  • 在 app/api/test 目录下创建路由文件,添加以下代码:
import { NextResponse } from "next/server";
import fs from "fs";
import PDFParser from "pdf2json";
import pdf from "pdf-parse";

export async function GET() {
   const pdfParser = new PDFParser();

   pdfParser.on("pdfParser_dataError", (errData: any) =>
     console.error(errData.parserError)
   );
   pdfParser.on("pdfParser_dataReady", (pdfData: any) => {
     console.log(pdfData);
   });

   pdfParser.loadPDF("./sample.pdf");
  return NextResponse.json({});
}
  • 在项目根目录放置 sample.pdf 文件
  • 运行 curl localhost:3000/api/test,触发 pdf2json 错误:
- error node_modules/pdf2json/lib/pdf.js (66:0) @ eval
- error Error [ReferenceError]: nodeUtil is not defined
  • 替换为 pdf-parse 代码后,请求返回 404:
import { NextResponse } from "next/server";
import fs from "fs";
import pdf from "pdf-parse";

export async function GET() {
   let dataBuffer = fs.readFileSync("./sample.pdf");

  pdf(dataBuffer).then(function (data) {
    console.log(data.numpages);
    console.log(data.numrender);
    console.log(data.info);
    console.log(data.metadata);
    console.log(data.version);
    console.log(data.text);
  });
  return NextResponse.json({});
}

解决方案

1. 解决 pdf2json 的 nodeUtil 未定义错误

错误原因是 App Router 默认使用 Edge Runtime,而 pdf2json 依赖 Node.js 核心模块,需显式指定路由使用 Node.js Runtime:

  • 在路由文件顶部添加运行时配置:
export const runtime = 'nodejs';
  • 调整代码为异步 Promise 形式,确保响应在解析完成后返回:
import { NextResponse } from "next/server";
import fs from "fs";
import PDFParser from "pdf2json";

export const runtime = 'nodejs';

export async function GET() {
  return new Promise((resolve) => {
    const pdfParser = new PDFParser();

    pdfParser.on("pdfParser_dataError", (errData) => {
      console.error(errData.parserError);
      resolve(NextResponse.json({ error: errData.parserError }, { status: 500 }));
    });

    pdfParser.on("pdfParser_dataReady", (pdfData) => {
      console.log(pdfData);
      resolve(NextResponse.json({ data: pdfData }));
    });

    pdfParser.loadPDF("./sample.pdf");
  });
}

2. 解决 pdf-parse 的 404 错误

404 是因为异步解析未完成就提前返回响应,需等待解析完成后再返回:

  • 同样先指定 Node.js Runtime
  • 使用 await 等待 pdf() 异步操作完成:
import { NextResponse } from "next/server";
import fs from "fs";
import pdf from "pdf-parse";

export const runtime = 'nodejs';

export async function GET() {
  try {
    const dataBuffer = fs.readFileSync("./sample.pdf");
    const parsedData = await pdf(dataBuffer);

    console.log(parsedData.numpages);
    console.log(parsedData.numrender);
    console.log(parsedData.info);
    console.log(parsedData.metadata);
    console.log(parsedData.version);
    console.log(parsedData.text);

    return NextResponse.json(parsedData);
  } catch (error) {
    console.error(error);
    return NextResponse.json({ error: 'PDF 解析失败' }, { status: 500 });
  }
}

核心原因

Next.js App Router 默认启用 Edge Runtime,该环境对 Node.js 核心模块支持有限;而 pdf2json、pdf-parse 依赖 Node.js 专属 API,因此必须显式指定路由使用 Node.js Runtime。Pages Router 默认使用 Node.js 环境,所以无此问题。

内容的提问来源于stack exchange,提问作者Andrew Luo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:52:15