利用html2canvas.js截取當前HTML爲圖片並保存下載

html2canvas.js官網:http://html2canvas.hertzen.com/

1.前期準備

利用 html2canvas.js文件,如果沒有則可點擊下載:https://download.csdn.net/download/mufeng633/11159717

實現原理:
利用html2canvas.js文件,將渲染的html進行局部截圖生成圖片的Base64碼,之後,可以在後臺通過解析Base64 獲取到圖片。

實現方法有如下兩種:
第一種.

  語法如下:
        html2canvas(document.getElementById('id'))
            .then(function(canvas){
                document.body.appendChild(canvas);
            });
            
   實現如下         
      html2canvas($("#CCCCC"), {
             width: 400,   //這是我寫死的 寬 高 度
             height: 220,
             useCORS:true,
             onrendered: function(canvas) {
                 gdzherf = canvas.toDataURL();
                 gdzherf = gdzherf.replace(/\s/g,"+");
                 console.log(gdzherf);
             },
         }).then(function(){
             //下載文件
             $.ajax({
                 type:'post',
                 url: $.contextPath+'/signet-management!downloadGdz.json',
                 data:{"gdzherf":encodeURI(encodeURI(gdzherf)),"id":id},
                 dataType : 'json',
                 success:function(data){
                 }
             });
         });

第二種.

html2canvas(document.getElementById("id"), {
  useCORS: true, //是否跨域
  background: "red", //背景
  height: $("#id").outerHeight() + 20,
  width: $("#id").outerWidth() + 20  ,
  onrendered: function (canvas) {
    url = canvas.toDataURL('image/jpeg', 1.0); //將圖片轉爲base64, 0-1 表示清晰度。默認爲 image/png 
  }
});

前端代碼:

1.先創建一個待截圖的HTML。

    <div id="container2"  style="color: #FF0000;display: inline-block; width: 300px;height: 120px" >
        <div class="text">&nbsp;&nbsp;&nbsp;此<span  class="sp">&nbsp;</span>頁複印於我館 </div>
        <div class="text">
            <div class="qq"> 全宗<span id="FONDS_CODE" class="sp" style="display:block"></span>
                目錄<span id="CATALOGUE_NO" class="sp"></span>
                &nbsp;案卷 <span id="FOLDER_NO" class="sp"></span>
                第<span id="PAGE_NO" class="sp"></span>頁
            </div>
        </div>
        <div class="text date">
            上海市xxxx檔案證明專用章
        </div>
        <div class="date">
            <span id="year"></span>年<span id="month"></span>月<span id="day"></span>日
        </div>
    </div>

2.當點擊時,獲取到div的id,利用html2canvas.js中的 html2canvas 方法進行截圖

    function turnExcel() {
        var gdzherf = '';
        html2canvas(document.getElementById("container2"),{
            useCORS:true, //是否跨域
            height: $("#container2").outerHeight() + 20,
            width: $("#container2").outerWidth() + 20  ,
            onrendered : function (canvas) {
				//獲取Base64碼 默認爲 image/png 格式
                gdzherf  = canvas.toDataURL();
                //防止後臺獲取到空格
                gdzherf = gdzherf.replace(/\s/g,"+");
                $.ajax({
                    type    :   "post",
                    url     :   "${basePath}moduleFile/downloadCanvas?gdzherf="+encodeURIComponent(encodeURIComponent(gdzherf)),
                    dataType    :   "json",
                    success     :   function (data) {
						alert("保存完成");
                    }
                })
            }
        })
    };

後端實現

    @RequestMapping(value = "downloadCanvas")
    public void download(HttpServletRequest request) throws IOException {
    	String gdzherf = request.getParameter("gdzherf");   // Base64碼
	    gdzherf = java.net.URLDecoder.decode(gdzherf);   //解碼
	    gdzherf=gdzherf.replace("data:image/png;base64,","");//替換生成的前綴
	    BASE64Decoder decoder = new BASE64Decoder();
	    byte[] bs = decoder.decodeBuffer(gdzherf);//解密
	    //生成到目標路徑
	    for(int k=0;k<bs.length;++k){
		    if(bs[k]<0){
			    bs[k]+=256;
		     }
	    }
	    String path = "C:\\Users\\Cc\\Desktop\\對比gc\\我的.png";
	    OutputStream out = out = new FileOutputStream(path);
	    out.write(bs);
	    out.flush();
	    out.close();

		//等比例縮小。  可以不看
	    BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\Cc\\Desktop\\對比gc\\妮妮2.png"));
	    Image bi = ImageIO.read(in);
	    int height=bi.getHeight(null);
	    int width =bi.getWidth(null);
	    BufferedImage tag = new BufferedImage(width / 3, height / 3, BufferedImage.TYPE_4BYTE_ABGR_PRE);
	    tag.getGraphics().drawImage(bi, 0, 0,width / 3, height / 3, null);
	    BufferedOutputStream out2 = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Cc\\Desktop\\對比gc\\333.png"));
	    ImageIO.write(tag, "PNG",out2);
	    in.close();
	    out2.close();
	    
    }

補充:

1.因爲使用該工具不能截圖css屬性爲 display:none 的div. 所以將css設置屬性爲 z-index:-1;層級下沉,完美解決。
2.如果,前端生成的圖片Base64碼,通過在線Base64轉圖片是我們預期想要的結果,但是通過咱們的代碼進行轉換,圖片不是我們預期的結果,猜測是因爲在傳遞參數中,參數不一致導致的。解決方式如下幾種:

1.在前端通過替換空格。直接傳遞該參數。如
gdzherf = gdzherf.replace(/\s/g,"+");

2.在前端處理參數,將處理過的參數,傳遞到後端:如:

data:{"gdzherf":encodeURI(encodeURI(gdzherf))},   
或  
encodeURIComponent(encodeURIComponent(gdzherf)),

3.通過傳遞處理過的參數,在後臺需進行解碼:

gdzherf = java.net.URLDecoder.decode(gdzherf);

到此,完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章