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写法:
- 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); // 后续编辑逻辑正常写即可 - 回调版本写法
如果不想改回调风格,就把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
相关产品推荐
相关产品推荐

