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;
    });
  })
);
相关推荐
smallcelebration6 分钟前
139 @vueuse/core依赖介绍使用
前端·javascript·vue.js
zyplayer-doc7 分钟前
研发接口文档怎么长期维护:zyplayer-doc把API、Markdown和变更记录放进同一个知识库
大数据·数据库·人工智能·笔记·pdf·ocr
蒜苔肉丝17 分钟前
Vue3 动态表单:模块复用 + 动态增删行 + 数据回显
前端·javascript·vue.js
不好听61310 小时前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
daols8810 小时前
vxe-table 渲染器教程一:实现金额输入控件
javascript·vue.js·vxe-table
不好听61310 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
腻害兔12 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
腻害兔13 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
蜡台14 小时前
uniapp pdf文件预览组件
pdf·uni-app·合同·pdfh5
Larcher19 小时前
LangChain RAG 排错实录:.env 为什么没有生效
vue.js·后端