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

Node.js中使用PDF-LIB加载PDF文档报TypeError问题求助

报错根因

这个错误是fs.readFile用法错误导致的,和PDF-LIB本身无关:

  • 你同时混用了回调函数和async/await两种接收返回值的方式:当给fs.readFile传入第三个回调参数时,方法不会返回Promise,就算前面加await,拿到的返回值也只会是undefined,文件内容只会传给回调函数的data入参。
  • 额外问题:PDF是二进制格式文件,你传入'utf8'作为编码参数会把二进制内容按文本解析,直接破坏PDF结构,就算拿到返回值也会加载失败。PDF-LIB的load方法要求传入原始二进制格式的Uint8Array/ArrayBuffer/Buffer数据。
修复方案

二选一即可,推荐用和你现有代码风格匹配的Promise写法:

  1. Promise 版本写法(推荐)
    引入Node.js自带的promise风格fs模块,去掉回调参数、去掉utf8编码配置,默认读取返回的Buffer类型完全兼容PDF-LIB的入参要求:
    // 替换原有fs引入,使用promise版本
    const fs = require('fs/promises');
    
    const pdfData = await fs.readFile('./test.pdf');
    const pdfDoc = await PDFDocument.load(pdfData);
    // 后续编辑逻辑正常写即可
    
  2. 回调版本写法
    如果不想改回调风格,就把PDF加载、后续编辑的所有逻辑都放到readFile的回调函数内部,同样不要传utf8编码:
    const fs = require('fs');
    
    fs.readFile('./test.pdf', async (err, data) => {
        if (err) {
            console.error('读取PDF文件失败:', err);
            return;
        }
        const pdfDoc = await PDFDocument.load(data);
        // 所有PDF相关操作都要写在这个回调作用域里
    });
    

注意:读取PDF类二进制文件时,不要手动指定utf8、ascii这类文本编码,否则会导致文件头、内容流损坏,触发PDF解析失败。如果是浏览器环境上传的文件,要通过File.arrayBuffer()拿到原始二进制数据再传入load方法,不要用File.text()读取文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:36:19