JS如何导出Div的内容为图片

本文介绍了使用JavaScript将网页中的div元素导出为图片的方法,包括利用html2canvas转换为canvas再导出为base64编码,以及先转为SVG再转换的方法。针对地图等复杂元素的导出进行了探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近因为项目需要,学习了几天用JS导出页面上的div为图片。项目需求是这样的,一个页面上有统计图和统计表,另外一部分是地图,当用户点击导出报告时,需要将页面内容导出到Excel,统计表可以从后台查出列表,然后以表格形式导出;统计通采用的echarts,可以转换为base64编码,然后后台处理之后导出。但是地图这块就有点难了,首先地图不是一张图片,其次地图的图片不在本地。


    div导出为图片,并不是直接完成的,原理可以认为截取屏幕上div大小,然后转换为图片格式。现在有两种方式,首先是将div转换为Html5的画布,然后画布转换成base64编码,传回后台进行处理;第二种是先把div内容转成svg,然后再转换成base64。


第一种

<html>  
    <head>  
        <meta name="layout" content="main">  
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
        <script type="text/javascript" src="jquery-1.8.3.min.js"></script>  
        <script type="text/javascript" src="html2canvas.js"></script>  
           
        <script  type="text/javascript" >  
	$(document).ready( function(){  
                $(".button").on("click", function(event) {  
                        event.preventDefault();  
                        html2canvas(document.getElementById("textArea"), {  
                        allowTaint: true,  
                        taintTest: false,  
                        onrendered: function(canvas) {  
                            canvas.id = "mycanvas";  
                            //生成base64图片数据  
                            var dataUrl = canvas.toDataURL();  
                            var newImg = document.createElement("img");  
                            newImg.src =  dataUrl;  
                            document.body.appendChild(newImg);  
                        }  
                    });  
                });   
	});  
        </script>  
    </head>  
    <body>   
        <div class="" style="background-color: white;">   
            测试图片
        </div>  
           
        <textArea id="textArea" col="20" rows="10" ></textArea>  
        <input class="button" type="button" value="button">测试</input>  
    </body>  
</html>  


    这个方式有要注意的问题,是在canvas.toDataUrl()这个方法,这个方法是把canvas转换成base64码,如果你的div中是图片的话,那么这个方法是执行不成功的。另外,上面提到的导出地图的功能,因为地图是多张图片,同时图片在服务器上,所以涉及到跨域和多张图片信息的问题,这时候也是执行不成功的。


第二种

<!DOCTYPE html>
<html>
	<head>
		<script type="text/javascript" src="jquery-1.8.3.min.js"></script>  
		<script type="text/javascript" src="html2canvas.js"></script>  
	</head>
	<body>	
	<h2>Output Image:</h2>
		<script>
			function cutDiv(){
				var divContent = document.getElementById("div").innerHTML;
				var data = "data:image/svg+xml," +
				"<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
				"<foreignObject width='100%' height='100%'>" +
				"<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:16px;font-family:Helvetica'>" +
				divContent +
				"</div>" +
				"</foreignObject>" +
				"</svg>";
				var img = new Image();
				img.src = data;
				var canvas = document.createElement("canvas");
				var ctx =  canvas.getContext("2d");
				img.crossOrigin="anonymous";
				img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
				ctx.drawImage(img, 0, 0);
				var canvasbase = canvas.toDataURL();
				alert(canvasbase);
			}
			
		</script>
		<div id="div">
			<img src="Koala.jpg" style="width:400px;height:300px"/>
		</div>
		<input type="button" value="click" onclick="cutDiv()"/>
	</body>
</html>
    

    这种是先把html拼接为svg,然后将组成的svg串赋给一个img的src,然后在画布上画出这个img,最后执行canvas的toDataUrl方法来获得base64码。


    这种方式也没能成功导出地图,地图是openlayers做的,本身就是svg,在ctx.drawImage()方法执行时,出现错误,所以没成功。


    上面这两种方法,参考了官网上的方式和网上的一篇博客,对于其他比较常用的情况,上面两种转换效果还是蛮好的;如果上面写的有什么不合适的,请批评指正;另外如果有做过导出地图为图片到word文档的,希望您能不吝赐教,谢谢。

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值