简体   繁体   English

带有嵌入式样式表的SVG到PNG

[英]SVG to PNG with Embedded Style Sheet

I'm interested in creating a PNG from SVG. 我对从SVG创建PNG感兴趣。 I followed the code given in: 我遵循以下给出的代码:

https://developer.mozilla.org/en-US/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas https://developer.mozilla.org/zh-CN/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas

But the image does not come out right due to styling from CSS. 但是由于CSS的样式,图片无法正确显示。 I made a local CSS file and do an import into the SVG, as described in: 我制作了一个本地CSS文件,并导入了SVG,如下所述:

How to apply a style to an embedded SVG? 如何将样式应用于嵌入式SVG?

But it does not appear to be using the style sheet. 但是它似乎没有使用样式表。 Any ideas why I would have this error? 任何想法为什么我会有这个错误?

Thanks. 谢谢。

Have a look at PhantomJS - You need to install it then either write your own script or run something along these lines: 看看PhantomJS-您需要先安装它,然后编写自己的脚本或按照以下方式运行某些程序:

phantomjs rasterize.js http://ariya.github.com/svg/tiger.svg tiger.png

You can also save to PDF, set Zoom setting, etc. 您还可以保存为PDF,设置缩放设置等。

You could use html2canvas to generate a canvas from any dom element (including svg elements). 您可以使用html2canvas从任何dom元素(包括svg元素)生成画布。

However, style definitions for svg elements defined in stylesheets are not applied to the generated canvas. 但是,样式表中定义的svg元素的样式定义不会应用于生成的画布。 This can be patched by adding style definitions to the svg elements before calling html2canvas. 可以通过在调用html2canvas之前将样式定义添加到svg元素来进行修补。

Inspired on this article , I've created this: 本文启发,我创建了以下代码:

function generateStyleDefs(svgDomElement) {
  var styleDefs = "";
  var sheets = document.styleSheets;
  for (var i = 0; i < sheets.length; i++) {
    var rules = sheets[i].cssRules;
    for (var j = 0; j < rules.length; j++) {
      var rule = rules[j];
      if (rule.style) {
        var selectorText = rule.selectorText;
        var elems = svgDomElement.querySelectorAll(selectorText);

        if (elems.length) {
          styleDefs += selectorText + " { " + rule.style.cssText + " }\n";
        }
      }
    }
  }

  var s = document.createElement('style');
  s.setAttribute('type', 'text/css');
  s.innerHTML = "<![CDATA[\n" + styleDefs + "\n]]>";
  //somehow cdata section doesn't always work; you could use this instead:
  //s.innerHTML = styleDefs;

  var defs = document.createElement('defs');
  defs.appendChild(s);
  svgDomElement.insertBefore(defs, svgDomElement.firstChild);
}

// generate style definitions on the svg element(s)
generateStyleDefs(document.getElementById('svgElementId'));

// after generating the style defintions, call html2canvas
html2canvas(document.getElementById('idOfElement')).then(function(canvas) {
  document.body.appendChild(canvas);
});

The example at 的例子

"How to apply a style to an embedded SVG?" “如何将样式应用于嵌入式SVG?” as you mentioned should work. 正如您提到的应该工作。 You need to define youObjectElement in this line of code when you test it. 测试它时,需要在此代码行中定义youObjectElement。

var svgDoc = yourObjectElement.contentDocument; var svgDoc = yourObjectElement.contentDocument;

try again. 再试一次。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM