在Deno环境下从URL提取PDF文本,需要借助专门的PDF解析库实现,核心流程包括加载远程PDF资源、解析PDF结构、逐页提取文本内容。整个过程不需要依赖本地文件,直接通过URL即可完成操作。

环境准备
首先需要确保本地已经安装Deno运行环境,建议使用1.30及以上版本,保证对现代ES模块和远程依赖的良好支持。本次实现使用pdfjs_dist作为PDF解析核心库,该库是Mozilla推出的PDF.js的npm包版本,在Deno环境下可以通过cdn引入使用。
核心实现步骤
1. 引入依赖并初始化PDF.js
由于Deno原生支持从URL导入ES模块,我们可以直接从cdn获取pdfjs_dist的构建版本,同时需要设置worker的路径,确保PDF解析的异步任务可以正常运行。
// 导入pdfjs_dist的核心模块 import * as pdfjsLib from "https://cdn.skypack.dev/pdfjs-dist@3.11.174/build/pdf.mjs"; // 设置worker的源地址,使用同版本的worker文件 pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdn.skypack.dev/pdfjs-dist@3.11.174/build/pdf.worker.mjs";
2. 加载远程URL的PDF资源
使用Deno的原生fetch API获取PDF的二进制数据,再将数据转换为ArrayBuffer格式,传递给PDF.js的加载接口。需要注意处理网络请求可能出现的异常,比如URL无效、资源无权限访问等情况。
/**
* 从URL加载PDF文档
* @param pdfUrl PDF的远程地址
* @returns PDF文档实例
*/
async function loadPdfFromUrl(pdfUrl: string) {
try {
// 发起网络请求获取PDF数据
const response = await fetch(pdfUrl);
if (!response.ok) {
throw new Error(`请求PDF失败,状态码: ${response.status}`);
}
// 将响应数据转换为ArrayBuffer
const pdfData = await response.arrayBuffer();
// 加载PDF文档
const pdfDocument = await pdfjsLib.getDocument({ data: pdfData }).promise;
return pdfDocument;
} catch (error) {
console.error("加载PDF过程出错:", error);
throw error;
}
}
3. 逐页提取PDF文本内容
PDF文档加载完成后,可以通过numPages属性获取总页数,遍历每一页调用getTextContent方法获取该页的文本项,再将文本项拼接成完整的页面文本,最终汇总所有页面的内容。
/**
* 提取PDF的所有文本内容
* @param pdfDocument PDF文档实例
* @returns 所有页面的文本拼接结果
*/
async function extractPdfText(pdfDocument: pdfjsLib.PDFDocumentProxy) {
let fullText = "";
const totalPages = pdfDocument.numPages;
// 遍历每一页提取文本
for (let pageNum = 1; pageNum <= totalPages; pageNum++) {
const page = await pdfDocument.getPage(pageNum);
const textContent = await page.getTextContent();
// 将当前页的文本项拼接成字符串
const pageText = textContent.items.map((item: any) => item.str).join(" ");
fullText += `第${pageNum}页内容:n${pageText}nn`;
}
return fullText;
}
4. 完整调用示例
将上面的方法组合起来,传入目标PDF的URL即可完成文本提取,以下是一个完整的可运行示例,你可以替换成自己的PDF地址进行测试。
// 入口函数
async function main() {
// 替换为需要提取文本的PDF的URL,这里使用ipipp.com的示例PDF地址
const targetPdfUrl = "https://ipipp.com/sample.pdf";
try {
const pdfDoc = await loadPdfFromUrl(targetPdfUrl);
const pdfText = await extractPdfText(pdfDoc);
console.log("提取到的PDF文本内容:");
console.log(pdfText);
} catch (error) {
console.error("提取PDF文本失败:", error);
}
}
// 执行入口函数
main();
注意事项
- 如果PDF是加密的或者有权限限制,加载过程会抛出错误,需要先确认PDF的访问权限。
- 部分PDF的文本可能是图片形式存储的,这种场景下
getTextContent无法提取到有效文本,需要额外接入OCR能力处理。 - 如果PDF体积较大,逐页加载的过程可能耗时较长,可以根据需求添加加载进度提示。
- 引入远程cdn依赖时,建议固定版本号,避免后续版本更新导致接口不兼容的问题。
常见问题处理
如果遇到worker加载失败的问题,可以检查workerSrc的地址是否和pdfjs_dist的主模块版本一致,版本不匹配会导致worker无法正常初始化。如果请求URL时出现跨域问题,需要确认目标服务器是否配置了允许跨域访问的响应头,或者将PDF资源转换为同域下的可访问地址。
DenoPDF文本提取URL解析pdfjs_distTypeScript修改时间:2026-06-10 15:03:28