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

Next.js API路由从PDF下载链接提取文本失败的解决方法

解决Next.js API路由中使用pdf.js-extract处理远程PDF链接的错误

问题背景

在Next.js API路由中尝试通过远程PDF下载链接提取文本数据,使用pdf.js-extract库实现,但调用接口后始终返回500错误:

An error occurred while processing the PDF

即使尝试将data.filename转换为字符串,问题依旧存在。

错误原因分析

  1. 请求参数解析错误:客户端传递的是包含url字段的JSON对象,但API中直接将整个JSON对象赋值给url变量,导致传入pdfExtract.extract的不是字符串链接,而是对象。
  2. 远程PDF处理方式错误:pdf.js-extract的extract方法默认不支持直接传入远程URL,它更适合处理本地文件路径或二进制Buffer数据,直接传远程URL会导致网络请求或解析失败。
  3. 错误信息模糊:catch块中仅返回泛化错误,无法定位具体问题。

修复步骤

  1. 正确解析请求参数:从JSON请求体中解构出url字符串。
  2. 先下载远程PDF二进制数据:使用fetch获取远程PDF的Buffer,再传给pdfExtract.extract处理。
  3. 返回具体错误信息:在catch块中捕获并返回具体错误详情,便于调试。

完整修复代码

API路由代码

import { NextRequest, NextResponse } from "next/server";
import { PDFExtract, PDFExtractOptions } from "pdf.js-extract";

export async function POST(request: NextRequest) {
    try {
        // 正确解构出url字符串
        const { url } = await request.json();
        if (!url) {
            return NextResponse.json({ error: "Missing PDF URL parameter" }, { status: 400 });
        }

        const pdfExtract = new PDFExtract();
        const options: PDFExtractOptions = {};

        // 先下载远程PDF的二进制数据
        const pdfRes = await fetch(url);
        if (!pdfRes.ok) {
            throw new Error(`Failed to fetch PDF: ${pdfRes.status} ${pdfRes.statusText}`);
        }
        const pdfBuffer = await pdfRes.arrayBuffer();

        // 将Buffer传给extract方法处理
        const data = await pdfExtract.extract(new Uint8Array(pdfBuffer), options);
        
        // 返回完整的PDF数据或所需文本
        return NextResponse.json({
            filename: data.filename,
            pagesText: data.pages.map(page => 
                page.content.map(item => item.str).join(' ')
            )
        });
    } catch (error) {
        // 返回具体错误信息
        const errorMsg = error instanceof Error ? error.message : "Unknown error";
        console.error("PDF processing error:", error);
        return NextResponse.json({ error: errorMsg }, { status: 500 });
    }
}

客户端调用代码

// 调用API示例
try {
    const url = "https://example.com/path/to/your.pdf"; // 替换为实际PDF链接
    const res = await fetch("/api/pdf_language_detector", {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({ url }),
    });
    const data = await res.json();
    console.log("PDF提取结果:", data);
} catch (err) {
    console.error("API调用错误:", err);
}

测试验证

  1. 确保替换客户端代码中的url为有效的远程PDF下载链接。
  2. 调用API后,控制台将输出PDF的文件名和每页提取的文本内容。
  3. 若出现错误,API会返回具体的错误信息(如网络请求失败、PDF解析错误等),便于定位问题。

内容的提问来源于stack exchange,提问作者CAO RUI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:37:44