Html2canvas: Retorna uma imagem em branco para qualquer elemento quando o corpo do documento tem mais de 30.000 px de altura.

Criado em 31 mai. 2016  ·  16Comentários  ·  Fonte: niklasvh/html2canvas

A biblioteca retorna uma imagem vazia quando o corpo do documento tem mais de 30.000 pixels. Você tentaria capturar um elemento de 100 x 100. Mas você obtém uma imagem em branco do elemento em um corpo alto.

Aqui está um violino que demonstra esse erro.

https://jsfiddle.net/fvo1xh8b/2/

Você pode alterar o tamanho do corpo para menos de 30.000 e funciona bem.

Needs More Information

Comentários muito úteis

@niklasvh Esta é uma

  • Padrão de largura / altura máximas de acordo com os requisitos do navegador para tela
  • Divida e conquiste usando vários elementos de tela e retorne um array.
  • Lance um erro no console informando sobre as limitações do canvas e sugira maneiras de implementá-lo.

No meu caso, estou clonando o corpo inteiro e apenas configuro a largura / altura máxima: html2canvas(el, {height: 3000, width: 3000}) .

Todos 16 comentários

Eu tenho exatamente o mesmo problema que você. Você encontrou alguma solução para isso?

emm, tenho o mesmo problema, mas finalmente descobri!
no meu caso, aqui está minha solução:
coloque um iframe em seu elemento de corpo, como

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

e cada elemento que você precisa converter para a tela, você pode copiá-los e colocá-los neste iframe, e usar html2canvas, e então removê-lo, assim

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Isso ainda é um problema com a v1.0.0 ? Em caso afirmativo, você poderia compartilhar um exemplo no jsfiddle .

Este problema foi encerrado automaticamente porque não houve resposta ao nosso pedido de mais informações do autor original. Com apenas as informações que estão atualmente no problema, não temos informações suficientes para tomar medidas. Entre em contato se tiver ou encontre as respostas de que precisamos para que possamos investigar mais a fundo.

oi quando tento exibir um iframe com uma câmera ip interna, ele retorna uma imagem vazia, por favor, você pode me ajudar?

@niklasvh Esta é uma

  • Padrão de largura / altura máximas de acordo com os requisitos do navegador para tela
  • Divida e conquiste usando vários elementos de tela e retorne um array.
  • Lance um erro no console informando sobre as limitações do canvas e sugira maneiras de implementá-lo.

No meu caso, estou clonando o corpo inteiro e apenas configuro a largura / altura máxima: html2canvas(el, {height: 3000, width: 3000}) .

@toadkicker irmão, vc salve meu código / trabalho hoje hahahahahahahaht muito obrigado

@toadkicker Obrigado!

emm, tenho o mesmo problema, mas finalmente descobri!
no meu caso, aqui está minha solução:
coloque um iframe em seu elemento de corpo, como

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

e cada elemento que você precisa converter para a tela, você pode copiá-los e colocá-los neste iframe, e usar html2canvas, e então removê-lo, assim

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Tentei esse método, mas não funcionou exatamente. No meu caminho, irei trabalhar com o código abaixo:

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

E se quiser aplicar seu estilo css da mesma forma que no documento atual, você também precisa copiar o estilo para o iframe:

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

Novamente, esta é uma limitação do próprio navegador e esta biblioteca não trata o erro corretamente. Nenhuma solução de codificação além de limitar o número de pixels capturados irá alterá-lo.

emm, tenho o mesmo problema, mas finalmente descobri!
no meu caso, aqui está minha solução:
coloque um iframe em seu elemento de corpo, como

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

e cada elemento que você precisa converter para a tela, você pode copiá-los e colocá-los neste iframe, e usar html2canvas, e então removê-lo, assim

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Tentei esse método, mas não funcionou exatamente. No meu caminho, irei trabalhar com o código abaixo:

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

E se quiser aplicar seu estilo css da mesma forma que no documento atual, você também precisa copiar o estilo para o iframe:

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

no meu caso, todos os elementos são svg ou estilo inline, então não preciso anexar a folha de estilo. mas sim, você deve adicionar sua folha de estilo, se necessário

Eu enfrentei o mesmo problema. Eu precisava fazer uma imagem da janela modal (com posição fixa). Sempre recebi uma imagem branca. O problema estava na posição de rolagem. Este código funciona para mim:

const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
  scrollX: 0,
  scrollY: 0,
  width: area.width,
  height: area.height
})

Funcionou para mim como um encanto! Obrigado pela solução inteligente!

@invisor lifesaver! Essa é a única coisa que funcionou para mim.

Essa opção também pode ser uma solução para rolagem de casos relacionados

{
  scrollX: 0,
  scrollY: -window.scrollY
}

Esta página foi útil?
0 / 5 - 0 avaliações