html2canvas和jspdf实现html导出pdf文件

这篇具有很好参考价值的文章主要介绍了html2canvas和jspdf实现html导出pdf文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现原理

先使用html2canvas对页面进行截图,再使用jspdf将截图生成pdf文件

html2canvas:通过纯JS对浏览器页面进行截图
jspdf:一个基于 HTML5 的客户端解决方案,用于在客户端 JavaScript 中生成 pdf文件 的库

安装html2canvas和pdf

npm install --save htmlcanvas2
npm install --save jspdf

截图源码

1. 截长图不分页

function handleHtml2canvas(canvas) {
  let contentWidth = canvas.width;
  let contentHeight = canvas.height;

  //一页pdf显示html页面生成的canvas高度;
  let pageHeight = (contentWidth / 592.28) * 841.89;
  //未生成pdf的html页面高度
  let leftHeight = contentHeight;
  //页面偏移
  let position = 0;
  //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
  let imgWidth = 595.28;
  let imgHeight = (592.28 / contentWidth) * contentHeight;

  let pageData = canvas.toDataURL('image/jpeg', 1.0);

  let doc = new JsPDF('', 'pt', 'a4');

  //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
  //当内容未超过pdf一页显示的范围,无需分页
  if (leftHeight < pageHeight) {
    doc.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
  } else {
    while (leftHeight > 0) {
      doc.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
      leftHeight -= pageHeight;
      position -= 841.89;
      //避免添加空白页
      if (leftHeight > 0) {
        doc.addPage();
      }
    }
  } 
  
  return doc;
}

2. 截图分页文章来源地址https://www.toymoban.com/news/detail-650419.html

function handleHtml2canvas(canvas) {
  let contentWidth = canvas.width;
  let contentHeight = canvas.height;

  //一页pdf显示html页面生成的canvas高度;
  let pageHeight = (contentWidth / 592.28) * 841.89;
  //未生成pdf的html页面高度
  let leftHeight = contentHeight;
  //页面偏移
  let position = 0;
  //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
  let imgWidth = 595.28;
  let imgHeight = (592.28 / contentWidth) * contentHeight;

  let pageData = canvas.toDataURL('image/jpeg', 1.0);

  let doc = new JsPDF('', 'pt', 'a4');

  //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
  //当内容未超过pdf一页显示的范围,无需分页
  if (leftHeight < pageHeight) {
    doc.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
  } else {
    while (leftHeight > 0) {
      doc.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
      leftHeight -= pageHeight;
      position -= 841.89;
      //避免添加空白页
      if (leftHeight > 0) {
        doc.addPage();
      }
    }
  } 
  
  return doc;
}

导出pdf源码

export function exportPdf({ selector, name = 'file', usePage = false, handler }) {
  if (!selector) return;
  const ele = document.querySelector(selector);
  window.setTimeout(() => {
    html2Canvas(ele, {
      logging: false,
      scrollY: 0,
      scrollX: 0,
      scale: 2, // 添加的scale 参数
      width: ele.clientWidth, // dom 原始宽度
      // height: Math.max(ele.clientHeight, ele.clientWidth),
      allowTaint: false,
      useCORS: true, // 开启跨域
      // ignoreElements: (item) => {
      //   return item.classList.contains('export-ignore');
      // },
      onclone(doc) { // html2canvas会把所有dom节点拷贝到一个虚拟节点中,在拷贝结束后执行onclone函数,在onclone函数中修改节点不会影响真实dom
        if (handler) {
          handler(doc);
        }
      }
    }).then(canvas => {
      let doc = usePage ? handleHtml2canvas(canvas) : handleHtml2canvasWithoutPage(canvas);
      doc.save(`${name}.pdf`);
    });
  }, 300);
}

函数调用

handleDoc(doc) {
// doc处理方法,这里可以修改导出节点内容
doc.querySelector('.export-box').classList.add('exporting');
},
    
exportPdf({
     selector: '.domSelector',
     name: 'pdf文件名',
     usePage: true,
     handler: handleDoc
   });

到了这里,关于html2canvas和jspdf实现html导出pdf文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 纯前端--原生js将html页面变成pdf文件(html2canvas+jsPDF)

    1、将文档放在本地,用原生js进行引用和使用。 ① 新建一个名为 html2canvas.min.js 的文件,并且将线上的内容进行复制。 ② 引入 js 文件: 2、使用 npm 进行安装使用: 待续。。。 github 中文网站 CDN Jspdf.es.js:ES 2015 模块格式。 Jspdf.umd.js:UMD模块格式,用于 AMD 或脚本标签加载

    2024年02月08日
    浏览(56)
  • 前端生成pdf之html2canvas+jsPDF,以及解决图片不显示bug

    开发背景: 需要给页面中相应的内容生成pdf,查找文档后发现要用到两个插件。html2canvas 以及 jsPDF html2canvas 给dom结构转化为canvas,然后生成各种类型图片 jsPDF 把canvas 生成的图片url 转化为pdf 参数 image:表示要插入的图片资源,可以是图片文件的路径或者base64编码字符串。

    2024年02月02日
    浏览(52)
  • html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

        一、问题原因  对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法  两步 1. 图片元素上设置属性  crossorigin=\\\"anonymous\\\"  支持原生img和eleme组件  2. 存储桶设置资源跨域访问 阿里腾讯云为例:↓ 阿里云OS

    2024年02月15日
    浏览(47)
  • 前端vue基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月03日
    浏览(45)
  • Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

    在做项目时有这么一个需求,需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题: 导出按A4纸大小排列 预留页面边距的问题 内容过多自动分页的问题 直接使用jspdf中文乱码的问题

    2024年01月25日
    浏览(60)
  • 【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

    问题:使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样,在mac下,一切正常,看起来很舒服,但是当我把页面放在扩展屏幕下(27寸),再生成一个pdf,虽然排版一样,但是文字就变得非常小 下面的是在mac下的,上面是在扩展屏幕下的,最开始我以为是文字大

    2024年02月16日
    浏览(50)
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(48)
  • Vue使用html2canvas将DOM节点生成对应的PDF

    要通过Vue使用html2canvas将DOM节点生成对应的PDF,您需要安装html2canvas和jspdf这两个库。html2canvas用于将DOM节点转换为Canvas,而jspdf用于将Canvas转换为PDF。以下是一个简单的示例代码,展示了如何使用html2canvas和jspdf生成PDF文件: 首先,安装html2canvas和jspdf依赖: 然后,在Vue组件中

    2024年02月11日
    浏览(54)
  • 高亮img、pdf重点部分(html2canvas、pdfjs-dist、react-pdf)

    报销单据审批中,高亮发票部分 后台返回 一张图片或者pdf 、返回 一组坐标 ,坐标类型 [number,number,number,number] ,分别代表了x、y、width、height。需要根据坐标在图片上高亮出来坐标位置。如下图 高亮的坐标是: dom转成图片:html2canvas pdf预览:pdfjs-dist、react-pdf 遮照:纯css实

    2024年02月10日
    浏览(41)
  • 小程序采用html2canvas实现html转canvas保存图片

    mpaas小程序中采用html2canvas实现html转canvas保存图片 使用uniapp将代码打包一份h5部署到服务器 h5要保存的图片组件页面report.vue 安装 npm install --save html2canvas 或 yarn add html2canvas 引入import html2canvas from ‘html2canvas’; ts 小程序中采用webview跳转到h5页面

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包