import html2canvas from 'html2canvas' import jsPDF from 'jspdf' export default (id, name) => { const demo = document.getElementById(id) demo.style.overflow = 'visible' html2canvas(demo, { useCORS: true, // 允许跨域 scrollX: -8, // 修正x轴偏移 height: document.getElementById(id).scrollHeight, // width: document.getElementById(id).scrollWidth, // 为了使横向滚动条的内容全部展示,这里必须指定 background: '#FFFFFF' // 如果指定的div没有设置背景色会默认成黑色 }).then(canvas => { var contentWidth = canvas.width var contentHeight = canvas.height // 一页pdf显示html页面生成的canvas高度; var pageHeight = (contentWidth / 595.28) * 841.89 // 未生成pdf的html页面高度 var leftHeight = contentHeight // pdf页面偏移 var position = 0 // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高 var imgWidth = 555.28 var imgHeight = (555.28 / contentWidth) * contentHeight console.time('222') var pageData = canvas.toDataURL('image/png', 1) // eslint-disable-next-line new-cap var pdf = new jsPDF('', 'pt', 'a4') console.timeEnd('222') // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89) // 当内容未超过pdf一页显示的范围,无需分页 console.time('444') if (leftHeight < pageHeight) { pdf.addImage(pageData, 'JPEG', 20, 0, imgWidth, imgHeight) } else { while (leftHeight > 0) { pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight) leftHeight -= pageHeight position -= 841.89 // 避免添加空白页 if (leftHeight > 0) { pdf.addPage() } } } console.timeEnd('444') console.time('555') pdf.save(name + '.pdf') console.timeEnd('555') }) demo.style.overflow = 'auto' }