zoukankan      html  css  js  c++  java
  • 将页面转存为pdf

    原理

    1、通过 html2Canvas 将页面绘制成出来
    2、通过 jspdf 将绘制出来的页面转为pdf
    
    注意:想要绘制整个页面(包括滚动区域),建议 html2Canvas 的height使用scrollHeight+1000(或+500等,或不填也行)
    如果使用clientHeight,可能仅能将可视区域高度截取下来,导致截取不完整
    

    步骤

    1、安装 html2Canvas

    yarn add html2Canvas
    或
    npm install html2Canvas -S
    

    2、安装 jspdf

    yarn add jspdf
    或
    npm install jspdf -S
    
    注:我使用yarn 安装此依赖包有报错信息如下

    解决:不要安装最新版本,安装2.0版本测试可行:yarn add jspdf@2.0.0

    3、调用此方法

    //先引入依赖包
    import html2Canvas from "html2canvas";
    import JsPDF from "jspdf";
    
    exportPDF() {
                let shareContent = document.body //需要截图的包裹的(原生的)DOM 对象【注:需要关注当前滚动条是在window对象里还是在某个盒子里,再进行选择】
                let width = shareContent.clientWidth //获取dom 宽度
                let height = shareContent.scrollHeight+1000 //获取dom 高度,【这里建议使用scrollHeight而非clientHeight】,否则可能会页面截取不完整
                let canvas = document.createElement("canvas") //创建一个canvas节点
                let scale = 1; //定义任意放大倍数 支持小数
                canvas.width = width * scale; //定义canvas 宽度 * 缩放
                canvas.height = height * scale; //定义canvas高度 *缩放
                canvas.style.width = shareContent.clientWidth * scale + "px";
                canvas.style.height = shareContent.scrollHeight * scale + "px";
                canvas.getContext("2d").scale(scale, scale); //获取context,设置scale
                let opts = {
                    scale: scale, // 添加的scale 参数
                    canvas: canvas, //自定义 canvas
                    logging: false, //日志开关,便于查看html2canvas的内部执行流程
                     width, //dom 原始宽度
                    height: height,
                    useCORS: true, // 【重要】开启跨域配置
                    windowHeight: document.body.scrollHeight,
                };
    
                html2Canvas(shareContent, opts).then(() => {
                    var contentWidth = canvas.width;
                    var contentHeight = canvas.height;
                    //一页pdf显示html页面生成的canvas高度;
                    var pageHeight = (contentWidth / 592.28) * 841.89;
                    //未生成pdf的html页面高度
                    var leftHeight = contentHeight;
                    //页面偏移
                    var position = 0;
                    //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                    var imgWidth = 595.28;
                    var imgHeight = (592.28 / contentWidth) * contentHeight;
                    var pageData = canvas.toDataURL("image/jpeg", 1.0);
                    var 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 -= 841.89;
                            if (leftHeight > 0) {
                                PDF.addPage();
                            }
                        }
                    }
                    PDF.save("test" + ".pdf"); // 导出的文件名
                });
            }
    
  • 相关阅读:
    集合总结(非常重要)
    day18_Map案例
    Map代码案例
    重踏学习Java路上_Day18(Map,Collections)
    TreeSet概述(源码和内部图 进行解析,包含练习案例)
    HashSet保证元素唯一性的代码体现(源码和内部图 进行解析)
    重踏学习Java路上_Day17(登录注册案例,Set集合,Collection集合总结,在集合中常见的数据结构)
    Java 泛型解析,太难了,认真读才能理解
    题解 【BZOJ4700】适者
    题解 楼房重建
  • 原文地址:https://www.cnblogs.com/huihuihero/p/15696586.html
Copyright © 2011-2022 走看看