zoukankan      html  css  js  c++  java
  • html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题

    html页面转pdf下载

    两个js文件可供使用,地址如下:

    https://github.com/linwalker/render-html-to-pdf

    唯一的缺点是图片跨页不好解决,最终的pdf文件如下:

    image

     

    解决下载pdf文件背景是黑色的问题,将div添加背景色为白色,未解决图片跨页问题,解决思路:

    1. 通过控制页面html页面元素,控制元素位置,当处于高度重叠的元素,调整该元素相对位置
    2. 转成图片而非pdf,将是一整页

    <!DOCTYPE html>

    <html lang="en">

    <head>

    <meta charset="UTF-8">

    <title>Document</title>

    <style>

    #demo{

    background-color: #fff;

    400px;

    height: 400px;

    /* margin: auto; */

    }

    .red{

    background-color: red;

    50px;

    height: 50px;

    }

    </style>

    </head>

    <body>

    <div class="demo-container">

    <div id="demo">

    <div class="red"></div>

    </div>

    </div>

    <button>

    下载简历

    </button>

    </body>

    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script>

    <script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>

    <script>

    function download(){

    var element = $("#demo"); // 这个dom元素是要导出pdf的div容器

    var w = element.width(); // 获得该容器的宽

    var h = element.height(); // 获得该容器的高

    var offsetTop = element.offset().top; // 获得该容器到文档顶部的距离

    var offsetLeft = element.offset().left; // 获得该容器到文档最左的距离

    var canvas = document.createElement("canvas");

    var abs = 0;

    var win_i = $(window).width(); // 获得当前可视窗口的宽度(不包含滚动条)

    var win_o = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)

    if(win_o>win_i){

    abs = (win_o - win_i)/2; // 获得滚动条长度的一半

    }

    canvas.width = w * 2; // 将画布宽&&高放大两倍

    canvas.height = h * 2;

    var context = canvas.getContext("2d");

    context.scale(2, 2);

    context.translate(-offsetLeft-abs,-offsetTop);

    // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此

    // translate的时候,要把这个差值去掉

    html2canvas(element).then(function(canvas) {

    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');

    //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)

    //当内容未超过pdf一页显示的范围,无需分页

    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('我的简历.pdf');

    })

    }

    $("button").click(function(){

    download();

    })

    </script>

    </html>

    作者:少帅

    出处:少帅的博客--http://www.cnblogs.com/wang3680

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者所有,欢迎转载,但请保留该声明。

    支付宝 微信
  • 相关阅读:
    没吃过猪肉,却想见识下猪跑
    程序员修电脑
    csdn 新排名系统参考的部分指标
    如何快速适应新工作
    前端学习指北
    公号文章整理
    BUI 视频,音频在线播放
    原生图片上传,图片格式和图片大小处理
    获取路由拼接参数
    Axure RP9调用后端接口操作步骤
  • 原文地址:https://www.cnblogs.com/wang3680/p/15213878.html
Copyright © 2011-2022 走看看