使用jsPDF下载DOM对象为PDF时报错:Supplied data is not a JPEG
搞定jsPDF导出PDF时的'Supplied data is not a JPEG'报错
嗨,这个问题我之前踩过坑!虽然代码在jsfiddle能正常跑,但放到项目里出这个错,多半是html2canvas(jsPDF的addHTML方法依赖它)处理资源时的兼容问题,给你几个实用的排查和解决方向:
1. 先查页面里的图片格式
如果你的<div id="b">里有WebP、SVG这类非标准JPEG/PNG的图片,html2canvas转换时很容易出问题——毕竟不同环境对图片格式的支持度不一样,jsfiddle的环境可能宽松些,但你的项目环境可能没兼容好。
- 快速测试:把div里的图片换成普通JPEG/PNG试试,要是能正常导出,那就是图片格式的锅,统一转成JPEG/PNG就行,SVG的话记得给它加明确的宽高属性。
2. 别用废弃的addHTML了,换新版API
addHTML其实已经被jsPDF官方标记为废弃了,旧版本的依赖库可能藏着bug,建议直接升级jsPDF和html2canvas,改用新的方式实现:
// 先确保引入了最新版的jsPDF和html2canvas(CDN或npm安装都行) const pdf = new jsPDF('p', 'pt', 'a4'); const targetElement = document.getElementById('b'); // 用html2canvas先把元素转成canvas html2canvas(targetElement, { useCORS: true }).then(canvas => { // 把canvas转成JPEG格式的base64 const imgData = canvas.toDataURL('image/jpeg', 1.0); // A4纸的尺寸是595.28pt宽,841.89pt高,直接按这个尺寸添加图片 pdf.addImage(imgData, 'JPEG', 0, 0, 595.28, 841.89); pdf.save('web.pdf'); });
3. 排查跨域图片问题
如果div里有跨域的图片,html2canvas会因为同源策略没法正确解析,jsfiddle可能默认允许跨域,但你的项目有严格的CORS限制就会报错。
- 解决办法:要么让图片和项目同域,要么给图片服务器配置CORS允许你的域名访问,同时在html2canvas的配置里加上
useCORS: true(上面的代码已经加了)。
4. 复杂CSS也可能搞事情
如果div里用了渐变、滤镜、复杂transform这类CSS,html2canvas转换时可能生成异常的canvas数据,导致jsPDF识别图片格式出错。
- 快速测试:先把这些复杂样式注释掉,要是能导出PDF,再慢慢调整样式,或者给导出的div单独写一套简化的样式。
你可以先从升级API和检查图片格式这两点入手,应该能很快解决问题~
内容的提问来源于stack exchange,提问作者user11561629




