Html2canvas: Devuelve una imagen en blanco para cualquier elemento cuando el cuerpo del documento tiene más de 30.000 píxeles de alto.

Creado en 31 may. 2016  ·  16Comentarios  ·  Fuente: niklasvh/html2canvas

La biblioteca devuelve una imagen vacía cuando el cuerpo del documento tiene más de 30.000 px. Intentaría capturar un elemento de 100 x 100. Pero obtiene una imagen en blanco del elemento en un cuerpo alto.

Aquí hay un violín que demuestra este error.

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

Puede cambiar el tamaño del cuerpo a menos de 30.000 y funciona bien.

Needs More Information

Comentario más útil

@niklasvh Esta es una

  • Por defecto, el ancho / alto máximo según los requisitos del navegador para el lienzo
  • Divide y conquista usando varios elementos de lienzo y devuelve una matriz.
  • Lanza un error en la consola avisando sobre las limitaciones del lienzo y sugiriendo formas de implementarlo.

En mi caso, estoy clonando todo el cuerpo y solo configuro el ancho / alto máximo: html2canvas(el, {height: 3000, width: 3000}) .

Todos 16 comentarios

Tengo exactamente el mismo problema que tú. ¿Has encontrado alguna solución a esto?

emm, tengo el mismo problema, pero finalmente, ¡lo descubrí!
en mi caso, aquí está mi solución:
poner un iframe en su elemento de cuerpo, como

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

y cada elemento que necesita convertir en lienzo, puede copiarlos y ponerlos en este iframe, y usar html2canvas, y luego eliminarlo, así

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

¿Sigue siendo un problema con la v1.0.0 ? Si es así, ¿podría compartir un ejemplo en jsfiddle .

Este problema se ha cerrado automáticamente porque no ha habido respuesta a nuestra solicitud de más información del autor original. Con solo la información que se encuentra actualmente en el problema, no tenemos suficiente información para tomar medidas. Comuníquese con nosotros si tiene o encuentre las respuestas que necesitamos para que podamos investigar más.

hola cuando trato de filtrar un iframe con cámara ip interna, devuelve una imagen vacía, por favor, ¿pueden ayudarme?

@niklasvh Esta es una

  • Por defecto, el ancho / alto máximo según los requisitos del navegador para el lienzo
  • Divide y conquista usando varios elementos de lienzo y devuelve una matriz.
  • Lanza un error en la consola avisando sobre las limitaciones del lienzo y sugiriendo formas de implementarlo.

En mi caso, estoy clonando todo el cuerpo y solo configuro el ancho / alto máximo: html2canvas(el, {height: 3000, width: 3000}) .

@toadkicker hermano, guardas mi código / trabajo hoy jajajajajajajaht muchas gracias

@toadkicker ¡Gracias!

emm, tengo el mismo problema, pero finalmente, ¡lo descubrí!
en mi caso, aquí está mi solución:
poner un iframe en su elemento de cuerpo, como

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

y cada elemento que necesita convertir en lienzo, puede copiarlos y ponerlos en este iframe, y usar html2canvas, y luego eliminarlo, así

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

Probé este método, pero no funcionó exactamente. A mi manera, funcionará con el siguiente código:

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

Y si desea aplicar su estilo CSS de la misma manera que en el documento actual, también debe copiar el estilo en el 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);
});

Nuevamente, esta es una limitación en el propio navegador y esta biblioteca no maneja el error correctamente. Ninguna solución de codificación, además de limitar la cantidad de píxeles capturados, la cambiará.

emm, tengo el mismo problema, pero finalmente, ¡lo descubrí!
en mi caso, aquí está mi solución:
poner un iframe en su elemento de cuerpo, como

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

y cada elemento que necesita convertir en lienzo, puede copiarlos y ponerlos en este iframe, y usar html2canvas, y luego eliminarlo, así

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

Probé este método, pero no funcionó exactamente. A mi manera, funcionará con el siguiente código:

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

Y si desea aplicar su estilo CSS de la misma manera que en el documento actual, también debe copiar el estilo en el 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);
});

en mi caso, todos los elementos son svg o estilo en línea, por lo que no necesito agregar una hoja de estilo. pero sí, debe agregar su hoja de estilo si es necesario

Me he enfrentado al mismo problema. Necesitaba hacer una imagen desde la ventana modal (con posición fija). Siempre recibí una imagen en blanco. El problema estaba en la posición de desplazamiento. Este código funciona para mí:

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

¡Funcionó para mí como un encanto! ¡Gracias por la inteligente solución!

@invisor salvavidas! Eso es lo único que funcionó para mí.

Esta opción también podría ser una solución para desplazar casos relacionados

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

¿Fue útil esta página
0 / 5 - 0 calificaciones