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;
    });
  })
);
相关推荐
10share18 小时前
基于大模型的 i18n 方案:把中文原文当 Key,轻松搞定多语言维护
前端·vue.js
啾咪orJIUMI1 天前
Vue 3 + 高德地图封装实战:点位、区域、Loca 流光与 Vue 信息窗体
前端·vue.js
FRing031 天前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
无懈可击1 天前
Vue 可视化AI表单设计器 FcDesigner v3.6 版本发布,支持导出 SQL功能!
vue.js·开源·ai编程
用户298698530141 天前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
徐小夕1 天前
JitArchives,一款基于JitWord协同AI文档打造的企业级电子档案系统
前端·vue.js·github
头发还在的女程序员1 天前
基于 Spring Boot + Vue 3 + uni-app 的灵活用工系统:四端架构与业务流程设计
vue.js·spring boot·uni-app·灵活用工·灵工系统
FRing032 天前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
ruanno_top2 天前
点全选,已选的被清空了:Transfer 三态复选框的三个 bug
vue.js
AI导出鸭PC端2 天前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