Deno环境下Supabase边缘函数PDF文本提取报错,求解决方法
在Deno(Supabase边缘函数)中提取URL PDF文本的解决方案
问题原因
你使用的pdf-lib核心定位是PDF创建与修改,不提供文本提取的API,所以调用extractText()或getTextContent()会触发TypeError,这是库本身的功能限制,并非代码写法问题。
可行解决方案
以下两种方案均适配Deno及Supabase边缘函数环境:
方案1:使用@thi.ng/pdf轻量提取库
这个库专为Deno/ESM环境设计,支持直接从二进制PDF数据提取文本,无需额外配置:
import { extractText } from "https://deno.land/x/thi_ng_pdf@v0.1.2/mod.ts"; async function fetchPDF(url: string): Promise<Uint8Array> { const response = await fetch(url); const data = await response.arrayBuffer(); return new Uint8Array(data); } async function readPDFText(url: string): Promise<string> { const pdfBytes = await fetchPDF(url); // 直接提取全文档文本 return extractText(pdfBytes); } // Supabase边缘函数请求处理逻辑 Deno.serve(async (req) => { const { url } = await req.json(); if (!url) { return new Response(JSON.stringify({ error: "缺少PDF URL参数" }), { status: 400 }); } try { const text = await readPDFText(url); return new Response(JSON.stringify({ text }), { status: 200 }); } catch (err) { return new Response(JSON.stringify({ error: err.message }), { status: 500 }); } });
方案2:使用pdfjs-dist(Mozilla官方PDF处理库)
如果需要更精细的文本控制(比如按页提取、获取文本位置),可以用Mozilla的pdfjs-dist,需配置导入映射兼容Deno环境:
- 创建
import_map.json文件:
{ "imports": { "pdfjs-dist/build/pdf": "https://cdn.skypack.dev/pdfjs-dist@3.11.174/build/pdf.js", "pdfjs-dist/build/pdf.worker": "https://cdn.skypack.dev/pdfjs-dist@3.11.174/build/pdf.worker.js" } }
- 编写边缘函数代码:
import * as pdfjsLib from "pdfjs-dist/build/pdf"; // 配置Worker路径 pdfjsLib.GlobalWorkerOptions.workerSrc = "pdfjs-dist/build/pdf.worker"; async function fetchPDF(url: string): Promise<Uint8Array> { const response = await fetch(url); const data = await response.arrayBuffer(); return new Uint8Array(data); } async function readPDFText(url: string): Promise<string> { const pdfBytes = await fetchPDF(url); const pdfDoc = await pdfjsLib.getDocument({ data: pdfBytes }).promise; let fullText = ""; // 逐页提取文本 for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) { const page = await pdfDoc.getPage(pageNum); const textContent = await page.getTextContent(); // 拼接当前页的所有文本片段 const pageText = textContent.items.map((item: any) => item.str).join(" "); fullText += `${pageText}\n\n`; } return fullText; } // Supabase边缘函数入口 Deno.serve(async (req) => { const { url } = await req.json(); if (!url) { return new Response(JSON.stringify({ error: "缺少PDF URL参数" }), { status: 400 }); } try { const text = await readPDFText(url); return new Response(JSON.stringify({ text }), { status: 200 }); } catch (err) { return new Response(JSON.stringify({ error: err.message }), { status: 500 }); } });
- 在Supabase控制台部署时,需将
import_map.json与代码文件一同上传,或在supabase.toml中指定导入映射路径。
注意事项
- Supabase边缘函数的Deno环境不支持Node.js特定API,务必选择ESM兼容的库
- 处理大型PDF时,建议添加超时和内存限制,避免触发边缘函数资源阈值
内容的提问来源于stack exchange,提问作者DanisJa
相关产品推荐
相关产品推荐

