var pdfContent = document.getElementById("pdfDiv"); var width = pdfContent.offsetWidth; //获取dom 宽度 var height = pdfContent.offsetHeight; //获取dom 高度 var canvas = document.createElement("canvas"); //创立一个canvas节点 var scale = 3; //定义任意放大倍数 反对小数,越大越清晰 var offsetTop = pdfContent.offsetTop; var rect = pdfContent.getBoundingClientRect();//获取元素绝对于视察的偏移量 canvas.width = width * scale; //定义canvas 宽度 * 缩放 canvas.height = (height + offsetTop) * scale; //定义canvas(高度 +偏移量 )*缩放 var content = canvas.getContext("2d"); content.scale(scale, scale); //获取context,设置scale content.translate(-rect.left, -rect.top);//设置context地位,值为绝对于视窗的偏移量负值,让图片复位 // content.translate(-rect.left, -rect.top + 135);//设置context地位,值为绝对于视窗的偏移量负值,让图片复位 var opts = { background: "#fff", scale: scale, // 增加的scale 参数 canvas: canvas, //自定义 canvas // logging: true, //日志开关,便于查看html2canvas的外部执行流程 width: width, //dom 原始宽度 height: height, useCORS: true, // 【重要】开启跨域配置 allowTaint: true, taintTest: false, // scrollY: 0, // scrollX: 0 }; html2canvas(pdfContent,opts ).then(function (canvas) { downloadCanvasWithMargin(canvas); }) //----------------------- function downloadCanvasWithMargin(canvas){ //敞开锯齿 var context = canvas.getContext('2d'); context.mozImageSmoothingEnabled = false; context.webkitImageSmoothingEnabled = false; context.msImageSmoothingEnabled = false; context.imageSmoothingEnabled = false; let contentWidth = canvas.width; let contentHeight = canvas.height; //一页pdf显示html页面生成的canvas高度; let pageHeight = contentWidth / 595.28 * 841.89; //未生成pdf的html页面高度 let leftHeight = contentHeight; let cutStartHeight = 0; let canvasArr = []; if(leftHeight > pageHeight) { while (leftHeight > 0) { //复制出(0, cutStartHeight)开始,contentWidth宽和pageHeight高的图片 let cutImage = context.getImageData(0, cutStartHeight, contentWidth, pageHeight); //以通明背景开始,抛弃 if(cutImage.data[0] === 0 ){ leftHeight -= pageHeight; cutStartHeight += pageHeight; continue; } //从图像底部开始校验色彩,直到验证到已红色结尾才开始切图像 let moveUpPx = 0; //上移px数 let totalLength = cutImage.data.length; let lineLength = 4 * contentWidth * 1; //一行的data容量 let leftLength = totalLength - lineLength; let rightLength = totalLength; let circle = 0; //循环次数 let pointRatio = 0.98; //一行非给定色彩的占比系数 let pointRatioNum = contentWidth * pointRatio; while( circle === moveUpPx ){ circle ++; let ignorePoint = 0; for(let i = leftLength; i< rightLength ; i+=4){ if(cutImage.data[i] === 255 || cutImage.data[i] === 251){ if(cutImage.data[i] === cutImage.data[i+1] && cutImage.data[i] === cutImage.data[i+2]){ ignorePoint++; } } } if(ignorePoint < pointRatioNum){ leftLength -= lineLength; rightLength -= lineLength; moveUpPx ++; } } if(moveUpPx > 0){ cutImage = context.getImageData(0, cutStartHeight, contentWidth, pageHeight - moveUpPx); } leftHeight -= pageHeight + moveUpPx; cutStartHeight += pageHeight - moveUpPx; //创立新图片 let nCanvas = document.createElement("canvas"); //创立一个canvas节点 nCanvas.width = canvas.width; nCanvas.height = pageHeight - moveUpPx; let nContext = nCanvas.getContext("2d"); nContext.mozImageSmoothingEnabled = false; nContext.webkitImageSmoothingEnabled = false; nContext.msImageSmoothingEnabled = false; nContext.imageSmoothingEnabled = false; nContext.putImageData(cutImage, 0, 0) canvasArr.push(nCanvas); } }else{ canvasArr.push(canvas); } //解决尾页图片通明背景 let lastCanvas = canvasArr[canvasArr.length - 1]; let ctx = lastCanvas.getContext("2d"); // 将canvas的通明背景设置成红色--解决translate后便彩色背景的问题 let imageData = ctx.getImageData(0, 0, lastCanvas.width, lastCanvas.height); for(var i = 0; i < imageData.data.length; i += 4) { // 当该像素是通明的,则设置成红色 if(imageData.data[i + 3] === 0) { imageData.data[i] = 255; imageData.data[i + 1] = 255; imageData.data[i + 2] = 255; imageData.data[i + 3] = 255; } } ctx.putImageData(imageData, 0, 0); var pdf = new jsPDF('', 'pt', 'a4'); let leftMargin = 20; let topMargin = 20; let a4Width = 595.28; let a4Height = 841.89; let imgWidth = a4Width - leftMargin * 2; let imgHeight = a4Height - 2 * topMargin; for(let i =0; i < canvasArr.length; i++){ let curCanvas = canvasArr[i]; let pageData = curCanvas.toDataURL('image/jpeg', 1.0); //小于切分的高度,要换算比例高 if(curCanvas.height < pageHeight){ let ratioHeight = imgWidth / curCanvas.width * curCanvas.height; pdf.addImage(pageData, 'JPEG', leftMargin, topMargin, imgWidth, ratioHeight); }else{ pdf.addImage(pageData, 'JPEG', leftMargin, topMargin, imgWidth, imgHeight); } if(i < (canvasArr.length-1)){ pdf.addPage(); } } let date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let milliSeconds = date.getMilliseconds(); pdf.save(year + month + day + milliSeconds +'.pdf'); }