Node.js(Express)中fs.writeFile保存PDF打开空白问题咨询
问题根因
你遇到的PDF打开空白问题,核心错误是写入PDF文件时错误指定了utf-8编码。PDF是标准二进制格式文件,不是纯UTF-8文本,写入时强制用UTF-8做编码转换,会破坏PDF的二进制字节结构,导致PDF阅读器无法正常解析文件内容,最终显示空白。你贴出的PDF内容示例里第二行的乱码字符,本身就是PDF二进制头的特殊字节,用UTF-8转义后这些字节会被篡改,直接导致文件损坏。
修复方法
根据你拿到的pdfData.data的类型,选择对应写法,核心原则是写入二进制文件不要指定文本编码:
- 如果
pdfData.data本身是Buffer类型(比如PDF生成库直接返回的结果、二进制接口返回转好的Buffer),直接移除encoding: "utf-8"配置即可,Node.js写入Buffer时默认走二进制模式,不会做编码转换:
fs.writeFile( "response.pdf", pdfData.data, function (err) { if (err) throw err; console.log("File is created successfully."); } );
- 如果
pdfData.data是ArrayBuffer、Uint8Array类型(比如从前端传过来的二进制数据、HTTP接口拿到的原始二进制响应),先转成标准Buffer再写入,同样不要加UTF-8编码配置:
fs.writeFile( "response.pdf", Buffer.from(pdfData.data), function (err) { if (err) throw err; console.log("File is created successfully."); } );
如果你是通过HTTP请求拉取的PDF内容,记得请求时要配置responseType: 'arraybuffer',不要让请求库默认把响应当成UTF-8文本解析,从数据源层面避免二进制被破坏。
后续排查要点
- 写入完成后对比文件大小:正常生成的PDF文件大小,应该和
pdfData.data的字节长度基本一致,如果大小差距明显,说明中间存在编码转义导致的字节丢失/篡改。 - 不要尝试将PDF二进制内容转成普通字符串做拼接、修改操作,只要经过UTF-8等文本编码转义,PDF的非文本字节就会被破坏。
- 如果使用pdfkit、puppeteer等第三方库生成PDF,直接使用库返回的Buffer/流写入文件即可,不要额外做编码处理。
内容的提问来源于stack exchange,提问作者Oluwaseun Fabiyi
相关产品推荐
相关产品推荐

