首页 > 其他分享 >vue中导出PDF和图片

vue中导出PDF和图片

时间:2022-12-01 19:46:28浏览次数:36  
标签:canvas vue target 导出 let pdf PDF

1、安装:npm install html2canvas jspdf --save

2、创建:html2canvas.js 文件,内容如下:

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

/**
 * @param {String} title 文件名称(必选)
 * @param {Element} target Dom元素(必选)
 * @param {String} direction PDF纵向、横向,缺省时默认纵向
 * @return {Base64} 返回的PDF
 */

// 导出PDF
export function exportPDF(title, target, direction) {
 let element = target
 setTimeout(() => {
  html2Canvas(element).then(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, imgHeight
   if (direction == 'l') {
    // 横向
    imgWidth = 841.89
    imgHeight = (841.89 / contentWidth) * contentHeight
   } else {
    // 纵向
    imgWidth = 595.28
    imgHeight = (592.28 / contentWidth) * contentHeight
   }
   let pageData = canvas.toDataURL('image/jpeg', 1.0)
   let pdf = new JsPDF(direction, 'pt', 'a4')
   // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
   // 当内容未超过pdf一页显示的范围,无需进行分页
   if (leftHeight < pageHeight) {
    pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
   } else {
    // 当内容超过pdf一页显示的高度范围时,进行分页
    while (leftHeight > 0) {
     pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
     leftHeight -= pageHeight
     position -= 841.89
     // 避免添加空白页
     if (leftHeight > 0) {
      pdf.addPage()
     }
    }
   }
   pdf.save(title + '.pdf')
  })
 }, 1000)
}

/**
 * @param {String} title 文件名称(必选)
 * @param {Element} target Dom元素(必选)
 * @param {String} scale 放大倍数,缺省时值取4
 * @return {Base64} 返回image
 */

// 导出图片
export function exportImage(title, target, scale) {
 let element = target
 html2Canvas(element, {
  scale: scale || 4, // 放大倍数 越大越清晰 文件越大, 默认值:4
 }).then(canvas => {
  let imgDataSrc = canvas.toDataURL('image/png', 1.0)
  const $tag = document.createElement('a')
  $tag.setAttribute('download', title.replace(/\./g, '。'))
  $tag.href = imgDataSrc
  $tag.click()
 })
}
3、在组件中使用:

import { exportPDF, exportImage } from '../utils/html2canvas' // 引入 // 导出PDF、Image export_print(type) { let file_name = '测试导出' // 文件名 let target_dom = document.getElementById('export_print') // 需要导出的dom元素 if (type == 'export') { exportImage(file_name, target_dom) // 调用导出Image方法 } else { // 滚动条置顶,避免截图不全,截图是从当前浏览器看的位置开始截取的 window.pageYOffset = 0 document.documentElement.scrollTop = 0 document.body.scrollTop = 0 exportPDF(file_name, target_dom, 'l') // 调用导出PDF方法 } }

ps:抄别人的,只拿来整合了一下。

原文1:https://blog.csdn.net/qq_63310300/article/details/124900662(导出PDF)

原文2:https://blog.csdn.net/zd1007129657/article/details/116598038(导出图片)

标签:canvas,vue,target,导出,let,pdf,PDF
From: https://www.cnblogs.com/lyt520/p/16942477.html

相关文章

  • vue-CLI脚手架
    1.使用cmd创建1.1管理员方式打开cmd,安装官网安装vue-clihttps://cli.vuejs.org/zh/guide/installation.html1.2安装成功,提示无vue命令npmconfiglist找到prefix......
  • 【一库】vueuse:我不许身为vuer,你的工具集只有lodash!
      vueuse是什么?一款基于Vue组合式API的函数工具集。以上是官方网站关于它的定义。官网地址首先,它基于VueCompositionApi(组合式API),只有在支持组合式API......
  • vue.config.js --- vue-cli 4.0配置
    //所有配置请参考https://cli.vuejs.org/zh/config/module.exports={/***publicPath*hash模式下可使用*publicPath:process.env.NODE_ENV==='......
  • 前后端分离项目VUE使用axios调用微服务SpringBoot后端接口无法获取参数
    前言首先这是一个很简单却又很恶心的问题,简单就是只需要根据服务端的入参规则传参就行了,恶心就是在写前端时,大多数是只知道入参和请求方式的,但是这里就会涉及到一些小的知识......
  • vue2 数组18 some erver filter reduce axios
    some: return true是固定写法,终止some循环 erver: filter:   优化写法:arr.filter(item=>item.state).reduce((累加的结果,当前循环项)=>{},初始值)拿上......
  • vue生命周期及钩子函数
    1.什么是vue生命周期vue生命周期指实例从开始创建到销毁的过程,在整个生命周期中,它提供了一系列事件,可以让我们在事件触发时注册js方法。在这些方法中,this指向的......
  • vue3使用记录
    1.路由跳转<scriptsetup>import{useRouter}from"vue-router";constrouter=useRouter();functiontoDetail(){router.push({path:"/detail",});......
  • vue3状态流转记录
    刚用vue3的时候觉得习惯了之后非常爽,比vue2比起来要灵活,ref、reactive等新api写几个页面也基本理解用法了。但是逐渐深入后发现遇到一些疑难问题的时候,排查起来非常困难,其......
  • JAVA整合阿里云OSS/VUE上传阿里云OSS
    前言今天码帮帮系统已经整合到上传项目案例的功能了,这里有一些图片资源需要上传,之前做项目对接过七牛云,也有使用过阿里云的视频点播服务,不过这次对接阿里云的OSS确实有点......
  • VUE全局this指向
    前言在很久很久之前我还是个菜鸡的时候,解决报错的时候,不幸看过一种关于this指向的写法,当时没记住,只知道有个这么个模糊的概念,然后今天晚上来了灵感,就写出来了,说到这个thi......