NodeJS将Base64转PDF生成损坏文件,求排查解决方法
问题:Base64转PDF后文件损坏无法打开
尝试将Base64字符串解码为PDF,但生成的文件损坏,无法用Adobe Reader打开。目标是成功转换后用nodemailer将其作为附件发送。
客户端代码
let pdf; const createPDF = () => { const report = new JsPDF('portrait','pt','a4'); report.html(document.querySelector(['.input_container'],[imageURL])).then(() => { pdf = report.output('datauristring'); }); } const data = { pdf, }
服务端代码
let data = req.body; const base64String = data.pdf; const pdfBuffer = Buffer.from(base64String, 'base64'); fs.writeFile('output.pdf', pdfBuffer,{encoding:"binary"}, err => { if(err){ console.log(err) }else{ console.log("PDF CREATED") } })
错误原因及解决方案
1. 客户端:data URI前缀未去除
report.output('datauristring')返回的是完整的data URI格式字符串(data:application/pdf;base64,xxxxxx),其中前缀data:application/pdf;base64,不属于Base64编码内容,直接传给后端解码会导致文件损坏。
修改客户端代码,截取Base64部分:
let pdf; const createPDF = () => { const report = new JsPDF('portrait','pt','a4'); report.html(document.querySelector('.input_container'), { imageURL }).then(() => { // 去掉data URI前缀,仅保留Base64编码内容 pdf = report.output('datauristring').split(',')[1]; }); } const data = { pdf, }
2. 服务端:错误指定编码参数
fs.writeFile写入Buffer时,无需指定{encoding:"binary"}——Buffer本身是二进制数据,指定该参数会强制按二进制编码解析,反而破坏原有字节结构。
修改服务端代码:
let data = req.body; const base64String = data.pdf; const pdfBuffer = Buffer.from(base64String, 'base64'); fs.writeFile('output.pdf', pdfBuffer, err => { if(err){ console.log(err) }else{ console.log("PDF CREATED") } })
Nodemailer发送附件示例
修复后可直接用生成的Buffer作为附件内容:
// 假设已配置好nodemailer transporter const mailOptions = { from: 'sender@example.com', to: 'recipient@example.com', subject: 'PDF附件测试', text: '请查看附件PDF', attachments: [ { filename: 'report.pdf', content: pdfBuffer, contentType: 'application/pdf' } ] }; transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log('邮件发送成功: ' + info.response); });
内容的提问来源于stack exchange,提问作者stevan kostic
相关产品推荐
相关产品推荐

