jspdf.js+html2canvas将HTMl导出PDF

jspdf.js+html2canvas将HTMl导出PDF

功能:

  1. PDF分页插入页头页尾
  2. 输出A4格式PDF
  3. 支持单页、多页输出

效果预览:
查看演示PDF
demo地址:
demo

需要引入JS的文件:


主要代码如下:

function pdfMap() {
html2canvas(document.querySelector("img")).then(canvas => {
  //console.log(canvas)
  var contentWidth = canvas.width;
  var contentHeight = canvas.height;
  //一页pdf显示html页面生成的canvas高度;
  var pageHeight = contentWidth / 595.28 * 841.89;
  //console.log(canvas总高度:${contentHeight}, 一页渲染的高度:${pageHeight});

  var ctx = canvas.getContext("2d");
  // 新canvas控件- 保存裁剪后的图片
  var newCanvas = document.createElement("canvas");
  var newCtx = newCanvas.getContext("2d");
  // 定义插入图片的宽高,高度要等比例缩放
  var renderImgWidth = 570.28; // 根据pdf页面宽度决定
  // 固定的图片宽度 除以 渲染的canvas宽度 得出 宽度缩放比例,根据这个比例 乘以 渲染的canvas高度 得出 图片实际的高度
  var renderImgHeight = null; // (renderImgWidth / contentWidth) * pageHeight;
  // 截取图片高度偏移值
  var positionTop = 0;
  // 渲染pdf start
  var doc = new jsPDF('', 'pt', 'a4');
  // 引用外部字体,解决中文格式问题
  doc.addFont('SourceHanSans-Normal.ttf', 'SourceHanSans-Normal', 'normal');
  doc.setFont('SourceHanSans-Normal');
  doc.setFontSize(6)
  // 向上取整计算分页数
  var pageSize = Math.ceil(contentHeight / pageHeight)
  //console.log('计算分页数:', pageSize);
  // for循环插入页头页尾,图片
  for (let i = 0; i < pageSize; i++) {
    // 动态识别裁剪后图片高度,防止插入图片时比例失调
    renderImgHeight = (renderImgWidth / contentWidth) * ((contentHeight - positionTop) > pageHeight ? pageHeight : contentHeight - positionTop)
    //console.log('page', i + 1, '/' + pageSize);
    doc.text(10, 8, formatDate())
    doc.text(280, 8, '这是pdf页头xxxxx')
    doc.text(10, 835, '页尾xxxxx')
    doc.addImage(cropCanvas(ctx, newCanvas,newCtx, contentWidth, contentHeight, positionTop, pageHeight), 'JPEG', 10, 10, renderImgWidth, renderImgHeight);
    if (i + 1 < pageSize) {
      doc.addPage()
      positionTop += pageHeight
      // renderImgHeight = (renderImgWidth / contentWidth) * ((contentHeight - positionTop) > pageHeight ? pageHeight : contentHeight - positionTop)
    }
  }
  doc.save("autoprint.pdf")
});
  // 裁剪canvas
function cropCanvas(ctx, newCanvas, newCtx, contentWidth, contentHeight, positionTop, pageHeight) {
    //console.log(contentWidth, contentHeight, positionTop, pageHeight)
    // 裁剪- (获得像素数据)宽度跟原图一致,高度只截取一页pdf的渲染高度
    var imgRgbData = ctx.getImageData(0, positionTop, contentWidth, pageHeight);
    console.log(imgRgbData);
    // 把裁剪后的像素数据渲染到新canvas
    newCanvas.setAttribute("width", contentWidth)
    newCanvas.setAttribute("height", (contentHeight - positionTop) > pageHeight ? pageHeight : contentHeight - positionTop)
    newCtx.putImageData(imgRgbData, 0, 0)
    // 获取裁剪后图片的base64数据
    var imgBase64 = newCanvas.toDataURL("image/jpeg", 1.0)
    //console.log(imgBase64);
    return imgBase64
};

Original: https://www.cnblogs.com/zh1q1/p/15433311.html
Author: 吴知木
Title: jspdf.js+html2canvas将HTMl导出PDF

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599152/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CentOS 7 源码安装 Zabbix 6.0

    Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,是 Zabbix 的核心组件。它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库…

    数据库 2023年6月11日
    061
  • histogram的类型详解

    采样点 每隔指定的时间会采集并上报一次数据,称为采样点。 请注意这里采集的是当前瞬间的数据 count 对采样点的 次数累计和(count) bucket 对采样点的 次数进行统计…

    数据库 2023年6月9日
    0154
  • Redis和Mysql保持数据一致性

    1、简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数…

    数据库 2023年6月16日
    079
  • 阿里云智能客服机器人,自定义函数调用配置

    说明:也是没有段子的一天…..在没有段子的日子里….我们来研究下阿里云的客服机器人…. 一、功能调查 官网地址:https://help.ali…

    数据库 2023年6月6日
    0110
  • JVM

    JVM 一、什么是JVM 定义 Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) 好处 一次编写,到处运行 自动内存管理,垃圾回收…

    数据库 2023年6月16日
    050
  • 当我用Python做了个自动工作汇报的脚本后,每天都闲的只能摸鱼

    哈喽兄弟们 之前经常编写Python脚本来进行数据处理、数据传输和模型训练。随着数据量和数据复杂性的增加,运行脚本可能需要一些时间。在等待数据处理完成时可以同时做一些其他工作。 为…

    数据库 2023年6月14日
    063
  • 详解Threejs中的光源对象

    光源的分类 AmbientLight(环境光), PointLight(点光源), SpotLight(聚光源) 和 DirectionalLight(平行光)是基础光源 Hemi…

    数据库 2023年6月11日
    091
  • ArrayList

    ArrayList与数组的区别: 1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.2. ArrayList为了兼容所有类型对象,使用了Objec…

    数据库 2023年6月16日
    086
  • md5解密异常

    javax.crypto.BadPaddingException: Given final block not properly paddedat com.sun.crypto.p…

    数据库 2023年6月11日
    080
  • mysql8.x docker 远程访问配置

    环境情况 mysql 8.x 是通过 docker 方式部署的,启动的 docker-compose.yml 如下: version: "3.2" servic…

    数据库 2023年5月24日
    060
  • 老毛桃WinPE以ISO镜像模式安装CentOS7

    准备: 一台新台式机(2TB磁盘),将用于安装centos 7,注意安装前请使用工具将磁盘分区先删除。 一个u盘,用户制作老毛桃winpe启动盘。 从www.laomaotao.o…

    数据库 2023年6月14日
    084
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    095
  • Rabbitmq从安装到简单入门

    1:Rabbitmq是什么? RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 它由以高性能、健壮以及可伸缩性出名的 Erlang …

    数据库 2023年6月6日
    074
  • 4、异常

    一、异常的体系结构: java.lang.Throwable |—–java.lang.Error:一般不编写针对性的代码进行处理。 |—&#8…

    数据库 2023年6月6日
    084
  • CMD命令 压缩包与图片完美融合,隐藏文件必备撒

    CMD命令 压缩包与图片完美融合,隐藏文件必备撒 在Windows端,将图片和压缩包完美融合,先将 源文件展示 压缩方案1 copy /b D:\project\IE11完整离线安…

    数据库 2023年6月9日
    0147
  • MySQL之连接查询和子查询

    多表连接的基本语法 多表连接,即将多个表拼接成一个表,然后进行查询 [En] Multi-table join, that is, several tables are splic…

    数据库 2023年5月24日
    0131
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球