纯js实现将html转PDF(html2canvas+jsPdf)

项目中遇到在线生成获奖证书,并支持在线下载,刚开始直接通过html2canvas把证书所在 div 的内容转成图片,提供下载,后来看到也可以生成 PDF 文件提供下载,就研究了一下,使用html2canvas+jsPdf来把证书生成 PDF 文件,共用户下载。

1.需要引入的 js 文件:

html2canvas.js、 jsPdf.debug.js、 jquery.js

html2canvas:https://www.bootcdn.cn/html2canvas/

<script src=”https://cdn.bootcdn.net/ajax/libs/html2canvas/0.5.0-beta4/html2canvas.min.js”></script>

<script src=”https://cdn.bootcdn.net/ajax/libs/html2canvas/0.4.1/html2canvas.min.js”></script>

jsPdf.debug:https://www.bootcdn.cn/jspdf/

<script src=”https://cdn.bootcdn.net/ajax/libs/jspdf/1.5.3/jspdf.debug.js”></script>

<script src=”https://cdn.bootcdn.net/ajax/libs/jspdf/1.5.3/jspdf.min.js”></script>

jquery:https://www.bootcdn.cn/jquery/

<script src=”https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js”></script>

 

2.实现代码:

方式一:



function downloadcertpdf(id) {
	html2canvas($('.cert-content'), {
		onrendered: function (canvas) {
			var imgData = canvas.toDataURL();
			var doc = new jsPDF('p', 'px', 'a4');
			//第一列 左右边距  第二列上下边距  第三列是图片左右拉伸  第四列 图片上下拉伸  
			doc.addImage(imgData, 'jpg', 2, 30, 0, 0);
			doc.save('cert_' + id + ".pdf");
		}
	});
}

 

方式二:(导出为横向 pdf)





function downloadcertpdf(id) {
	if (!!window.ActiveXObject || "ActiveXObject" in window) { alert('请使用 chorme 或 360 等浏览器!!!'); return false; }
	html2canvas($('.cert-content'), {
		onrendered: function (canvas) {
			//渲染完成时调用的
			var contentWidth = canvas.width * 0.5;
			var contentHeight = canvas.height * 0.5;
			//一页 pdf 显示 html 页面生成的 canvas 高度;
			var pageHeight = contentWidth / 592.28 * 841.89;
			//未生成 pdf 的 html 页面高度
			var leftHeight = contentHeight;
			//页面偏移
			var position = 0;
			//a4 纸的尺寸[595.28,841.89],html 页面生成的 canvas 在 pdf 中图片的宽高
			var imgWidth = 841.89;
			var imgHeight = 841.89 / contentWidth * contentHeight;

			var pageData = canvas.toDataURL('image/jpeg', 1.0);

			var pdf = new jsPDF('l', 'pt', 'a4');  //l:横向  p:纵向

			//有两个高度需要区分,一个是 html 页面的实际高度,和生成 pdf 的页面高度(595.28)
			//当内容未超过 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 -= 595.28;
					//避免添加空白页
					if (leftHeight > 0) {
						pdf.addPage();
					}
				}
			}
			pdf.save('cert_' + id + ".pdf");
		}

	});
}



 

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



<script src="https://cdn.bootcdn.net/ajax/libs/bluebird/3.7.2/bluebird.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jspdf/1.5.3/jspdf.min.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('cert_' + id + ".pdf");
	 
	    });
	      
	})

 

 

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...