有的时候需要页面生成pdf,通常是页面的某个部分而不是全部,最后能够下载pdf文件。
引入js:
<script type="text/javascript" src="https://www.jq22.com/demo/htmltopdf202104260117/js/canvas.js"></script> <script type="text/javascript" src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jspdf/1.0.272/jspdf.min.js"></script>
功能实现:
.have_choose_box是需要生成pdf的区域。
.make_pic是触发的按钮。
upload_pdf是在服务器上保存pdf文件,最终生成一个pdf链接。
$('.make_pic').click(function () { $("#mood_board .have_choose_box .item .bar").css('display', 'none'); function aa() { var target = document.getElementsByClassName("have_choose_box")[0]; //避免生成的PDF页面底部出现黑色背景 target.style.background = "#FFFFFF"; html2canvas(target, { onrendered: function (canvas) { var contentWidth = canvas.width; var contentHeight = canvas.height; //一页pdf显示html页面生成的canvas高度; var pageHeight = contentWidth / 841.89 * 592.28; //未生成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 imgWidth = 841.89; var imgHeight = 841.89 / contentWidth * contentHeight; var pageData = canvas.toDataURL('image/jpeg', 1.0); //l表示横版,p:纵向 (默认纵向) var pdf = new jsPDF('l', '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; position -= 595.28; //避免添加空白页 if (leftHeight > 0) { pdf.addPage(); } } } pdf.save("mood_board.pdf"); // 将pdf输入为base格式的字符串 var buffer = pdf.output("datauristring") // 将base64格式的字符串转换为file文件 var myfile = dataURLtoFile(buffer, "mood_board.pdf") name = upload_pdf(myfile) } }) } aa(); }); //pdf文件上传 upload_pdf = function (file) { var order_id = $(".order_id").val(); var formdata = new FormData() formdata.append("file", file); // 文件对象 formdata.append("order_id", order_id); //多个参数的情况 // formdata.append("name", name); var msg = ''; // 之后ajax传递数据 $.ajax({ url: "/index/mood_upload", //url地址 type: 'POST', //上传方式 data: formdata, // 上传formdata封装的数据 dataType: 'JSON', cache: false, // 不缓存 async: false, // 开启的异步 保证返回信息 processData: false, // jQuery不要去处理发送的数据 contentType: false, // jQuery不要去设置Content-Type请求头 success: function (data) { if (data.status == 0) { //var url= data.url; //跳转pdf界面 uploadUrl为服务器地址 window.open(uploadUrl + url) } else { layer.alert("文件上传失败"); } }, error: function (data) { //失败回调 layer.msg('数据不能为空', { icon: 5 }); console.log(data); } }); //返回值 //return url; }; //将base64转换为文件对象 function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','); var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } //转换成file对象 return new File([u8arr], filename, { type: mime }); //转换成成blob对象 //return new Blob([u8arr],{type:mime}); }