如何使用html2pdf.js生成pdf文件详解

 更新时间:2025年04月02日 11:27:09   作者:xiaoliyo_  
html2pdf.js是基于html2canvas和jsPDF的轻量级库,可以在客户端实现网页到PDF的转换,这篇文章主要介绍了如何使用html2pdf.js生成pdf文件的相关资料,需要的朋友可以参考下

需求场景

1. vue2 + elment ui + echarts
2. 生成pdf需要 隐式处理(不需要用户操作)
3. pdf数据量过多需要分页,处理页眉页脚
4. 页面由多个组件组成,数据量过大需要全部渲染完再进行pdf生成

需求实现

1. 技术栈:通过html2pdf.js直接转pdf,不需要通过html2canvas和pdf.js进行二次操作
2. mounted里面再进行定时器调用生成 pdf 方法做到隐式生成

html2pdf.js

html2pdf就是html2canvas和pdf的集成,具体配置项可以看这个配置项文档,看不懂英文可以点击浏览器自带翻译成中文。

html2pdf.js使用

  • 第一步:下载html2pdf.js

npm install --save html2pdf.js 或者 yarn add html2pdf.js

  • 第二步:引入项目
import html2pdf from 'html2pdf.js'
 downloadPDF() {
      console.log('生成pdf')
      const element = document.getElementById('report') // 获取报告的DOM元素
      // 设置打印选项
      const options = {
        margin: 1, // 内边距
        filename: '评估报告.pdf', // pdf文件名字
        image: { type: 'jpeg', quality: 0.98 }, // 生成图片的类型以及清晰度
        pagebreak: { mode: 'avoid-all', before: '#page2el' }, // 处理是否元素分割
       //元素分割:就是分页的时候,会将图表、文字等元素分割成俩块,这里avoid-all是所有元素都不被分割
        html2canvas: { scale: 2 },
        jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' }
      }

      // 生成PDF
      html2pdf()
        .from(element)
        .set(options)
        .output('blob') // 将输出设置为Blob
        .then((blob) => {
          // 创建一个链接元素
          console.log('blob :>> ', blob)
          const url = URL.createObjectURL(blob)
          try {
            let file = this.transBlobFilrToFile(blob)
            console.log('file :>> ', file)
            // 这里可以将文件进行处理,上传pdf到服务器
          } catch (e) {
            console.log(e)
          }
        })
    },

全部代码

<div class="afour" id="report" @load="downloadPDF">
  <div class="afour_header" style="width: 100%;display: flex;flex-direction: column;">
   <div class="afour_header_span" style="display: flex;justify-content: space-between;">
     <p class="afour_header_p" style=" 
     	margin: 5px;
   		display: flex;
   		justify-content: center;
  		text-align: center;
   		font-size: 24px;
   		box-sizing: border-box;
   		flex: 1;">
        评估报告
      </p>
    <el-divider></el-divider>
  </div>
  <!--都是一些图表和echarts组件 通过绑定的 Data 进行传值-->
  <basic-vue :basicData='basicData' class="no-break"></basic-vue>
  <now-assessment-vue :nowData='nowData' class="no-break"></now-assessment-vue>
  <health-item-vue :healthData='healthData' class="no-break"></health-item-vue>
  <table-com-vue :tableData="waijianTableData" class="no-break"></table-com-vue>
  <table-com-vue :tableData="yiconxingTableData" class="no-break"></table-com-vue>
  <notice-text-vue :textData='textData' class="no-break"></notice-text-vue>
  <notice-text-vue :textData='noticeTextData' class="no-break"></notice-text-vue>
  <div class="footer">页脚---------------------</div>
</div>

<script>
import html2pdf from 'html2pdf.js'
import basicVue from './reportCom/basic.vue'
import healthItemVue from './reportCom/health-item.vue'
import nowAssessmentVue from './reportCom/now-assessment.vue'
import tableComVue from './reportCom/table-com.vue'
import noticeTextVue from './reportCom/notice-text.vue'

