O Google se recusou a oferecer suporte a "offsetWidth" para SVG.
Existem ideias?
Estava prestes a levantar isso! Um pouco preocupado com algo pare de funcionar este mês.
Sim, aparentemente no Opera 37 beta não funciona. Além disso, a versão mais recente dos problemas de plug-in para exibir planos de fundo e bordas. Eu tenho um, eles não conferem?
Também na demonstração, planos de fundo e bordas não aparecem ((
Este é um grande problema, pois nossos SVGs não serão mais renderizados.
O maior culpado está dentro desta função:
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
em html2canvas.js
Todos os offsetTop, offsetLeft, offsetWidth, offsetHeight
agora são indefinidos para SVGs
A solução recomendada é getBoundingClientRect()
, mas ainda não consigo fazê-la funcionar.
Alguém tem uma solução para isso?
@MarcBalaban Eu não tentei ainda, mas não seria apenas adicionar isso acima do return nessa função;
if ( node.tagName === 'SVG' ) {
return node.getBoundingClientRect();
}
@Dayjo infelizmente não, está definitivamente no caminho certo, mas esta linha
var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};
também não é executado corretamente, pois o offsetParent também foi depreciado:
Hmm, sim, olhando um pouco mais a fundo, pode ser necessário usar algo como a função getBoundingBoxInArbitrarySpace aqui; https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js conforme http://stackoverflow.com / questions / 5996005 / how-to-use-element-offsetparent-with-html-svg-elements # answers
Não tive a chance de fazer nenhum tipo de teste ainda.
Alguma notícia sobre este assunto? Obrigado!
@chemitaxis - apesar do aviso, até agora não tive problemas com o resultado do html2canvas. No entanto, quem sabe se / quando essa mudança será realmente implementada no Chrome
Parece que agora o Chrome parou de funcionar. Os SVGs parecem não ter sido renderizados de forma alguma, incorretamente ou na escala / posição errada na tela.
@niklasvh - alguma opinião sobre isso? Se eu tivesse tempo, ficaria feliz em tentar consertar, mas estou choca no momento.
Tive uma chance usando https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js
Mas não tinha certeza de onde precisava implementá-lo, tentei as funções offsetBounds
e getBounds
, mas sem sucesso. As coordenadas X e Y parecem estar corretas, mas a largura e a altura estão todas erradas, não tenho certeza se é porque estou usando css para tornar o SVG 100% da largura do contêiner e da altura automática. Precisaria fazer alguns testes mais extensos.
Eu tenho um branch preliminar acontecendo aqui (https://github.com/Dayjo/html2canvas/tree/issue-846), usando o commit beta mais recente. se alguém quiser testar, deve poder usar a versão dist
, ou apenas reconstruir, se desejar. Não tenho ideia de quão bem / se vai funcionar.
@Dayjo Sim, também percebi isso. Os SVGs estão totalmente na posição errada e quase sempre fora da tela agora que todos os offset * s são avaliados como indefinidos. Eu também tentei resolver isso usando getBoundingClientRect recursivo - mas sem sorte :( Vou dar uma olhada em seu branch.
Já resolvi ... Vou adicionar a solução no final da semana se eu
tenho tempo. Desculpe pela demora ... Está funcionando no FF, Safari e Chrome.
Melhor.
Na quarta-feira, 29 de junho de 2016 às 19:00, Yuki K [email protected] escreveu:
@Dayjo https://github.com/Dayjo Sim, também percebi isso. SVGs são
totalmente na posição errada e quase sempre fora da tela agora que
todos os offset * s são avaliados como indefinidos. Eu também tentei resolver
isso usando getBoundingClientRect recursivo - mas sem sorte :( Vou pegar um
olhe para o seu ramo.-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
ou silenciar o tópico
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.
@chemitaxis Awesome! Ansioso pela correção.
Ei @chemitaxis , você pode criar um PR ou link para o seu fork se tiver tempo?
@chemitaxis algum progresso nisso? Espero testar o código em um projeto que estou realizando para ver se ele resolve todos os meus problemas de SVG, especialmente com o IE.
Olá @atdiff :)
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
.
Portanto, @chemitaxis não corrigiu esse problema, apenas encontrou uma solução alternativa para não usar mais o html2canvas?
Sim, usando uma mixagem ... Mas eu me integrei totalmente, preciso refatorar para integrar e fazer um pull request ... Mas não tenho tempo ... Desculpe, vou fazer upload de um exemplo o mais rápido possível. Melhor.
Isso dificilmente é uma solução ... Não deveria ser necessário contornar o problema dessa forma usando outras bibliotecas. Os SVGs estão apenas dispostos incorretamente e deve ser apenas uma questão de calcular as posições corretas.
Alguém realmente encontrou uma solução para isso? Os SVGs parecem simplesmente não renderizar mais.
Não é uma correção, mas eu encontrei uma pequena solução alternativa. Eu também não consegui fazer o SVG ser exibido corretamente no Chrome, mas ele seria exibido no Safari. Tudo o que fiz foi adicionar um atributo de largura ao elemento embutido SVG. Mesmo com um atributo de largura impreciso, ele é impresso como deveria no Chrome e no 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;
Editar: algo a adicionar que não está relacionado, mas outros podem ser úteis ao pesquisar aqui. O Firefox não parece funcionar com o meu método acima. Meu SVG tinha sinais # para as cores hexadecimais (ex: #ccc). Como esses são caracteres reservados em URLs e o Firefox é restrito a isso, o SVG não apareceu. Em vez disso, substituí por valores rgb e agora o Firefox exibe corretamente.
@ jgunderson-IAS, obrigado por isso, vou tentar como uma solução alternativa rápida.
Espero ter a chance de passar um dia olhando para esse bug, bem, talvez meio dia sobre isso, depois meio dia sobre para que estou usando isso, mas deve me dar a oportunidade de possivelmente implementar um solução real.
@niklasvh não tem certeza se você olhou para isso ou se tem alguma sugestão sobre a melhor forma de implementar uma correção (consulte: https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )
@ jgunderson-IAS Eu estive definindo explicitamente o tamanho dos SVGs e, embora essa abordagem hackeada signifique que eles sejam renderizados, parece que o tamanho é inconsistente, estou definindo as propriedades de altura e peso e, no entanto, eles aparecem regularmente 'comprimidos '. Infelizmente, minhas páginas dependem de tamanhos svg controlados por CSS e 100% de seu contêiner, então, embora seja um trampolim, acho que vou ter que olhar para recodificar a biblioteca para calcular corretamente os tamanhos
Aqui está um exemplo de como os svgs estão renderizando agora que estou configurando a largura no evento 'onClone' com base na largura do elemento pai (todos os svgs são configurados para 100% de largura em css), a altura parece bagunçar ainda mais;
Estou a usar;
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 );
}
}
Parece que realmente depende do próprio svg para quão bem ele renderiza sua relação de aspecto. Por exemplo, o primeiro (folha) svg é muito mais comprimido do que os outros dois.
Infelizmente, tive que abandonar o uso de html2canvas e usar uma solução do lado do servidor ( wkhtmltoimage
) especificamente porque ele não pode renderizar svgs com precisão. Não consegui fazê-lo funcionar usando getBoundingClientRect
ou getBBox
etc
Corrigido em 1.0.0
Comentários muito úteis
Já resolvi ... Vou adicionar a solução no final da semana se eu
tenho tempo. Desculpe pela demora ... Está funcionando no FF, Safari e Chrome.
Melhor.
Na quarta-feira, 29 de junho de 2016 às 19:00, Yuki K [email protected] escreveu: