当前位置: 首页 > news >正文

vue 批量导出pdf 压缩包 zip

vue 批量导出pdf 压缩包 zip

使用插件
html2canvas
jspdf
jszip (百度ai搜出来的是zip-js 这个没法安装)
file-saver

思路:
1.使用 html2canvas+jspdf 将页面转图片转pdf(这个怎么转的可以网上搜下很多)
2.利用jszip+file-saver 结合promise.all 写入压缩包中

1.准备页面

<template><div><div :id="'id'+1">11111</div><div :id="'id'+2">2222</div><div :id="'id'+3">33333</div><div :id="'id'+4">44444</div></div>
</template>
<style lang="scss" scoped>
#id1{background: blue;color: #fff;line-height: 40px;font-size: 30px
}
#id3{background: rgb(0, 255, 128);color: #fff;line-height: 40px;font-size: 30px
}
#id2{background: rgb(255, 136, 0);color: #fff;line-height: 40px;font-size: 30px
}
#id4{background: rgb(255, 0, 106);color: #fff;line-height: 40px;font-size: 30px;
}
</style>

在这里插入图片描述

2.写js

<script>
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
import { saveAs } from 'file-saver'
import Jszip from 'jszip'export default {// 提交handleSubmit() {// 创建一个zip实例const zip = new Jszip()//创建一个promises 容器const promises = []//生成pdf 得到一个含有pdf内容 跟 名称的promiselet p1 = this.generatePDF('id1', '填报记录1')let p2 = this.generatePDF('id2', '填报记录2')promises.push(p1)promises.push(p2)//批量执行promisePromise.all(promises).then(async(pdfs) => {for (let i = 0; i < pdfs.length; i++) {const { PDF, name } = pdfs[i]// 如果只是导出一个pdf,则导出pdf格式if (pdfs.length === 1) {//名称可以自己取PDF.save(`${name}-${new Date().getTime()}.pdf`)// this.allLoading = false// this.loadingText = '正在请求数据'} else {// 否则添加到压缩包里面await zip.file(`${name}-${new Date().getTime()}.pdf`, PDF.output('blob'))}}if (pdfs.length > 1) {zip.generateAsync({ type: 'blob' }).then(content => {//下载 zipsaveAs(content, 'xxxxxxx.zip')})}}).finally(() => {// this.allLoading = false//  this.loadingText = '正在请求数据'})console.log(promises)},//将html转成 pdf 最后一步的时候别使用pdf.save。generatePDF(content, filename) {return new Promise((resolve, reject) => {const cloneDom = document.getElementById(content).cloneNode(true)document.getElementsByTagName('body')[0].appendChild(cloneDom)html2Canvas(cloneDom,{ allowTaint: false }).then((canvas) => {let contentWidth = canvas.widthlet contentHeight = canvas.height// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高let pageHeight = contentWidth / 592.28 * 841.89let leftHeight = contentHeightlet position = 0let imgWidth = 595.28let imgHeight = 592.28 / contentWidth * contentHeightlet pageData = canvas.toDataURL('image/jpeg', 1.0)let PDF = new JsPDF('', 'pt', 'a4')if (leftHeight < pageHeight) {PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)} else {while (leftHeight > 0) {PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= 841.89if (leftHeight > 0) {PDF.addPage()}}}// const blob = PDF.output('blob')// console.log(blob)//将pdf内容 跟名称 resolve出去resolve({ PDF, name: filename })// PDF.save(`关联OA申请单(${timeToTime(new Date(), false)}).pdf`)document.getElementsByTagName('body')[0].removeChild(cloneDom)})})}}
}
</script>

下载成功,代码可以直接用
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Location-Aware Self-Supervised Transformers for Semantic Segmentation
  • 最新保姆级教程
  • 车窗边缘上的装饰边和花点的作用
  • 废品回收小程序,从传统到现代化的回收模式
  • spring cloud与boot与cloud alibaba版本对应
  • AR 眼镜之-系统通知定制(通知弹窗)-实现方案
  • 我在IBM的时光碎片1 - 回忆昊海大厦
  • Unity (编辑器)数据持久化 之 ScriptableObject初识与创建
  • Adobe Illustrator vs Photoshop:设计界的“相声搭档”
  • 【类模板】模板参数的推断
  • [激光原理与应用-126]:傅里叶变化与频域分析
  • Redis的内存淘汰策略-volatile-ttl
  • 【Python机器学习】词向量推理——语义查询与类比
  • HarmonyOS实战开发:NAPI接口规范开发
  • 华为 HCIP-Datacom H12-821 题库 (3)
  • [译]Python中的类属性与实例属性的区别
  • Android 架构优化~MVP 架构改造
  • CentOS 7 修改主机名
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Laravel 菜鸟晋级之路
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL几个简单SQL的优化
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Promise初体验
  • spring cloud gateway 源码解析(4)跨域问题处理
  • tensorflow学习笔记3——MNIST应用篇
  • 初探 Vue 生命周期和钩子函数
  • 动态魔术使用DBMS_SQL
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于Flux,Vuex,Redux的思考
  • 猴子数据域名防封接口降低小说被封的风险
  • 力扣(LeetCode)21
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 微服务入门【系列视频课程】
  • 一个JAVA程序员成长之路分享
  • 一些css基础学习笔记
  • 一些关于Rust在2019年的思考
  • 怎样选择前端框架
  • ​卜东波研究员:高观点下的少儿计算思维
  • #NOIP 2014#Day.2 T3 解方程
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (四)linux文件内容查看
  • (四)进入MySQL 【事务】
  • (四)模仿学习-完成后台管理页面查询
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net Memory Profiler的使用举例
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @html.ActionLink的几种参数格式
  • [Algorithm][综合训练][kotori和n皇后][取金币][矩阵转置]详细讲解