export default {
	name:"",
	components: { basicVue, nowAssessmentVue, healthItemVue, tableComVue, noticeTextVue },
	data() {
    return {
      basicData: {},
      nowData: {},
      healthData: [],
      waijianTableData: {},
      yiconxingTableData: {},
      textData: {},
      noticeTextData: {},
    },
    methods:{
    -------
    //其他方法
    -------
    downloadPDF() {
      console.log('生成pdf')
      const element = document.getElementById('report') // 获取报告的DOM元素
      // 设置打印选项
      const options = {
        margin: 1, // 内边距
        filename: '评估报告.pdf', // pdf文件名字
        image: { type: 'jpeg', quality: 0.98 }, // 生成图片的类型以及清晰度
        pagebreak: { mode: 'avoid-all', before: '#page2el' }, // 处理是否元素分割
       //元素分割:就是分页的时候,会将图表、文字等元素分割成俩块,这里avoid-all是所有元素都不被分割
        html2canvas: { scale: 2 },
        jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' }
      }

      // 生成PDF
      html2pdf()
        .from(element)
        .set(options)
        .output('blob') // 将输出设置为Blob
        .then((blob) => {
          // 创建一个链接元素
          console.log('blob :>> ', blob)
          const url = URL.createObjectURL(blob)
          try {
            let file = this.transBlobFilrToFile(blob)
            console.log('file :>> ', file)
            // 这里可以将文件进行处理,上传pdf到服务器
          } catch (e) {
            console.log(e)
          }
        })
    },
    }
    mounted() { 
		setTimeout(()=>{
			this.downloadPDF()
		}.500)
	},
  },

}
</script>

问题

  • mounted处理需要是从别的页面跳转过来这个页面才可以生效,那如果是在原基础页面弹窗出这个页面,怎么样才能保险生成pdf呢?求告知~

总结 

到此这篇关于如何使用html2pdf.js生成pdf文件的文章就介绍到这了,更多相关html2pdf.js生成pdf文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ES6学习笔记之正则表达式和字符串正则方法分析

    ES6学习笔记之正则表达式和字符串正则方法分析

    这篇文章主要介绍了ES6学习笔记之正则表达式和字符串正则方法,结合实例形式对比分析了ES5与ES6正则操作的常用函数功能与用法区别,需要的朋友可以参考下
    2017-04-04
  • IE与Firefox在JavaScript上的7个不同写法小结

    IE与Firefox在JavaScript上的7个不同写法小结

    尽管那需要用长串的、沉闷的不同分支代码来应付不同浏览器的日子已经过去,偶尔还是有必要做一些简单的区分和目标检测来确保某块代码能在用户的机器上正常运行。
    2009-09-09
  • JavaScript将坐标字符串转为数组的项目实践

    JavaScript将坐标字符串转为数组的项目实践

    本文主要介绍了JavaScript将坐标字符串转为数组的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • D3.js实现饼状图的方法详解

    D3.js实现饼状图的方法详解

    相信大家都知道图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等。可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和Web应用和项目的可靠性。现在就让我们大家一起来学习用D3.js来实现饼图的方法,有需要的可以参考借鉴。
    2016-09-09
  • 用JS动态改变表单form里的action值属性的两种方法

    用JS动态改变表单form里的action值属性的两种方法

    下面小编就为大家带来一篇用JS动态改变表单form里的action值属性的两种方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaScript事件委托实例分析

    JavaScript事件委托实例分析

    这篇文章主要介绍了JavaScript事件委托的用法,以实例形式分析了javascript事件委托的实现方法,需要的朋友可以参考下
    2015-05-05
  • 微信小程序中遇到的iOS兼容性问题小结

    微信小程序中遇到的iOS兼容性问题小结

    这篇文章主要给大家介绍了关于微信小程序中遇到的一些iOS兼容性问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 如何通过setTimeout理解JS运行机制详解

    如何通过setTimeout理解JS运行机制详解

    这篇文章主要给大家介绍了关于如何通过setTimeout理解JS运行机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Javascript实现滚动图片新闻的实例代码

    Javascript实现滚动图片新闻的实例代码

    这篇文章主要介绍了Javascript实现滚动图片新闻的实例代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • JS Input里添加小图标的两种方法

    JS Input里添加小图标的两种方法

    大家在做网站的时候,经常需要在input里面添加小图标功能,看似功能很简单,但是实现起来还是有点技巧的,下面小编给大家介绍下JS Input里添加小图标的两种方法,需要的朋友参考下吧
    2017-11-11

最新评论