vue 使用html2canvas + jsPDF 将html导出为pdf (延伸问题)

出现的问题:其中页面中的图片 导出之后不显示

一、最常见原因:图片跨域(90%都是这个)

❗现象

  • 页面上图片正常显示
  • 导出 PDF 图片消失

原因

html2canvas 在渲染 canvas 时,如果图片是 跨域资源,浏览器会阻止读取(安全策略),导致图片被"污染(tainted canvas)",最终导出为空。


解决方案

方案1:开启 useCORS

javascript 复制代码
html2canvas(element, {
    useCORS: true
})

前提条件:

  • 图片服务器必须支持跨域(有响应头)

Access-Control-Allow-Origin: *


方案2:图片加 crossOrigin

javascript 复制代码
<img src="https://xxx.com/image.png" crossorigin="anonymous" />

注意

如果服务器 没有配置 CORS,上面两个都没用!


方案3(推荐):转 Base64(最稳)

把图片转成 base64 再渲染:

javascript 复制代码
function getBase64Image(img) {
  const canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;

  const ctx = canvas.getContext("2d");
  ctx.drawImage(img, 0, 0);

  return canvas.toDataURL("image/png");
}

👉 或后端直接返回 base64

二、图片未加载完成

现象

偶尔显示,偶尔不显示

解决

确保图片加载完再执行:

javascript 复制代码
await Promise.all(
  Array.from(document.images).map(img => {
    if (img.complete) return Promise.resolve();
    return new Promise(resolve => {
      img.onload = img.onerror = resolve;
    });
  })
);
相关推荐
前端那点事12 分钟前
Vite+Vue3环境判断终极解法!区分开发/生产环境,告别环境报错
前端·vue.js
bellusvita23 分钟前
PDF工具网站
pdf
ZHIS1 小时前
移动端 Vue3 高清 PDF 预览组件开发:支持手势缩放 + 按钮缩放 + 加载进度
vue.js
Amy_yang1 小时前
uni-app 中 web-view 的使用与 App 端全屏问题处理
前端·javascript·vue.js
软件富二代2 小时前
PDF顺手编辑器工具
pdf·电脑·软件
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_40:(DOMImplementation 接口完全解析)
前端·ui·html·媒体
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_39:(DOMException 异常接口完全解析)
前端·javascript·html·媒体
蜡台3 小时前
Vue3 Hook 与 Store 状态管理:深度解析与选型指南
前端·javascript·vue.js
存在的五月雨3 小时前
项目中 Vitest 配置详解:vitest.config.ts
开发语言·javascript·vue.js