节点转换为pdf功能

424 阅读2分钟

参考

使用场景

将某一个页面的某处或者整个页面进行转换为图片的形式输出。下面简单简述一下把dom节点转换为pdf输出的过程。

使用的插件

  • html2Canvas:将html中的dom节点转换为canvas的形式。
  • jspdf:将canvas转换为pdf

安装和下载

npm install html2canvas jspdf --save

示例代码:

//将iframe元素生成为PDF文件
htmlToPdf() {
    let that = this
    var title = 'pdf'
    var ifra = document.getElementById('#dom')//获取需要转换的dom节点
    html2Canvas(ifra, {//把目标节点转换为图片
        allowTaint: true,//是否跨域获取图片(可选)
        x: 10,//在生成图片的x偏移(可选)
        y: 5,//在生成图片的y偏移(可选)
        //scrollX//在画布上实现x偏移(可选)
        //scrollY(可选)
        scale: 2,//(可选)
        width: 1536,//生成canvas的宽度(可选)
        height: 700,//生成canvas的高度(可选)
        logging: true,//(可选)
    }).then(function (canvas) {
        let contentWidth = canvas.width //画布的宽
        let contentHeight = canvas.height //画布的高
        let pageHeight = (contentWidth / that.pdfWidth) * that.pdfHeight
        let leftHeight = contentHeight
        let position = 0
        let imgWidth = that.pdfWidth
        let imgHeight = (that.pdfWidth / contentWidth) * contentHeight
        let pageData = canvas.toDataURL('image/jpeg', 1.0)//把对应的节点进行转换
        let PDF = new JsPDF('', 'pt', 'a4')
        //一页的情况下显示
        if (leftHeight < pageHeight) {
            //参数为:需要画的目标图片,类型,x,y,画的宽度,画的高度
            PDF.addImage(pageData, 'JPEG', 60, 30, imgWidth, imgHeight)
        } else {//多页的情形下显示
            while (leftHeight > 0) {
            PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
            leftHeight -= pageHeight
            position -= that.pdfHeight
            if (leftHeight > 0) {
            PDF.addPage()
    	}
    }
    }
    //PDF.save('a.pdf');//也可以直接输出为a.pdf文件
    var pdfBase64 = PDF.output('datauristring')
    that.uploadPdf(pdfBase64)
    })
},

可能会出现的问题

  • 没有使用scale的时候,字体会变得很模糊。所以可以适当调整scale的大小来控制字体的清晰度,scale越大,字体越清晰,相对的dom在canvas的占比也会变小,例如scale为2,即把dom缩小到1/2,变小的时候字体自然变清晰了
  • 居中问题,可以在html2Canvas的时候使用scrollX和scrollY来把对应的dom在canvas上实现居中。而这居中算法自行根据scale来实现等比例计算。
  • 还有很多坑,未解决完。

分页内容被分割的问题