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


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

        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="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文档的,希望您能不吝赐教,谢谢。

    转自:http://blog.csdn.NET/fengyao1995/article/details/51842486

  • 相关阅读:
    Linux Kernel 'b43'无线驱动本地特权提升漏洞
    Linux Kernel “dispatch_discard_io()”RO Disk Manipulation安全绕过漏洞
    Linux kernel ‘fill_event_metadata’函数资源管理错误漏洞
    Linux kernel ‘b43_request_firmware’函数格式化字符串漏洞
    phpcms 2007 onunload.inc.php update SQL注入漏洞
    出差到天津的计划
    Auguries of Innocence
    做一个东西要多久
    Wise Installation 9 的一个容易忽视的选项
    天津行总结路在嘴底下
  • 原文地址:https://www.cnblogs.com/white0710/p/7235014.html
Copyright © 2020-2023  润新知