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.
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);
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
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
}
Comentario más útil
@niklasvh Esta es una
En mi caso, estoy clonando todo el cuerpo y solo configuro el ancho / alto máximo:
html2canvas(el, {height: 3000, width: 3000})
.