L84
estoy tratando de usar HTML2Canvas para representar el contenido de un div. Aquí está el código:
var htmlSource = $('#potenzial-page')[0];
$('#btn').on("click", function() {
html2canvas(htmlSource).then(function(canvas) {
var img = canvas.toDataURL();
window.open(img);
});
});
Estoy usando v5 beta 3.
Cuando se ejecuta este código, solo muestra lo que se ve en la pantalla. los #potenzial-page
div es esencialmente la página completa, menos el encabezado y el pie de página. Todo el contenido de este div es visible al desplazarse (hay algunos elementos ocultos, pero no quiero que los elementos ocultos estén visibles en la imagen).
No puedo encontrar lo que está mal o por qué no guardará todo el div. También debo señalar que parece que la imagen es tan alta como el div pero solo parcialmente visible.
Para dar un ejemplo de lo que quiero decir, aquí hay una comparación:
La izquierda es cómo HTML2Canvas debería representar el div. La derecha muestra cómo se representa cuando ejecuta el código anterior. La imagen de la derecha es lo que se ve en la pantalla de mi navegador.
Intenté agregar el height
opción pero no hace la diferencia.
ACTUALIZAR
Si me desplazo hasta la parte superior de la página después ejecute el script, renderizará todo el div como debería.
¿Cómo renderizo el div sin tener que desplazarme hasta la parte superior?
espero que te ayude
html2canvas(htmlSource, {scrollY: -window.scrollY}).then(function(canvas) {
var img = canvas.toDataURL();
window.open(img);
});
-
La única respuesta que funcionó para mí. (Mi caso particular es que el mapa está solo parcialmente fuera de la pantalla y solo verticalmente).
– devuxer
27 de abril de 2020 a las 23:02
-
¡Gracias por esto! Tenía un botón en la parte inferior de una página que convierte parte del contenido en una imagen. ¡Esta era la clave!
– Gurnzbot
19 de febrero de 2021 a las 3:38
-
Gran trabajo. esto realmente me ayudó
– A. Dumas
6 de abril de 2021 a las 9:07
Una solución que funcionó para mí fue agregar lo siguiente a mi css:
.html2canvas-container { width: 3000px !important; height: 3000px !important; }
Evita que html2canvas limite la representación al área visible (que parece ser el valor predeterminado).
Mira aquí: https://github.com/niklasvh/html2canvas/issues/117
-
Me has alegrado el día.
– omikes
5 de diciembre de 2017 a las 22:13
-
¡Esta es la mejor solución!
– Adán
18 de enero a las 15:14
Amit Anand
solía window.scrollTo()
en mi caso y me funciono.
A continuación se muestra un código de muestra
$('#btn').on("click", function() {
window.scrollTo(0,0);
html2canvas(htmlSource).then(function(canvas) {
var img = canvas.toDataURL();
window.open(img);
});
window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);
});
-
Esta fue una gran y rápida solución para mí. En caso de que no le importe desplazarse hasta la parte superior, esto funciona.
– Andy
14 de julio de 2019 a las 17:08
-
¡Gracias por esto! funcionó muy bien
– Mike Luna
10 de julio de 2020 a las 23:44
Puede agregar la posición de desplazamiento como una variable en html2canvas, lo que elimina la necesidad de desplazarse por la página.
html2canvas(document.querySelector("#your-element"), {
scrollX: 0,
scrollY: 0
}).then(function(canvas) {
Acabo de hacer algo como esto y funcionó para mí:
html2canvas(document.querySelector("#capture2image"), {
allowTaint: true,
useCORS: true,
logging: false,
height: window.outerHeight + window.innerHeight,
windowHeight: window.outerHeight + window.innerHeight,
-
Si tiene un DIV desplazable, use
height: $('#wrapper')[0].scrollHeight, windowHeight: $('#wrapper')[0].scrollHeight,
para obtener las dimensiones correctas.– avatar
27 de noviembre a las 16:07
-
esto ni siquiera está tomando la altura completa, la altura de mi contenedor es 7000, pero muestra datos solo algunos de ellos de 24 elementos de la lista, solo puedo ver 14
– Jagannath Swarnkar
el dia de ayer
-
@JagannathSwarnkar Intente ver si el contenido realmente se cargó en todo su cuerpo antes de ejecutar el comando anterior, si se carga solo cuando se desplaza, etc. … si los datos están allí, debería tomar toda la página
–Ricky Levi
hace 10 horas
NSP
Si tiene una altura establecida en el div que desea convertir en un lienzo, debe eliminarlo antes de tomar la instantánea. De lo contrario, simplemente lo cortará debido a esa altura.
$(".yourElemThatHasSomeHeightSet").css("height", "");
Luego notará que al desplazarse hacia abajo, seguirá cortando su documento. Simplemente haz un:
$("html, body").scrollTop(0);
antes de tomar la instantánea.
-
Si tiene un DIV desplazable, use
height: $('#wrapper')[0].scrollHeight, windowHeight: $('#wrapper')[0].scrollHeight,
para obtener las dimensiones correctas.– avatar
27 de noviembre a las 16:07
-
esto ni siquiera está tomando la altura completa, la altura de mi contenedor es 7000, pero muestra datos solo algunos de ellos de 24 elementos de la lista, solo puedo ver 14
– Jagannath Swarnkar
el dia de ayer
-
@JagannathSwarnkar Intente ver si el contenido realmente se cargó en todo su cuerpo antes de ejecutar el comando anterior, si se carga solo cuando se desplaza, etc. … si los datos están allí, debería tomar toda la página
–Ricky Levi
hace 10 horas
mayur shah
Así es como lo he logrado en Reactjs.
El principal problema fueron relación y escala
Si haces un rápido ventana.dispositivoPixelRatiosu valor predeterminado es 2, lo que estaba causando el problema de la mitad de la imagen.
const printDocument = () => {
const input = document.getElementById('divToPrint');
const divHeight = input.clientHeight
const divWidth = input.clientWidth
const ratio = divHeight / divWidth;
html2canvas(input, { scale: '1' }).then((canvas) => {
const imgData = canvas.toDataURL('image/jpeg');
const pdfDOC = new jsPDF("l", "mm", "a0"); // use a4 for smaller page
const width = pdfDOC.internal.pageSize.getWidth();
let height = pdfDOC.internal.pageSize.getHeight();
height = ratio * width;
pdfDOC.addImage(imgData, 'JPEG', 0, 0, width - 20, height - 10);
pdfDOC.save('summary.pdf'); //Download the rendered PDF.
});
}
¿Ha visto esta solución en SO: “Html2canvas que convierte el contenido desbordado en imagen”? Se propone una solución alternativa que establece el desbordamiento en visible, luego se procesa y luego se oculta el desbordamiento.
– Devernay Stéphane
25 de marzo de 2016 a las 3:42
Estoy enfrentando el mismo problema, ¿cómo resolviste esto?
–Rishi Jagati
15 de agosto de 2017 a las 12:26
Este problema está resuelto: https://github.com/niklasvh/html2canvas/issues/…
– zerbeno
7 mayo 2021 a las 17:36