Html2canvas: SVGのテキストタグのオーバーラップ(重複/倍増)

作成日 2015年02月19日  ·  24コメント  ·  ソース: niklasvh/html2canvas

(申し訳ありませんが、私は英語が苦手です)

こんにちは、
この素晴らしいスクリプトを使用してSVGタグをレンダリングしています
SVGのテキストタグをキャンバスにレンダリングすると、テキストが重なっています
テキストタグはテキストノードおよびSVGとして処理されます
あなたはそれをtransformプロパティで簡単に見ることができます
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

最も参考になるコメント

@ヒョジン
IEでテストした後、 parentElementプロパティが現在のノードに入力されていないため、修正は機能しません。 代わりにparentNode使用してください! いずれにせよ、 NodeParserに入ってノードについて話しているので、より明確になります。

それ以外の場合は、代わりにタグ名でテストし、コードを変更してparentNodeのインスタンスをテストし、parentNodeがSVGElementない場合にのみ、現在のノードにTextContainerがあることを処理します。

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件

ありがとう#ひょうじん。 それは私を助けます。

ありがとう、私をたくさん助けてください!

修正していただきありがとうございます。

tspantagNameを確認することもできます。
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName!== "text" && node.parentElement.tagName!== "tspan"

@ncoqueletコードを更新しました。 ありがとう!

@ヒョジン
IEでテストした後、 parentElementプロパティが現在のノードに入力されていないため、修正は機能しません。 代わりにparentNode使用してください! いずれにせよ、 NodeParserに入ってノードについて話しているので、より明確になります。

それ以外の場合は、代わりにタグ名でテストし、コードを変更してparentNodeのインスタンスをテストし、parentNodeがSVGElementない場合にのみ、現在のノードにTextContainerがあることを処理します。

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これと修正の調査に感謝します。 先日、まったく同じ問題が発生しましたが、何が原因なのか完全にはわかりませんでした。

ここで混乱している場所がわかりませんが、「Uncaught ReferenceError:NodeParserisnotdefined」という例外が発生します。

@ Suchetana10いつ例外が発生しましたか? スクリプトの読み込み中?

@hyojinありがとう..私のために働いた

@ひょうじんありがとう! 私にとっても完璧に機能します

happyvishwasvadavi ugnugenそれを聞いてうれしいです! :)

まだテキスト要素の問題を抱えている人もいます。この問題を開いて変更し、PRを再度送信します。

image

誰かが私がテストできるこの修正を含むライブラリのビルドを持っていますか? ハイチャートページで同じ問題が発生しています。

このビルドは修正で利用できますか? 私はまだhighchartsでこの問題に直面しています。

この修正はビルドで利用できますか、それともオーバーライドを作成する必要がありますか?

これはまだv1.0.0の問題ですか? もしそうなら、 jsfiddleで例を共有して

この問題は、元の作成者からの詳細情報の要求に対する応答がなかったため、自動的にクローズされました。 現在問題になっている情報だけでは、行動を起こすのに十分な情報がありません。 さらに調査できるように、必要な回答がある場合はご連絡ください。

親愛なる@niklasvh

この素晴らしいライブラリをありがとう。 この問題を最新バージョン(v1.0.0-rc.3)で再現できます。

ここここでは、(グラフタイトルの)テキストノードの一部が複製されていることがわかります。

再現する手順 -

  1. CodePenリンクを開いてください-Chromeでのみhttps://codepen.io/karannagupta/pen/RXpddB
  2. [クリップボードにコピー]ボタンをクリックします
  3. アニメーションが終了するのを待ちます(またはコピーされたメッセージについてはコンソールを参照してください)
  4. グラフをペイントまたはドキュメントに貼り付けます(ctrl + v)

グラフのタイトルはLine#193に追加されています

@hyojin 、もう一度問題を開いて

よろしく、
カラン



text-duplication

こんにちは@karannagupta
私のブランチを試しいただけますか?

こんにちは@hyojin

ご使用のバージョンのライブラリ(v0.5.0-alpha2)では機能しません。 ここで私のペンでライブラリをテストできます

また、最新バージョンのhtml2canvasを使用したいと思います。 また、html2canvas.svgを使用する必要はありません。

よろしく、
カラン

Unicodeフォントの問題であることが判明しました

image

このページは役に立ちましたか?
0 / 5 - 0 評価