Html2canvas: SVG 中的文本标签重叠(重复/加倍)

创建于 2015-02-19  ·  24评论  ·  资料来源: niklasvh/html2canvas

(对不起,我英语不好)

你好,
我正在使用这个很棒的脚本来渲染 SVG 标签
当我将 SVG 中的文本标签渲染到画布时,有一些文本重叠
文本标签被处理为文本节点和 SVG
您可以使用转换属性轻松看到
2015-02-19 15 08 29_2
这是示例代码(使用 html2canvas 0.5.0-alpha2)

<html>
<head>
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
  <svg width="100" height="100">
    <g transform="translate(20,20)">
      <text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
    </g>
  </svg>
  <script>
    $(document).ready(function() {
      html2canvas(document.body, {
        onrendered: function(canvas) {
          document.body.appendChild(canvas);
        }
      });
    })
  </script>
</body>
</html

这是我的快速更改

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

我希望这个能帮上忙

Needs More Information

最有用的评论

@hyojin
在 IE 上对其进行测试后,您的修复不起作用,因为parentElement属性未填充到当前节点上。 使用parentNode代替! 无论如何,它会更清楚,因为我们进入了NodeParser并且它谈论了节点。

否则,改为测试标签名称,我更改我的代码以测试parentNode的实例,并仅在 parentNode 不是SVGElement时才处理当前节点具有TextContainer SVGElement .

它适用于 chrome 和 ie11。 在 Firefox 上,由于空白画布错误,我无法对其进行测试!

我的代码

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

我希望这有帮助。

所有24条评论

谢谢#孝真。 这对我有帮助。

谢谢,帮了我很多!

感谢您的修复!

您还可以检查 tspan tagName :
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" && node.parentElement.tagName !== "tspan"

@ncoquelet我更新了我的代码。 谢谢!

@hyojin
在 IE 上对其进行测试后,您的修复不起作用,因为parentElement属性未填充到当前节点上。 使用parentNode代替! 无论如何,它会更清楚,因为我们进入了NodeParser并且它谈论了节点。

否则,改为测试标签名称,我更改我的代码以测试parentNode的实例,并仅在 parentNode 不是SVGElement时才处理当前节点具有TextContainer SVGElement .

它适用于 chrome 和 ie11。 在 Firefox 上,由于空白画布错误,我无法对其进行测试!

我的代码

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

我希望这有帮助。

修复我的 firefox 问题,也适用于 ff :-)

更清晰!
我还检查了它在 ff 上运行良好。
我合并了您的修复程序并更新了拉取请求。 谢谢 :)

@hyojin @ncoquelet感谢您对此的调查和修复。 前几天我遇到了完全相同的问题,我不完全确定是什么导致了它。

我不确定在这里我在哪里感到困惑,但我收到了“未捕获的 ReferenceError:NodeParser 未定义”的异常

@Suchetana10你什么时候得到异常? 在加载脚本中?

@hyojin谢谢你..为我工作

@hyojin谢谢! 也非常适合我

happyvishwasvadavi ugnugen我很高兴听到这个消息! :)

有些人仍然有文本元素的问题,我改变这个问题打开,我会再次发送 PR。

image

有没有人有我可以测试的带有此修复程序的库的构建? 在 highcharts 页面上看到同样的问题..

此版本是否可用于修复? 我仍然面临 highcharts 的这个问题。

此修复程序在构建中可用还是我们必须创建覆盖?

这仍然是v1.0.0的问题吗? 如果是这样,你能不能分享一个关于jsfiddle的例子。

此问题已自动关闭,因为我们要求原作者提供更多信息的请求没有得到回应。 只有当前问题中的信息,我们没有足够的信息来采取行动。 如果您有或找到我们需要的答案,请联系我们,以便我们进一步调查。

亲爱的@niklasvh

感谢您提供这个惊人的图书馆。 我可以用最新版本 - v1.0.0-rc.3 重现这个问题

我在CodePen上创建了一个示例(仅限 Chrome),您将在其中看到一些文本节点(在图表标题中)被复制。

重现步骤 -

  1. 请仅在 Chrome 中打开 CodePen 链接 - https://codepen.io/karannagupta/pen/RXpddB
  2. 单击复制到剪贴板按钮
  3. 等待动画完成(或查看控制台以获取复制的消息)
  4. 将图形粘贴到油漆或文档中 (ctrl + v)

图表标题添加在第 193 行

@hyojin ,你

问候,
卡兰



text-duplication

嗨@karannagupta
你能试试我的分支来检查它是否来自同样的原因吗?

@hyojin

对于您的库版本 (v0.5.0-alpha2),它不起作用。 你可以在这里在我的笔上测试你的

另外,我想使用最新版本的 html2canvas。 那时我也不需要使用 html2canvas.svg。

问候,
卡兰

原来这是Unicode字体的问题

image

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

PodeMarut picture PodeMarut  ·  21评论

mengwuhen picture mengwuhen  ·  29评论

trongdau184 picture trongdau184  ·  64评论

gitbala picture gitbala  ·  43评论

tankchintan picture tankchintan  ·  58评论