用html2canvas和jspdf实现将html转成pdf下载到本地

解决了下载的图片会模糊和偏移的问题

<script src="${basePath!}/js/bluebird.js"></script>
<script src="${basePath!}/js/jspdf.debug.js"></script>
<script src="${basePath!}/js/html2canvas.js"></script>
<script>
$(function() {
	
	$("#download").click(function(){  
		var copyDom = $("#first");// 这个dom元素是要导出pdf的div容器
	    var width = copyDom.width();//dom宽
	    var height = copyDom.height();//dom高
	    var scale = 2;//放大倍数
	    var canvas = document.createElement('canvas');
	    canvas.width = width*scale;//canvas宽度
	    canvas.height = height*scale;//canvas高度
	    var content = canvas.getContext("2d");
	    content.scale(scale,scale);
	    var rect = copyDom.get(0).getBoundingClientRect();//获取元素相对于视察的偏移量
	    content.translate(-rect.left,-rect.top-36);//设置context位置,值为相对于视窗的偏移量负值,让图片复位
	    html2canvas(copyDom, {
	        dpi: window.devicePixelRatio*2,
	        scale:scale,
	        canvas:canvas,
	        width:width,
	        heigth:height,
	    }).then(function (canvas) {
	    	var contentWidth = canvas.width;
	        var contentHeight = canvas.height;
	        //一页pdf显示html页面生成的canvas高度;
	        var pageHeight = contentWidth / 592.28 * 841.89;
	        //未生成pdf的html页面高度
	        var leftHeight = contentHeight;
	        //页面偏移
	        var position = 0;
	        //a4纸的尺寸[595.28,595.28],html页面生成的canvas在pdf中图片的宽高
	        var imgWidth = 595.28;
	        var imgHeight = 592.28/contentWidth * contentHeight;
	        var pageData = canvas.toDataURL('image/jpeg', 1.0);
	        //element.append(canvas)
	        var pdf = new jsPDF('', 'pt', 'a4');
	        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
	        //当内容未超过pdf一页显示的范围,无需分页
	        if (leftHeight < pageHeight) {
	        pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
	        } else {    // 分页
	            while(leftHeight > 0) {
	                pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
	                leftHeight -= pageHeight;
	                position -= 841.89;
	                //避免添加空白页
	                if(leftHeight > 0) {
	                  pdf.addPage();
	                }
	            }
	        }
	        pdf.save('我的证书.pdf');  
	 
	    });
	      
	})

bluebird.js文件解决了ie下不支持promise的问题

有几个注意的地方:

1.下载的时候,图片最好都是背景图

2.图片不能是远程的

完美~

猜你喜欢

转载自blog.csdn.net/nicexibeidage/article/details/84971996