需求:将页面中DIV内容块(包含svg流程节点)生成图片并直接下载到用户本地,而且不影响以前的svg图使用javascript
实现:html
一、安装依赖java
cnpm install --save html2canvas cnpm install --save canvg@2.0.0-beta.1 canvas@^2 jsdom@^13 xmldom@^0
二、引入依赖node
import html2canvas from "html2canvas"; import canvg from "canvg";
三、代码实现npm
html部分canvas
<div id="tree-containner"> <div id="tree">... 这里须要生成图片的内容 <svg></svg></div> </div>
js部分跨域
主要是两个问题app
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) }) }