Html2canvas: Les balises de texte en SVG se chevauchent (dupliquées / doublées)

Créé le 19 févr. 2015  ·  24Commentaires  ·  Source: niklasvh/html2canvas

(Désolé, je ne suis pas bon en anglais)

Bonjour,
J'utilise ce script génial pour rendre les balises SVG
Il y a du texte qui se chevauche lorsque je rends la balise de texte dans SVG sur canvas
La balise de texte doit être traitée en tant que nœud de texte et également en SVG
Vous pouvez le voir facilement avec la propriété transform
2015-02-19 15 08 29_2
Voici un exemple de code (avec 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

Et voici mon changement rapide

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));
};

j'espère que cela aidera

Needs More Information

Commentaire le plus utile

@hyojin
Après l'avoir testé sur IE, votre correctif ne fonctionne pas car la propriété parentElement n'est pas renseignée sur le nœud actuel. Utilisez parentNode place ! En tout cas, ce sera plus clair car on est dans le NodeParser et on parle de node.

Sinon, au lieu de tester sur le nom de la balise, je modifie mon code pour tester l'instance de parentNode et traiter le nœud actuel a un TextContainer uniquement si le parentNode n'est pas un SVGElement .

Il fonctionne sur chrome et ie11. sur firefox je ne peux pas le tester à cause d'un bug de la toile vierge !

mon code

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));
};

J'espère que ça aide.

Tous les 24 commentaires

Merci #Hyojin. Cela m'aide.

Merci, aidez-moi beaucoup!

Merci pour votre correction !

vous pouvez également vérifier sur tspan tagName :
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" && node.parentElement.tagName !== "tspan"

@ncoquelet j'ai mis à jour mon code . Merci!

@hyojin
Après l'avoir testé sur IE, votre correctif ne fonctionne pas car la propriété parentElement n'est pas renseignée sur le nœud actuel. Utilisez parentNode place ! En tout cas, ce sera plus clair car on est dans le NodeParser et on parle de node.

Sinon, au lieu de tester sur le nom de la balise, je modifie mon code pour tester l'instance de parentNode et traiter le nœud actuel a un TextContainer uniquement si le parentNode n'est pas un SVGElement .

Il fonctionne sur chrome et ie11. sur firefox je ne peux pas le tester à cause d'un bug de la toile vierge !

mon code

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));
};

J'espère que ça aide.

résoudre mon problème de firefox, fonctionne aussi sur ff :-)

Plus clair!
J'ai aussi vérifié qu'il fonctionnait bien sur ff.
J'ai fusionné votre correctif et la demande d'extraction a été mise à jour. Merci :)

@hyojin @ncoquelet merci pour l'enquête à ce sujet et le correctif. J'ai rencontré exactement le même problème l'autre jour et je n'étais pas tout à fait sûr de la cause.

Je ne sais pas où je suis confus ici, mais j'obtiens l'exception "Uncaught ReferenceError: NodeParser n'est pas défini"

@Suchetana10 Quand avez-vous obtenu l'exception ? en chargeant le script ?

@hyojin merci .. travaillé pour moi

@hyojin merci ! fonctionne parfaitement pour moi aussi

happyvishwasvadavi ugnugen Je suis content d'entendre ça ! :)

Certaines personnes ont toujours le problème avec l'élément de texte, je change ce problème ouvert et j'enverrai à nouveau PR.

image

Est-ce que quelqu'un a une version de la bibliothèque avec ce correctif que je peux tester ? Voir le même problème sur la page highcharts ..

Cette version est-elle disponible avec le correctif ? Je suis toujours confronté à ce problème avec highcharts.

Ce correctif est-il disponible dans la construction ou devons-nous créer un remplacement ?

Est-ce toujours un problème avec la v1.0.0 ? Si oui, pourriez-vous s'il vous plaît partager un exemple sur jsfiddle .

Ce problème a été automatiquement fermé car il n'y a pas eu de réponse à notre demande d'informations supplémentaires de la part de l'auteur d'origine. Avec seulement les informations qui sont actuellement dans le problème, nous n'avons pas assez d'informations pour prendre des mesures. Veuillez nous contacter si vous avez ou trouvez les réponses dont nous avons besoin afin que nous puissions approfondir nos recherches.

Cher @niklasvh ,

Merci pour cette magnifique bibliothèque. Je suis capable de reproduire ce problème avec la dernière version - v1.0.0-rc.3

J'ai créé un exemple sur CodePen ici (Chrome uniquement) où vous verrez que certains des nœuds de texte (dans le titre du graphique) sont dupliqués.

Étapes à reproduire -

  1. Veuillez ouvrir le lien CodePen - https://codepen.io/karannagupta/pen/RXpddB dans Chrome uniquement
  2. Cliquez sur le bouton Copier dans le presse-papiers
  3. Attendez la fin de l'animation (ou consultez la console pour le message copié)
  4. Collez le graphique dans paint ou dans un document (ctrl + v)

Les titres des graphiques sont ajoutés sur la ligne 193

@hyojin , pouvez-vous rouvrir le problème s'il vous plaît ?

Salutations,
Karan



text-duplication

Salut @karannagupta
Pourriez-vous essayer ma branche pour vérifier si elle vient de la même raison ?

Salut @hyojin

Avec votre version de la bibliothèque (v0.5.0-alpha2) cela ne fonctionne pas. Vous pouvez tester votre bibliothèque sur mon Pen ici

Aussi, j'aimerais utiliser la dernière version de html2canvas. Je n'ai pas non plus besoin d'utiliser html2canvas.svg alors.

Salutations,
Karan

Il s'avère que c'est un problème avec les polices Unicode

image

Cette page vous a été utile?
0 / 5 - 0 notes