如何使用html2canvas.js将带有@ font-face的SVG文本元素转换为canvas?

时间:2016-11-07 16:14:09

标签: javascript canvas svg font-face html2canvas

我正在尝试使用html2canvas.jshttps://html2canvas.hertzen.com/)来截取JavaScript。但是,当页面包含SVG文本元素时,我遇到了问题。

正如您在下面的屏幕截图中看到的那样,文本元素是重复的(并且只有一个副本保留了正确的字体系列)。

原始身体 Original body: one text element

画布副本 Canvas copy: two text elements

这是我的代码

HTML

<svg width="600" height="200" style="background-color:lightblue;">
  <text transform="translate(100, 100)" style="font-size:60px; font-family: 'Oswald'">Hello world</text>
</svg>

<br/>
<button id="createCanvasButton">Create canvas !</button>

CSS

@import url(//fonts.googleapis.com/css?family=Oswald);

JS

$('#createCanvasButton').on('click', function() {
  html2canvas(document.body).then(function(canvas) {
    document.body.appendChild(canvas);
  });
});

的jsfiddle
https://jsfiddle.net/AndreLovichi/571t86u4/

注意
我一直在寻找类似的问题,我找到了这个问题:SVG Text attribute is doubling - HTML2CANVAS 但是,NodeParser.prototype.getChildren上的补丁对我不起作用:剩下的文本元素具有错误的字体系列。

非常感谢!

1 个答案:

答案 0 :(得分:-1)

注意

I updated on your code. Please add font base64 in svg. Maybe I answered too late :),This is the first answer I use stackoverflow The font need change dataURI insert in SVG

JS

const request = new XMLHttpRequest();
request.open("get", './xxx/demo.woff');
request.responseType = "blob";
request.onloadend = () => { let fontDemoDataURI = reader.result }

html

    <svg>
         <style>
          @font-face {
          font-family: 'Oswald';
              src: url(data:application/font-woff;base64,d09GRgABAAAAOtXY........ED==);
          </style>
    </svg>

链接

enter image description here

https://jsfiddle.net/571t86u4/93/