通过html2canvas+jspdf将html页面生成PDF下载

通过html2canvas+jspdf将html页面生成PDF下载

月光魔力鸭

2019-03-03 08:53 阅读 2810 喜欢 1 html转pdf html转图片 canvas

这里讲一种实现起来比较简单的html转pdf下载的实现。

依赖插件

html2canvas jspdf

思路

通过html2canvas,我们可以将指定的一个dom元素,渲染到canvas中,然后从canva中获得该图片,并将图片通过jspdf来生成。

代码

function createPdf (selector,pagesize,direction,title){
	var key = pagesize +''+direction;
	var settings = {
		'00' : {
			pdf : {orientation : 'portrait',format : 'a4',unit : 'px'},
			width : 448,
			height : 632.5
		},
		'01' : {
			pdf : {orientation : 'landscape',format : 'a4',unit : 'px'},
			width : 632.5,
			height : 448
		},
		'10' : {
			pdf : {orientation : 'portrait',format : 'a3',unit : 'px'},
			width : 632.5,
			height : 894.2
		},
		'11' : {
			pdf : {orientation : 'landscape',format : 'a3',unit : 'px'},
			width : 894.2,
			height : 632.5
		}
	};
	var set = settings[key];
	var doc = new jsPDF(set.pdf);
	var arr = [];//根据顺序保存
	var $arr = $(selector);
	function tempCreate(){
		if($arr.length == 0){//没有啦
			//执行生成
			tempPdf();
		}else{
			var $dom = $arr.splice(0,1);
			html2canvas($dom[0]).then(canvas => {
				var dataurl = canvas.toDataURL('image/png');
				arr.push(dataurl);
				tempCreate();
			});
		}
	}
	function tempPdf(){
		arr.forEach((item,i)=>{
			if(i !== 0){
				doc.addPage();
			}
			doc.addImage(item,'png',-1,-1,set.width,set.height);//根据不同的宽高写入
		})
		//根据当前的作业名称
		doc.save(title+'.pdf');
	}
	tempCreate();
}

需要指定容器(依赖jquery),然后指定纸张A4或 A3,以及横纵向。

//调用
createPdf('.single-page',0,0,'test')

当然,如果是数据量很大的话,就不建议在前台生成了,最好还是放在后端去做。个人测试过,做A4的图片生成PDF,当数量大约在100左右的时候,浏览器就崩溃了,如果只是几页的数据的话,这个方式还是很方便的。

Ps:浏览器要是现代浏览器哈。

参考资料

html2canvas : undefined jspdf :undefined

转载请注明出处: https://chrunlee.cn/article/html-to-pdf-download.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
需求如下:有一张大图,需要显示大图中的一小部分,目前能知道的时候小图的宽高和坐标,同时大图有一个旋转角度可以知道,目标就是把小图正确的显示出来。
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
web网站上总会有在文本域中提交代码的操作,那么如何处理呢?
通过canvas可以进行画图实现一些动画效果等,今天练习下通过canvas来实现一个简易的电子画板,可以在白板上进行画画,然后指定不同的颜色、线条粗细,加载不同的背景以及擦除效果。
在开发过程中多个页面使用的一个小工具类,简单完善了下,还算不错,给各位提供下小思路。
在web开发过程中,现在JSON 已经到了俯拾皆是的地步了,操作JSON对于JS来说非常简单,那么我们对于JSON的转化是如何应对的呢?
我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?
关于web打印,需要对页面内容进行页面样式设置,呈现出分页的样子,同时对于题目中的图片或表格尽量不分到两个页面中,因此实现了一个jquery的web打印插件,当然,这个插件目前只适用于部分情况,仅供借鉴