You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动