【前端】Vue利用html2Canvas将Dom内容生成图片并下载(解决svg无法显示的问题)


需求:将页面中DIV内容块(包含svg流程节点)生成图片并直接下载到用户本地,并且不影响之前的svg图使用

实现:

1、安装依赖

cnpm install --save html2canvas
cnpm install --save canvg@2.0.0-beta.1 canvas@^2 jsdom@^13 xmldom@^0

2、引入依赖

import html2canvas from "html2canvas";
import canvg from "canvg";

3、代码实现

html部分

<div id="tree-containner">
    <div id="tree">... 这里需要生成图片的内容 <svg></svg></div>
</div>

js部分

主要是两个问题

  • SVG无法显示: 借助canvg将svg转canvas
  • 不能影响原有的元素显示:上一步会改变原有的dom结构导致svg的拖动特性不能在使用,因此用一个中间元素来做图片导出。
   handleGenerator() {
    // 最外层的容器
      const treeContainnerElem = document.getElementById('tree-containner')
    // 要导出div
      const treeElem = document.getElementById("tree")
    // 从要导出的div克隆的临时div
      const tempElem = treeElem.cloneNode(true)
      tempElem.id = 'temp-tree'
      tempElem.className = 'fff'
      tempElem.style.width = treeElem.clientWidth + 'px'
      tempElem.style.height = treeElem.clientHeight + 'px'
      treeContainnerElem.appendChild(tempElem)

     // 在临时div上将svg都转换成canvas,并删除原有的svg节点
      const svgElem = tempElem.querySelectorAll("svg");
      svgElem.forEach((node) => {
        var parentNode = node.parentNode;
        var svg = node.outerHTML.trim();
        var canvas = document.createElement("canvas");
        canvg(canvas, svg);
        canvas.style.zIndex = 9
        if (node.style.position) {
          canvas.style.position += node.style.position;
          canvas.style.left += node.style.left;
          canvas.style.top += node.style.top;
        }
        parentNode.removeChild(node);
        parentNode.appendChild(canvas);
      });


      html2canvas(tempElem, {
        useCORS: true // 允许CORS跨域
      }).then(canvas => {
      // 图片触发下载
          const img = canvas.toDataURL("image/jpeg").replace("data:image/jpeg;base64,", "");
          const finalImageSrc = "data:image/jpeg;base64," + img;
          const aElem = document.createElement('a')
          document.body.appendChild(aElem)
          aElem.href = finalImageSrc
          // 设置下载标题
          aElem.download = "chart.jpg"
          aElem.click()
          document.body.removeChild(aElem)
      treeContainnerElem.removeChild(tempElem)
        })
    }

 

 

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2024 CODEPRJ.COM