2013-08-16 110 views
6
<div id="Contents"> 
<div style="float:left;margin-left:10px;"> 
<svg></svg> 
</div> 
<div style="float:left;margin-left:10px;"> 
<svg></svg> 
</div> 
</div> 

这是我的HTML代码。我想将其转换为画布图像。html和Svg to Canvas javascript

html2canvas($("#Contents"), { 
    onrendered: function(canvas) { 
    window.open(canvas.toDataURL()); 

    } 
}); 

我使用html2canvas插件将其转换为图像,但它不显示svg。 我解决转换SVG TP画布,但现在html2canvas不工作

var $to=$("#MainContents").clone(); 

      $($to).children(".box").each(function() { 
    var svg = ResizeArray[$(this).children(".box-content").children().attr("new-id")-1].svg(); 
      var Thiscanvas = document.createElement("canvas"); 
      Thiscanvas.setAttribute("style", "height:" + 100 + "px;width:" + 100+ "px;"); 

      canvg(Thiscanvas, svg); 

      $(this).append(Thiscanvas); 

     }); 
     html2canvas($($to), { 
     onrendered: function(canvasq) { 
     var w=window.open(canvasq.toDataURL()); 
     w.print(); 
     } 
    }); 

我可以SVG转换为画布,但html2canvas功能无法正常工作。

+0

[Fabric.js](http://fabricjs.com)可以呈现在画布上 – kangax

+0

HTTP SVG://计算器.com/questions/14165426/can-html2canvas-render-svg-in-a-page – azad

回答

0

html2canvas不允许保存SVG是一个问题。
https://github.com/niklasvh/html2canvas/issues/95

如果你想保存你的跟随其他方式的SVG,喜欢你的SVG转换成PNG例如

SVG - >帆布 - > PNG - >帆布 - > PNG

+0

canvg可以使用html2canvas吗? 。我将在使用html2canvas之前先转换canvg。我认为他们不一起工作。 – user2622044

+0

你可以尝试一下,看看我已经发布到我的答案有人已经尝试过的链接 –

1

由于html2canvas不采用svg元素,因此在调用html2canvas方法之前,需要将所有svg元素转换为画布。您可以使用canvg库将所有svg转换为画布。你可以通过jQuery对象(这需要从SVG转换为画布,也可以是父元素)以下方法:

function svgToCanvas (targetElem) { 
var nodesToRecover = []; 
var nodesToRemove = []; 

var svgElem = targetElem.find('svg'); 

svgElem.each(function(index, node) { 
    var parentNode = node.parentNode; 
    var svg = parentNode.innerHTML; 

    var canvas = document.createElement('canvas'); 

    canvg(canvas, svg); 

    nodesToRecover.push({ 
     parent: parentNode, 
     child: node 
    }); 
    parentNode.removeChild(node); 

    nodesToRemove.push({ 
     parent: parentNode, 
     child: canvas 
    }); 

    parentNode.appendChild(canvas); 
}); 

html2canvas(targetElem, { 
    onrendered: function(canvas) { 
     var ctx = canvas.getContext('2d'); 
     ctx.webkitImageSmoothingEnabled = false; 
     ctx.mozImageSmoothingEnabled = false; 
     ctx.imageSmoothingEnabled = false; 
    } 
}); 

}

1

您的解决方案精美的作品。由于我没有在我的应用程序中使用jQuery,因此我必须更改svgCanvas中的几行以获取svg元素并遍历它们。其余的功能没有任何改变。我的代码是...

function svgToCanvas (targetElem) { 
     var nodesToRecover = []; 
     var nodesToRemove = []; 

     var svgElems = document.getElementsByTagName("svg"); 

     for (var i=0; i<svgElems.length; i++) { 
      var node = svgElems[i]; 
      var parentNode = node.parentNode; 
      var svg = parentNode.innerHTML; 

      var canvas = document.createElement('canvas'); 

      canvg(canvas, svg); 

      nodesToRecover.push({ 
       parent: parentNode, 
       child: node 
      }); 
      parentNode.removeChild(node); 

      nodesToRemove.push({ 
       parent: parentNode, 
       child: canvas 
      }); 

      parentNode.appendChild(canvas); 
     } 
} 
5

您将需要使用canvg库绘制这个SVG到一个临时的帆布,然后删除画布,一旦你采取使用html2canvas截图。

这里是链接为canvg:https://code.google.com/p/canvg/downloads/list

尝试这种情况:

//find all svg elements in $container 
//$container is the jQuery object of the div that you need to convert to image. This div may contain highcharts along with other child divs, etc 
var svgElements= $container.find('svg'); 

//replace all svgs with a temp canvas 
svgElements.each(function() { 
    var canvas, xml; 

    canvas = document.createElement("canvas"); 
    canvas.className = "screenShotTempCanvas"; 
    //convert SVG into a XML string 
    xml = (new XMLSerializer()).serializeToString(this); 

    // Removing the name space as IE throws an error 
    xml = xml.replace(/xmlns=\"http:\/\/www\.w3\.org\/2000\/svg\"/, ''); 

    //draw the SVG onto a canvas 
    canvg(canvas, xml); 
    $(canvas).insertAfter(this); 
    //hide the SVG element 
    this.className = "tempHide"; 
    $(this).hide(); 
}); 

//... 
//HERE GOES YOUR CODE FOR HTML2CANVAS SCREENSHOT 
//... 

//After your image is generated revert the temporary changes 
$container.find('.screenShotTempCanvas').remove(); 
$container.find('.tempHide').show().removeClass('tempHide');