• 前端html生成PDF


    需要用到的组件

    1、html2canvas
    地址:http://html2canvas.hertzen.com/
    安装:npm install --save html2canvas
    2、jsPDF
    地址:https://github.com/parallax/jsPDF
    安装:npm install jspdf --save

    代码

    // 导出页面为PDF格式
    import html2Canvas from 'html2canvas'
    import JsPDF from 'jspdf'
    
    export default function (name, dom) {
        // return
        let targetDom = document.querySelector(dom)
        let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
        const steup = {
            allowTaint: true, // 是否允许跨源图片
            useCORS: true, // 是否尝试使用 CORS 从服务器加载图像
            height: targetDom.offsetHeight,
            width: targetDom.offsetWidth,
            windowWidth: document.body.scrollWidth, // 渲染Element时使用的窗口宽度
            windowHeight: document.body.scrollHeight, // 渲染Element时使用的窗口高度
            x: 0,
            y: scrollTop, // 用网页滚动的高度定位y轴顶点
            dpi: window.devicePixelRatio * 2,
            scale: 2 // 用于渲染的比例。
        }
        html2Canvas(targetDom, steup).then(function (canvas) {
            let contentWidth = canvas.width
            let contentHeight = canvas.height
            // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
            let imgWidth = 595.28
            let a4Height = 841.89
            let imgHeight = Math.floor(imgWidth / contentWidth * contentHeight)
    
            // 一页pdf显示html页面生成的canvas高度; pageHeight + 2是为了去掉最后的空白页
            let pageHeight = Math.floor(contentWidth / imgWidth * a4Height) + 2
    
            // 未生成pdf的html页面高度
            let leftHeight = contentHeight
            //页面偏移
            let position = 0
    
            // 返回图片dataURL,参数:图片格式和清晰度(0-1)
            let pageData = canvas.toDataURL('image/jpeg', 1.0)
    
            /**
             * new JsPDF(x, y, z)
             * x: 排版方向,默认是竖版 landscape
             * y: 单位
             * z: 尺寸
             * **/
            let PDF = new JsPDF('', 'pt', 'a4')
    
            // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
            // 当内容未超过pdf一页显示的范围,无需分页
            if (leftHeight < pageHeight) {
                // 20, 0 l两个参数分别控制 左边 上边的距离, 此处将页面高度按照a4纸宽高比列进行压缩
                PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
            } else {
                while (leftHeight > 0) {
                    PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                    leftHeight -= pageHeight
                    position -= a4Height
                     //避免添加空白页
                    if (leftHeight > 0) {
                        PDF.addPage()
                    }
                }
            }
            PDF.save(name + '.pdf')
        })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    在页面中使用

    import htmlToPDF from '@/utils/htmlToPDF'
     methods: {
         getPdf () {
             htmlToPDF('PDF名称', 'ID')
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    Kotlin语言(可空性,安全调用,空合并操作符,异常,截取函数,分割函数,replace,比较,类型转换,遍历)
    184:vue+openlayers 设置时间显示白天黑夜交替图
    申报消防设施设计乙级资质关于财务审计报告的要求
    什么是 DevOps?看这一篇就够了!
    Prometheus Operator 自定义监控添加redis explorer
    面试题 01.01. 判定字符是否唯一
    【密码学】RSA的攻与防_2.0
    【HTML5网页期末作业】基于HTML+CSS+JS实现宠物网站,表单展示登录页面,带JS密码验证
    线程五大状态,以及线程方法
    git中如何在父仓库提交子仓库的修改
  • 原文地址:https://blog.csdn.net/weixin_44388087/article/details/134014508