需求:将页面中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、代码实现

主要是两个问题

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)
        })
    }

 

  

 

版权声明:本文为zycb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zycb/p/11476875.html