导入html2canvas和jspdf插件到项目中
1 2 | npm install html2canvas npm install jspdf |
引入html2canvas和jspdf到jsx中
1 2 | import jsPDF from 'jspdf'; import html2canvas from 'html2canvas' |
定义一个div和需要生成pdf的页面
1 2 3 4 5 6 7 8 9 10 | <div id="demo"> <div style={{marginTop:15}}> <div> 尊敬的用户: </div> <div> 依托本系统管理节能,本月共计发生计划外事件0起,有效介入管控事件0起,累计管控收益0元。 </div> </div> </div> |
定义一个触发生成报告的按钮
1 2 3 | <Button onClick={download}> 生成报告 </Button> |
实现download方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | const download = () => { setIsLoading(true); var element = document.getElementById("demo"); // 这个dom元素是要导出pdf的div容器 var w = element.offsetWidth; // 获得该容器的宽 var h = element.offsetWidth; // 获得该容器的高 var offsetTop = element.offsetTop; // 获得该容器到文档顶部的距离 var offsetLeft = element.offsetLeft; // 获得该容器到文档最左的距离 var canvas = document.createElement("canvas"); var abs = 0; var win_i = document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条) var win_o = window.innerWidth; // 获得当前窗口的宽度(包含滚动条) if (win_o > win_i) { abs = (win_o - win_i) / 2; // 获得滚动条长度的一半 } canvas.width = w * 2; // 将画布宽&&高放大两倍 canvas.height = h * 2; var context = canvas.getContext("2d"); context.scale(2, 2); context.translate(-offsetLeft - abs, -offsetTop); // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此 // translate的时候,要把这个差值去掉 html2canvas(element,{ allowTaint: true, scale: 2 // 提升画面质量,但是会增加文件大小 }).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,841.89],html页面生成的canvas在pdf中图片的宽高 var imgWidth = 595.28; var imgHeight = 592.28 / contentWidth * contentHeight; var pageData = canvas.toDataURL('image/jpeg', 1.0); 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'); }); }; |
如果需要将生成好的文件上传到服务器