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

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环境:

  1. 创建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"
  }
}
  1. 编写边缘函数代码:
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 });
  }
});
  1. 在Supabase控制台部署时,需将import_map.json与代码文件一同上传,或在supabase.toml中指定导入映射路径。

注意事项

  • Supabase边缘函数的Deno环境不支持Node.js特定API,务必选择ESM兼容的库
  • 处理大型PDF时,建议添加超时和内存限制,避免触发边缘函数资源阈值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:47:11