Google a refusé de prendre en charge "offsetWidth" pour SVG.
Il y a des idées ?
Doc : https://www.chromestatus.com/features/5724912467574784
J'étais sur le point de soulever ça ! Légèrement inquiet, quelque chose cessera de fonctionner ce mois-ci.
Oui, apparemment à la bêta d'Opera 37 ne fonctionne pas. En outre, la dernière version des problèmes de plug-in pour afficher les arrière-plans et les bordures. J'en ai un, ils ne vérifient pas?
Dans la démo également, les arrière-plans et les bordures ne s'affichent pas ((
C'est un gros problème car nos SVG ne seront plus rendus.
Le plus grand coupable est au sein de cette fonction :
function offsetBounds(node) {
var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};
return {
top: node.offsetTop + parent.top,
bottom: node.offsetTop + node.offsetHeight + parent.top,
right: node.offsetLeft + parent.left + node.offsetWidth,
left: node.offsetLeft + parent.left,
width: node.offsetWidth,
height: node.offsetHeight
};
}
lines 1887 - 1898
dans html2canvas.js
Tous les offsetTop, offsetLeft, offsetWidth, offsetHeight
sont désormais indéfinis pour les SVG
La solution recommandée est getBoundingClientRect()
, mais elle ne fonctionne toujours pas.
Quelqu'un at-il une solution pour cela?
@MarcBalaban Je ne l'ai pas encore essayé, mais ne serait-ce pas simplement ajouter cela au-dessus du retour dans cette fonction;
if ( node.tagName === 'SVG' ) {
return node.getBoundingClientRect();
}
@Dayjo malheureusement non, c'est définitivement sur la bonne voie, mais cette ligne
var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};
ne s'exécute pas correctement non plus car offsetParent a également été déprécié :
Hmm ouais, en y regardant un peu plus, il peut être nécessaire d'utiliser quelque chose comme la fonction getBoundingBoxInArbitrarySpace ici ; https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js selon http://stackoverflow.com /questions/5996005/how-to-use-element-offsetparent-with-html-svg-elements#answers
Pas encore eu l'occasion de faire des tests.
Des nouvelles de ce problème ? Merci!
@chemitaxis - malgré l'avertissement, jusqu'à présent, je n'ai eu aucun problème avec le résultat de html2canvas. Cependant, qui sait si / quand ce changement sera réellement mis en œuvre dans Chrome
On dirait que cela a maintenant cessé de fonctionner Chrome. Les SVG semblent ne pas être rendus du tout, de manière incorrecte ou à la mauvaise échelle/position dans le canevas.
@niklasvh - des idées à ce sujet ? Si j'avais le temps, je serais ravi d'essayer une solution, mais je suis choca pour le moment.
J'ai tenté ma chance en utilisant https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js
Mais je ne savais pas trop où je devais l'implémenter, j'ai essayé à la fois les fonctions offsetBounds
et getBounds
mais en vain. Les coordonnées X et Y semblent être correctes, mais la largeur et la hauteur sont toutes fausses, je ne sais pas si c'est parce que j'utilise css pour faire le SVG à 100% de la largeur du conteneur et de la hauteur automatique. Il faudrait faire des tests plus poussés.
J'ai une branche préliminaire en cours ici (https://github.com/Dayjo/html2canvas/tree/issue-846), en utilisant le dernier commit bêta. si quelqu'un veut tester, il devrait pouvoir utiliser la version dist
, ou simplement reconstruire si vous le souhaitez. Aucune idée à quel point cela fonctionnera bien / si cela fonctionnera.
@Dayjo Oui, j'ai remarqué cela aussi. Les SVG sont totalement dans la mauvaise position et sont presque toujours hors de l'écran maintenant que tous les décalages sont évalués comme indéfinis. J'ai également essayé de résoudre ce problème en utilisant getBoundingClientRect récursif - mais pas de chance :( Je vais jeter un œil à votre branche.
Je l'ai résolu... J'ajouterai la solution à la fin de la semaine si je
avoir le temps. Désolé pour le retard... Cela fonctionne sur FF, Safari et Chrome.
Meilleur.
Le mercredi 29 juin 2016 à 19h00, Yuki K [email protected] a écrit :
@Dayjo https://github.com/Dayjo Oui, j'ai remarqué cela aussi. Les SVG sont
totalement dans la mauvaise position et sont presque toujours hors de l'écran maintenant que
tous les offset*s sont évalués comme indéfinis. J'ai aussi essayé de résoudre
ceci en utilisant getBoundingClientRect récursif - mais pas de chance :( je vais prendre un
regarde ta branche.-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
ou couper le fil
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.
@chemitaxis Génial ! Dans l'attente du correctif.
Hey @chemitaxis , pouvez-vous créer un PR ou un lien vers votre fourchette si vous avez le temps ?
@chemitaxis des progrès à ce sujet ? J'espère tester le code sur un projet que je suis en train de faire pour voir s'il résout tous mes problèmes SVG, en particulier avec IE.
Salut @atdiff :) J'ai résolu le problème en utilisant d'autres bibliothèques...
With this, I can convert SVG to Canvas, and them, export fine...
2016-07-21 20:36 GMT+02:00 atdiff notifications@github.com:
@chemitaxis https://github.com/chemitaxis any progress on this? I'm
hoping to test the code out on a project I'm doing to see if it solves all
of my SVG problems especially with IE.—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment-234343779,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ABWseVDGMW_cSyV_ZMDkkUilXC5mK_Mrks5qX7wcgaJpZM4IDr12
.
Donc @chemitaxis n'a pas résolu ce problème, vient de trouver une solution de contournement n'utilisant plus html2canvas?
Oui, en utilisant un mixage... Mais j'ai totalement intégré, j'ai besoin de refactoriser pour intégrer et faire une pull request... Mais je n'ai pas le temps... Désolé, je vais télécharger un exemple dès que possible. Meilleur.
Ce n'est guère une solution... Il ne devrait pas être nécessaire de contourner le problème comme ça en utilisant d'autres bibliothèques. Les SVG sont simplement mal disposés, et il ne devrait s'agir que de calculer les positions correctes.
Quelqu'un a-t-il réellement trouvé un correctif pour cela? Les SVG semblent ne plus être rendus.
Ce n'est pas une solution mais j'ai trouvé une petite solution de contournement. Je ne pouvais pas non plus faire en sorte que SVG s'affiche correctement dans Chrome, mais il s'afficherait dans Safari. Tout ce que j'ai fait, c'est d'ajouter un attribut de largeur à l'élément en ligne SVG. Même avec un attribut de largeur inexact, il s'imprime comme il se doit dans Chrome et Safari :
var deferred = $q.defer();
element.find('svg').attr('width', '100px');
html2canvas(element, {
background: '#eee',
onrendered: function(canvas) {
var a = document.createElement('a');
a.href = canvas.toDataURL('image/jpeg', 1).replace('image/jpeg', 'image/octet-stream');
a.download = fileName + '.jpg';
a.click();
deferred.resolve();
}
});
return deferred.promise;
Edit : quelque chose à ajouter qui n'est pas lié, mais d'autres peuvent trouver utile lors de la recherche ici. Firefox ne semble pas fonctionner avec ma méthode ci-dessus. Mon SVG avait # signes pour les couleurs hexadécimales (ex: #ccc). Comme il s'agit de caractères réservés dans les URL et que Firefox est strict à ce sujet, le SVG n'apparaissait pas. J'ai remplacé les valeurs rgb à la place et maintenant Firefox s'affiche correctement.
@jgunderson-IAS merci pour cela, je vais l'essayer comme solution de contournement rapide.
J'espère que j'aurai l'occasion de passer une journée à examiner ce bogue, eh bien, peut-être une demi-journée à ce sujet, puis une demi-journée à ce pour quoi je l'utilise, mais cela devrait me donner l'opportunité d'implémenter éventuellement un vraie solution.
@niklasvh je ne sais pas si vous avez examiné cela du tout, ou si vous avez des suggestions sur la meilleure façon de mettre en œuvre un correctif (voir : https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )
@jgunderson-IAS J'ai explicitement défini la taille des SVG, et bien que cette approche hacky signifie qu'ils sont rendus, il semble que la taille soit incohérente, je définis à la fois les propriétés de hauteur et de poids et pourtant ils apparaissent régulièrement " écrasés '. Malheureusement, mes pages reposent sur des tailles svg contrôlées par CSS et représentant 100% de leur conteneur, donc bien qu'il s'agisse d'un tremplin, je pense que je vais devoir recoder la bibliothèque pour calculer correctement les tailles
Voici un exemple de la façon dont les svg sont rendus maintenant que je règle la largeur de l'événement 'onClone' en fonction de la largeur de l'élément parent (tous les svg sont définis sur 100% de largeur en css), la hauteur semble le gâcher encore plus;
J'utilise;
onclone: function(doc){
var w,h;
var svgs = doc.querySelectorAll('svg');
for ( var s = 0; s < svgs.length; ++s ) {
w = svgs[s].parentElement.offsetWidth;
svgs[s].setAttribute('width', w );
}
}
Il semble que cela dépende vraiment du svg lui-même quant à la qualité du rendu de ses proportions. Par exemple, le premier svg (feuille) est beaucoup plus écrasé que les deux autres.
Malheureusement, j'ai dû abandonner l'utilisation de html2canvas et utiliser à la place une solution côté serveur ( wkhtmltoimage
) précisément parce qu'elle ne peut pas rendre les svg avec précision. Je n'ai pas réussi à le faire fonctionner en utilisant getBoundingClientRect
ou getBBox
etc.
Corrigé dans 1.0.0
Commentaire le plus utile
Je l'ai résolu... J'ajouterai la solution à la fin de la semaine si je
avoir le temps. Désolé pour le retard... Cela fonctionne sur FF, Safari et Chrome.
Meilleur.
Le mercredi 29 juin 2016 à 19h00, Yuki K [email protected] a écrit :