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转换为字符串,问题依旧存在。
错误原因分析
- 请求参数解析错误:客户端传递的是包含
url字段的JSON对象,但API中直接将整个JSON对象赋值给url变量,导致传入pdfExtract.extract的不是字符串链接,而是对象。 - 远程PDF处理方式错误:
pdf.js-extract的extract方法默认不支持直接传入远程URL,它更适合处理本地文件路径或二进制Buffer数据,直接传远程URL会导致网络请求或解析失败。 - 错误信息模糊:catch块中仅返回泛化错误,无法定位具体问题。
修复步骤
- 正确解析请求参数:从JSON请求体中解构出
url字符串。 - 先下载远程PDF二进制数据:使用
fetch获取远程PDF的Buffer,再传给pdfExtract.extract处理。 - 返回具体错误信息:在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); }
测试验证
- 确保替换客户端代码中的
url为有效的远程PDF下载链接。 - 调用API后,控制台将输出PDF的文件名和每页提取的文本内容。
- 若出现错误,API会返回具体的错误信息(如网络请求失败、PDF解析错误等),便于定位问题。
内容的提问来源于stack exchange,提问作者CAO RUI
相关产品推荐
相关产品推荐

