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)

大家都在看

  • JavaEE知识点思维导图

    posted @2020-12-08 08:39 一方玩 阅读(122 ) 评论() 编辑 Original: https://www.cnblogs.com/tianyuwohu…

    数据库 2023年6月6日
    0122
  • dockerfile

    基础结构 指令 from label maintainer run cmd export env add copy entrypoint volume user workdir o…

    数据库 2023年6月14日
    079
  • MySQL中实现中文转拼音

    — 插入数据 INSERT INTO t_base_pinyin ( pin_yin_, code_ ) VALUES ( "a", 20319 ),( &q…

    数据库 2023年6月14日
    099
  • SQL的函数

    MySQL常用的日期函数函数 功能 curdate() 返回当前日期 curtime() 返回当前时间 now() 返回当前日期和时间 year() 获取指定date的年份 mon…

    数据库 2023年6月16日
    0115
  • ShardingSphere-Proxy 前端协议问题排查方法及案例

    ShardingSphere-Proxy 是 Apache ShardingSphere 的接入端之一,其定位为透明化的数据库代理。ShardingSphere-Proxy 实现了…

    数据库 2023年6月16日
    087
  • django中批量插入数据

    1.什么是批量插入 在django中的orm给我们提供了一个bulk_create方法,批量创建插入数据! 2.为什么要使用批量插入 让我们首先来看看不使用大容量插入的情况: [E…

    数据库 2023年5月24日
    087
  • Variable used in lambda expression should be final or effectively final

    java的lambda表达式里不能出现变量,必须是final修饰的,但是可以让变量在定义时候计算【新函数】出结果,这样就不算变量了。可以使用lambda表达式,不再报错。例如 bo…

    数据库 2023年6月9日
    095
  • JUC学习笔记(五)

    创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们…

    数据库 2023年6月6日
    0131
  • ElasticSearch的简单api介绍

    1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据…

    数据库 2023年6月6日
    082
  • [LeetCode]13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做…

    数据库 2023年6月9日
    0132
  • SQL基础一

    一、SQL基本术语 数据库管理系统(DBMS,database management system)。人们通常用数据库这个术语来代表他们使用的数据库软件,这是不正确的。确切地说,数…

    数据库 2023年6月16日
    079
  • jmeter使用base64验证码登录

    依赖环境/工具:java环境、jmeter、python3、pycharm(ide工具) 此次主要操作步骤: 使用jmeter工具把验证码base64加密信息保存至本地。 编写py…

    数据库 2023年6月14日
    084
  • 牛客SQL刷题第三趴——SQL必知必会

    【问题】编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现 toy 和 carrots …

    数据库 2023年5月24日
    076
  • Java处理.tif或.tiff图片

    前言 Java将图片读取到内存用的是ImageIO,默认可以处理的图片格式如下: undefined ImageIO.getWriterFileSuffixes() //此方法返回…

    数据库 2023年6月9日
    078
  • SQL语句实战学习

    参考:https://zhuanlan.zhihu.com/p/38354000再次感谢作者的整理!! 1.数据已提前准备好了,已知有如下4张表:学生表:student 成绩表:s…

    数据库 2023年6月16日
    083
  • Java面试题(六)–Redis

    1 Redis基础篇 1、简单介绍一下Redis优点和缺点? 优点: 1、本质上是一个 Key-Value 类型的内存数据库,很像memcached 2、整个数据库统统加载在内存当…

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