首页 > 其他分享 >vue 将html保存成pdf文件

vue 将html保存成pdf文件

时间:2023-10-30 20:34:19浏览次数:35  
标签:canvas vue ele html pageData var pdf

结合 html2canvas 和 jspdf 插件处理

/* eslint-disable */
//不使用JQuery版的
import html2canvas from 'html2canvas'
import JsPDF from 'jspdf'

/**
 * @param  ele          要生成 pdf 的DOM元素(容器)
 * @param  padfName     PDF文件生成后的文件名字
 * */
export function toPdf(ele) {
  
  return new Promise((resolve,reject)=>{

    html2canvas(ele, {
      dpi: 300,
      // allowTaint: true,  //允许 canvas 污染, allowTaint参数要去掉,否则是无法通过toDataURL导出canvas数据的
      useCORS: true,
      scale: 2,
      logging: false,
      async: true,
    }).then((canvas) => {
      var contentWidth = canvas.width
      var contentHeight = canvas.height

      console.log(contentWidth, contentHeight)
      

      //一页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 = (595.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', 左,上,宽度,高度)设置在pdf中显示;
        pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
        // pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);
      } else {
        // 分页
        while (leftHeight > 0) {
          pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
          leftHeight -= pageHeight
          position -= 841.89
          //避免添加空白页
          if (leftHeight > 0) {
            pdf.addPage()
          }
        }
      }
      resolve(pdf)

    }).catch(()=>{
      reject()
    })
  })
}

export async function downloadPDF(ele, pdfName){
  const pdf = await toPdf(ele)
  pdf.save(pdfName)
}

 

标签:canvas,vue,ele,html,pageData,var,pdf
From: https://www.cnblogs.com/wjs0509/p/17798711.html

相关文章

  • HTML
    HTML标签关系父子关系(嵌套关系)兄弟关系(并列关系)文本格式化标签strong、em、ins、del标签自带强调含义(语义)。图片标签属性名=“属性值”。src用于指定图片的位置和名称,是的必须属性。图片标签-属性属性的添加没有先后顺序之分。width,height对图片进行缩放;浏览器对......
  • [Vue学习]使用Vue-cli脚手架快速搭建项目
    安装vue-cli3npminstall-g@vue/cli验证vue版本vue--version 使用vuecreate项目名创建(需要cd进具体的目录)npmrundev(运行)npmrunbuild(编译)(也可以使用vue ui界面图形化方式进行创建) ==================================================可以直接使用下面方式创建项......
  • 34-Vue脚手架-组件的自定义事件(使用自定义事件优化Todo-List案例)
    组件的自定义事件1.一种组件间通信的方式,适用于子组件===>父组件(这里也可以使用props传递数据进行实现)2.使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)3.绑定自定义事件:1)第一种方式,在父组件中<!--通过父组件给子组件绑定一个......
  • vue关于render函数如何渲染v-html
    render函数如何渲染v-html,两种方式(适用于搜索关键字高亮) 例子:“互联网数据”搜索关键字"网"==>row.htmlStr:互联<spanclass="search-text">网</span>数据render:(h,{row})=>{//模板组件方式returnh({template:"<span>"+row.htmlStr+"&l......
  • Vue 3中toRaw和markRaw的使用
    文章目录Vue3的响应性系统使用`toRaw`使用`markRaw`使用场景1.与第三方库交互2.提高性能3.避免无限循环总结......
  • vuex
    一、概念:1.为什么要用vuex?传统:每个页面都要去重新请求后台得到将数据存到session、cookie中作用:专门为vue.js设计的集中式状态管理架构.数据仓库,主要管理状态(共用的属性或数据).把数据进行共享,每个页面想用,都可以来调用.......
  • HTML和form表单
    标签的分类HTML学习地址https://www.yuque.com/liyangqit/rg7b7l/lveku6#nX5Va1.单标签imgbrhr<img/>2.双标签ahpdiv<a></a>3.按照标签属性分类1.块儿标签#自己独自占一行h1-h6pdiv2.行内(内联)标签#......
  • vue中attrs的使用
    vue中attrs的使用1.attrs的作用用来进行子孙组件之间的数据传递接收父组件传过来,但是又没有在props中定义的数据。(class及style除外)2.父子组件之间数据传递的用法爷爷组件-grandpa:<template><div><span>爷爷</span><Son:phone="phone"sex="男"......
  • FastReport 导出Excel、Word、Pdf
    privatevoidExportPDF(H_HistoryDataModelmodel){try{//createreportinstanceReportreport=newReport();PrepareReport(report,model);//createexpor......
  • 使用 Java 对比两个PDF文档之间的差异
    不论是在团队写作还是在个人工作中,PDF文档往往会经过多次修订和更新。掌握PDF文档内容的变化对于管理文档有极大的帮助。通过对比PDF文档,用户可以快速找出文档增加、删除和修改的内容,更好地了解文档的演变过程,轻松地管理文档。本文将介绍如何在Java程序中通过代码快速比较......