关于前端页面导出pdf

1、首先html中需添加id标识,如:

 <div class="InspectionContent" id="infrredDomPdf">
  			<div class='whole-node'></div>//标识一页
 </div>

2、然后我们需下载html2canvas jspdf插件

npm install html2canvas jspdf --save

3、
我再百度查看人家的文章拼在一起修改之后的代码:以便于就是转为pdf后分页的问题

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
import $ from "jquery"
export default {
    install(Vue, options) {
        Vue.prototype.getPdf = function () {
            var title = this.htmlTitle; //这个页面中导出pdf的文件名
            // 如果这个页面有左右移动,canvas 也要做响应的移动,不然会出现canvas 内容不全
            const xOffset = window.pageXOffset
            // 避免笔下误 灯下黑 统一写
            const A4_WIDTH = 592.28
            // const A4_HEIGHT = 841.89
            const A4_HEIGHT = 880
            let printDom = document.querySelector('#infrredDomPdf') //html中id标识
            // 根据A4的宽高计算DOM页面一页应该对应的高度
            let pageHeight = printDom.offsetWidth / A4_WIDTH * A4_HEIGHT
            // 将所有不允许被截断的元素进行处理
            let wholeNodes = document.querySelectorAll('.whole-node')//这个是html加标识然后用于占一页的标识
            for (let i = 0; i < wholeNodes.length; i++) {
                //1、 判断当前的不可分页元素是否在两页显示
                const topPageNum = Math.ceil((wholeNodes[i].offsetTop) / pageHeight)

                const bottomPageNum = Math.ceil((wholeNodes[i].offsetTop + wholeNodes[i].offsetHeight) / pageHeight)

                if (topPageNum !== bottomPageNum) {
                    //说明该dom会被截断
                    // 2、插入空白块使被截断元素下移
                    let divParent = wholeNodes[i].parentNode
                    let newBlock = document.createElement('div')
                    newBlock.className = 'emptyDiv'
                    newBlock.style.background = '#fff'

                    // 3、计算插入空白块的高度 可以适当流出空间使得内容太靠边,根据自己需求而定
                    let _H = topPageNum * pageHeight - wholeNodes[i].offsetTop
                    newBlock.style.height = _H + 50 + 'px'
                    divParent.insertBefore(newBlock, wholeNodes[i])
                }

                // 以上完成dom层面的分页 可以转为图片进一步处理了

              
            }
            html2Canvas(printDom, {
                height: printDom.offsetHeight,
                width: printDom.offsetWidth,
                scale: 2, // 提升画面质量,但是会增加文件大小
                allowTaint: true,
                useCORS : true,//这个是解决图片跨域问题
            }).then(canvas => {
                //dom 已经转换为canvas 对象,可以将插入的空白块删除了
                let emptyDivs = document.querySelectorAll('.emptyDiv')
                for (let i = 0; i < emptyDivs.length; i++) {
                    emptyDivs[i].parentNode.removeChild(emptyDivs[i])
                }
                // 有一点重复的代码
                let contentWidth = canvas.width
                let contentHeight = canvas.height
                let pageHeight = contentWidth / A4_WIDTH * A4_HEIGHT
                let leftHeight = contentHeight
                let position = 0

                let imgWidth = A4_WIDTH
                let imgHeight = A4_WIDTH / contentWidth * contentHeight
                let pageData = canvas.toDataURL('image/jpeg', 1.0)
                // if (isPrint) {
                //     //如果是打印,可以拿着分号页的数据 直接使用
                //     printJs({
                //         printable: pageData,
                //         type: 'image',
                //         base64: true,
                //         documentTitle: '\u200E'
                //     })
                //     return
                // }
                //计算分页的pdf 
                let PDF = new JsPDF('', 'pt', 'a4')
                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 -= A4_HEIGHT
                        if (leftHeight > 0) {
                            PDF.addPage()
                        }
                    }
                }
                PDF.save(title + '.pdf');
            })

        }
    }
}

4、在main.js中引入js文件

import htmlToPdf from 所在地址
Vue.use(htmlToPdf);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值