Existe-t-il un moyen de rendre du HTML en image comme PNG? Je sais que c'est possible avec canvas mais j'aimerais rendre un élément html standard comme div par exemple.
Pour créer une sorte d'assistance utilisateur, par exemple. Malheureusement, ce n'est pas possible (pour des raisons de sécurité?). Vous devez demander à l'utilisateur d'appuyer sur PrintScreen pour faire quelque chose.
Cela semble intéressant mais je n'ai pas réussi à le faire fonctionner alors j'ai choisi la solution John Fisher. Merci pour l'info, je vais regarder ce projet dans le futur!
Martin Delille
@MartinDelille: voici un article sur l'utilisation de HTML2Canvas pour créer une IMAGE et vous pouvez également le télécharger côté client codepedia.info/2016/02
Satinder singh
3
dom-to-image (voir la réponse de tsayen) fait un bien meilleur travail pour rendre une image précise.
JBE
3
Cette solution est très lente
hamboy75
3
autre problème, si l'élément est caché ou derrière un autre élément cela ne fonctionnera pas
Yousef
91
Puis-je recommander la bibliothèque dom-to-image , qui a été écrite uniquement pour résoudre ce problème (je suis le mainteneur).
Voici comment vous l'utilisez (quelques autres ici ):
var node = document.getElementById('my-node');
domtoimage.toPng(node).then (function(dataUrl){var img =newImage();
img.src = dataUrl;
document.appendChild(img);}).catch(function(error){
console.error('oops, something went wrong!', error);});
C'est bien! Un moyen de doubler la taille de sortie?
cronoklee le
Merci! Mais qu'entendez-vous exactement par «doubler la taille»?
tsayen le
2
La première chose qui me vient à l'esprit - essayez de rendre votre image en SVG (en utilisant domtoimage.toSvg), puis rendez-la vous-même sur la toile et essayez de jouer avec la résolution de cette toile d'une manière ou d'une autre. Il est probablement possible d'implémenter une telle fonctionnalité comme une sorte d'option de rendu dans la bibliothèque elle-même, afin que vous puissiez passer les dimensions de l'image en pixels. Si vous en avez besoin, je vous serais reconnaissant de créer un problème sur github.
tsayen
8
C'est BEAUCOUP mieux que html2canvas. Merci.
c.hughes
1
@Subho c'est une chaîne contenant l'URL avec des données encodées en base64
tsayen
67
Il y a beaucoup d'options et elles ont toutes leurs avantages et leurs inconvénients.
Option 1: utilisez l'une des nombreuses bibliothèques disponibles
Merci pour une réponse détaillée avec de nombreuses solutions possibles
bszom
wkhtmltoimage / pdf prend en charge le rendu javascript. Vous pouvez définir un délai javascript ou laisser wkhtml vérifier un window.status spécifique (que vous pouvez définir avec javascript lorsque vous savez que vos tâches js sont terminées)
Daniel Z.
PhantomJS prend en charge les éléments dynamiques comme Google Maps. C'est vraiment un navigateur Web complet, juste sans écran. Cependant, vous devez attendre un peu que Google Map charge les tuiles avec la géographie (j'attends 500 ms et autorise les gens à modifier le délai - si ce n'est pas suffisant, recommencer sans augmenter le temps, c'est bien, car ces tuiles sont mises en cache).
Ladislav Zima le
50
Toutes les réponses ici utilisent des bibliothèques tierces tandis que le rendu HTML sur une image peut être relativement simple en Javascript pur. Il y a même eu un article à ce sujet dans la section canevas de MDN.
L'astuce est la suivante:
créer un SVG avec un nœud ForeignObject contenant votre XHTML
définir le src d'une image sur l'url de données de ce SVG
drawImage sur la toile
définir les données du canevas sur l'image cible.src
Pour des raisons de sécurité, le SVG en tant qu'URL de données d'une image agit comme une portée CSS isolée pour le HTML car aucune source externe ne peut être chargée. Ainsi, une police Google, par exemple, doit être intégrée à l'aide d'un outil comme celui-ci .
Même lorsque le HTML à l'intérieur du SVG dépasse la taille de l'image, il sera dessiné correctement sur le canevas. Mais la hauteur réelle ne peut pas être mesurée à partir de cette image. Une solution à hauteur fixe fonctionnera très bien, mais la hauteur dynamique nécessitera un peu plus de travail. Le mieux est de rendre les données SVG dans une iframe (pour une portée CSS isolée) et d'utiliser la taille résultante pour le canevas.
Agréable! La suppression de la dépendance à une bibliothèque externe est en effet la bonne solution. J'ai changé ma réponse acceptée :-)
Martin Delille
Cet article n'est plus là.
MSC
2
Excellente réponse, mais commentant l'état de l'art des API HTML et Web, qui, comme d'habitude, ressemble à quelque chose qui a été retiré par quelqu'un - toutes les fonctionnalités sont techniquement là mais exposées derrière un tableau (sans jeu de mots) de chemins de code étranges qui ressemblent rien du genre de clarté que vous attendez d'une API bien conçue. En langage clair: il est très probablement trivial pour un navigateur de permettre à un Documentd'être rendu dans un raster (par exemple, a Canvas), mais parce que personne n'a pris la peine de le standardiser, nous devons recourir à la folie comme illustré ci-dessus (pas d'offense à l'auteur de ce code).
amn
1
Cette réponse stackoverflow.com/questions/12637395/... semble indiquer que vous pouvez aller assez loin. Mozilla et Chrome ont une longueur d'URI de données illimitée et même IE actuel autorise 4 Go, ce qui se résume à environ 3 Go d'images (en raison de la base64). Mais ce serait une bonne chose à tester.
Sjeiti
3
- quelques tests rapides et sales plus tard - jsfiddle.net/Sjeiti/pcwudrmc/75965 Chrome, Edge et Firefox vont jusqu'à une hauteur de largeur d'au moins 10000 pixels, ce qui (dans ce cas) est un nombre de caractères d'environ 10000000 et une taille de fichier png de 8 Mo. Je n'ai pas testé rigoureusement mais c'est suffisant pour la plupart des cas d'utilisation.
Sjeiti
13
Vous pouvez utiliser PhantomJS , qui est un webkit sans tête (le moteur de rendu dans safari et (jusqu'à récemment) le pilote chrome). Vous pouvez apprendre comment effectuer une capture d'écran de pages ici . J'espère que cela pourra aider!
Cette technique fonctionne bien. Cependant, 2 ans se sont écoulés depuis votre commentaire. Avez-vous rencontré quelque chose qui fonctionne plus rapidement que PhantomJS? D'après mon expérience, la génération d'images prend généralement 2 à 5 secondes dans Phantom.
Brian Webster
Chrome sans tête est désormais possible. Je ne sais pas si c'est plus rapide, mais si vous voulez des captures d'écran précises, c'est une bonne solution.
Josh Maag
11
Vous pouvez utiliser un outil HTML vers PDF tel que wkhtmltopdf. Et puis vous pouvez utiliser un outil PDF en image comme imagemagick. Certes, c'est côté serveur et un processus très compliqué ...
Ou vous pouvez simplement exécuter le frère d'image de wkhtmltopdf, wkhtmltoimage.
Roman Starkov
1
Cette bibliothèque est pour Node.js. Que diriez-vous d'une interface simple?
Vlad
9
La seule bibliothèque que j'ai pu utiliser pour Chrome, Firefox et MS Edge était rasterizeHTML . Il produit une meilleure qualité que HTML2Canvas et est toujours pris en charge contrairement à HTML2Canvas.
Obtention d'un élément et téléchargement au format PNG
Je ne m'attends pas à ce que ce soit la meilleure réponse, mais cela semblait assez intéressant pour être publié.
Écrivez une application qui ouvre votre navigateur préféré au document HTML souhaité, dimensionne correctement la fenêtre et prend une capture d'écran. Ensuite, supprimez les bordures de l'image.
Avez-vous une version rapide de ce qui précède? ou si possible pouvez-vous le réécrire?
ssh
Souhaitez-vous partager le code que vous utilisez pour charger la vue Web que vous rendez? Cela semble être une approche prometteuse pour mon moteur de rendu de vignettes. Merci!
Dave
1
Installer phantomjs
$ npm install phantomjs
Créez un fichier github.js avec le code suivant
var page = require('webpage').create();//viewportSize being the actual size of the headless browser
page.viewportSize ={ width:1024, height:768};
page.open('http://github.com/',function(){
page.render('github.png');
phantom.exit();});
Réponses:
Je sais que c'est une question assez ancienne qui a déjà beaucoup de réponses, mais j'ai encore passé des heures à essayer de faire ce que je voulais:
En utilisant Chrome sans tête (version 74.0.3729.157 à partir de cette réponse), c'est en fait facile:
Explication de la commande:
--headless
exécute Chrome sans l'ouvrir et se ferme une fois la commande terminée--screenshot
capturera une capture d'écran (notez qu'il génère un fichier appeléscreenshot.png
dans le dossier où la commande est exécutée)--window-size
permet de ne capturer qu'une partie de l'écran (le format est--window-size=width,height
)--default-background-color=0
est le tour de magie qui dit à Chrome d'utiliser un transparent arrière-plan , pas la couleur blanche par défautla source
--screenshot='absolute\path\of\screenshot.png'
travaillé pour moiOui. HTML2Canvas existe pour rendre le HTML
<canvas>
(que vous pouvez ensuite utiliser comme image).REMARQUE: il existe un problème connu, à savoir que cela ne fonctionnera pas avec SVG
la source
Puis-je recommander la bibliothèque dom-to-image , qui a été écrite uniquement pour résoudre ce problème (je suis le mainteneur).
Voici comment vous l'utilisez (quelques autres ici ):
la source
domtoimage.toSvg
), puis rendez-la vous-même sur la toile et essayez de jouer avec la résolution de cette toile d'une manière ou d'une autre. Il est probablement possible d'implémenter une telle fonctionnalité comme une sorte d'option de rendu dans la bibliothèque elle-même, afin que vous puissiez passer les dimensions de l'image en pixels. Si vous en avez besoin, je vous serais reconnaissant de créer un problème sur github.Il y a beaucoup d'options et elles ont toutes leurs avantages et leurs inconvénients.
Option 1: utilisez l'une des nombreuses bibliothèques disponibles
Avantages
Les inconvénients
Option 2: utilisez PhantomJs et peut-être une bibliothèque d'encapsuleurs
Avantages
Les inconvénients
Option 3: utilisez Chrome Headless et peut-être une bibliothèque d'encapsuleurs
Avantages
Les inconvénients
Option 4: utiliser une API
Avantages
Les inconvénients
Divulgation: je suis le fondateur d'ApiFlash. J'ai fait de mon mieux pour fournir une réponse honnête et utile.
la source
Toutes les réponses ici utilisent des bibliothèques tierces tandis que le rendu HTML sur une image peut être relativement simple en Javascript pur. Il
ya même eu un article à ce sujet dans la section canevas de MDN.L'astuce est la suivante:
drawImage
sur la toileQuelques points à noter
la source
Document
d'être rendu dans un raster (par exemple, aCanvas
), mais parce que personne n'a pris la peine de le standardiser, nous devons recourir à la folie comme illustré ci-dessus (pas d'offense à l'auteur de ce code).Vous pouvez utiliser PhantomJS , qui est un webkit sans tête (le moteur de rendu dans safari et (jusqu'à récemment) le pilote chrome). Vous pouvez apprendre comment effectuer une capture d'écran de pages ici . J'espère que cela pourra aider!
la source
Vous pouvez utiliser un outil HTML vers PDF tel que wkhtmltopdf. Et puis vous pouvez utiliser un outil PDF en image comme imagemagick. Certes, c'est côté serveur et un processus très compliqué ...
la source
Node.js
. Que diriez-vous d'une interface simple?La seule bibliothèque que j'ai pu utiliser pour Chrome, Firefox et MS Edge était rasterizeHTML . Il produit une meilleure qualité que HTML2Canvas et est toujours pris en charge contrairement à HTML2Canvas.
Obtention d'un élément et téléchargement au format PNG
la source
rasterizeHTML.drawHTML(node.innerHTML, canvas)
Notez que j'appelle innerHTML sur le nœudUtilisez html2canvas, incluez simplement le plugin et la méthode d'appel pour convertir HTML en Canvas puis téléchargez comme image PNG
Source : http://www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
la source
Je ne m'attends pas à ce que ce soit la meilleure réponse, mais cela semblait assez intéressant pour être publié.
Écrivez une application qui ouvre votre navigateur préféré au document HTML souhaité, dimensionne correctement la fenêtre et prend une capture d'écran. Ensuite, supprimez les bordures de l'image.
la source
Utilisez ce code, cela fonctionnera sûrement:
N'oubliez pas d'inclure le fichier Html2CanvasJS dans votre programme. https://html2canvas.hertzen.com/dist/html2canvas.js
la source
Vous ne pouvez pas faire cela avec 100% de précision avec JavaScript seul.
Il existe un outil Qt Webkit et une version python . Si vous voulez le faire vous-même, j'ai eu du succès avec Cocoa:
J'espère que cela t'aides!
la source
Installer phantomjs
Créez un fichier github.js avec le code suivant
Passez le fichier comme argument à phantomjs
la source
HtmlToImage.jar sera le moyen le plus simple de convertir un html en image
Conversion de HTML en image à l'aide de Java
la source
Vous pouvez ajouter une référence HtmlRenderer à votre projet et effectuer les opérations suivantes,
la source