vue 批量导出pdf 压缩包 zip

news2024/9/21 2:33:23

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内容 跟 名称的promise
      let p1 = this.generatePDF('id1', '填报记录1')
      let p2 = this.generatePDF('id2', '填报记录2')

      promises.push(p1)
      promises.push(p2)
		
		//批量执行promise
      Promise.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 => {
          //下载 zip
            saveAs(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.width
          let contentHeight = canvas.height
          // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
          let pageHeight = contentWidth / 592.28 * 841.89
          let leftHeight = contentHeight
          let position = 0
          let imgWidth = 595.28
          let imgHeight = 592.28 / contentWidth * contentHeight
          let 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 -= pageHeight
              position -= 841.89
              if (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>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10个精选ArcGIS图源分享第4辑

数据是GIS的血液。 我们在《10个精选ArcGIS图源分享第3辑》一文中为你分享了10个ArcGIS图源&#xff0c;现在又增加了10个新的图源作为第4辑分享给大家。 并提供了能直接在ArcMap和ArcGIS Pro打开的文件&#xff0c;如果你需要这些ArcGIS图源&#xff0c;请在文末查看该数据的…

iPhone出现4013错误的和解决方案分享

在苹果设备用户群体中&#xff0c;遇到iTunes错误4013是一个颇为棘手的问题。这个错误通常发生在尝试更新iOS系统、恢复iPhone或iPad时&#xff0c;导致操作无法顺利完成。本文将为你提供一系列实用的解决方案&#xff0c;帮助你摆脱iPhone 4013错误的困扰。 一、了解错误4013的…

AI大模型编写多线程并发框架(六十四):监听器优化·下

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第十一轮对话-修正运行时数据三、修正任务计数器四、第十二轮对话-生成单元测试五、验证通过七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答…

面向智能体编程(Agent-Oriented Programming, AOP)

大家已经熟知面向对象编程、面向接口编程&#xff0c;AI大模型研发背景下&#xff0c;又产生了一个新概念&#xff1a;&#xff08;Agent-Oriented Programming, AOP&#xff09; 它是一种特殊的编程范式&#xff0c;它专注于开发能够模拟人类智能行为的智能体。智能体是能够在…

水经微图Web版功能简介

我们在《水经微图Web版341项功能清单》一文中&#xff0c;为你罗列了水经微图&#xff08;下称“微图”&#xff09;的详细功能清单。 现在基于该清单&#xff0c;再为你分享微图最主要的功能&#xff0c;从而让你对该平台有一个基本的了解。 微图Web版功能简介 微图Web版&a…

Vue3 官方推荐状态管理库Pinia

介绍 Pinia 是 Vue 官方团队推荐代替Vuex的一款轻量级状态管理库&#xff0c;允许跨组件/页面共享状态。 Pinia 旨在提供一种更简洁、更直观的方式来处理应用程序的状态。 Pinia 充分利用了 Vue 3 的 Composition API。 官网&#xff1a; Pinia符合直觉的 Vue.js 状态管理库 P…

我如何选择自己的AI细分方向和第一个入门项目

思维导图 下图展示了我的思考和分析过程 目录 思维导图大纲1. **确定兴趣和技能方向**2. **寻找合适的开源项目**3. **评估项目的活跃度**4. **开始贡献**5. **展示你的贡献**6. **推荐开源项目**总结 选择一个细分领域1. **了解各个领域的基本概念**2. **考虑你的兴趣和背景**…

备战秋招60天算法挑战,Day29

题目链接&#xff1a; https://leetcode.cn/problems/decode-ways/ 视频题解&#xff1a; https://www.bilibili.com/video/BV181YKeGE3E/ LeetCode 91. 解码方法 题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> &qu…

大力出奇迹背景下的Scaling Law能否带领我们走向AGI

Scaling Law&#xff08;尺度定律&#xff09; 在人工智能领域&#xff0c;尤其是在大模型的发展中扮演着至关重要的角色。它描述了模型性能如何随着模型规模&#xff08;如参数数量&#xff09;、数据量和计算资源的增加而提升。这一定律对于理解大模型的能力扩展和优化训练策…

CSS3文本属性详解

4.2 文本属性 想缩进段落&#xff0c;幂指数&#xff0c;标题字符增加间距&#xff0c;要用到文本属性。 最有用的CSS文本属性&#xff1a; text-indent:文本缩进letter-spacing:字符间距word-spacing:单词间距text-decoration:文本装饰&#xff0c;下划线text-align:文字对…

2024年小鹏MONA M03 P7 G3 G3i P5 G9 P7i G6 X9维修手册和电路图

汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新&#xff01; 覆盖车型&#xff1a; 2024年小…

langchain结合searXNG实现基于搜索RAG

目录 一、背景 二、环境说明和安装 1.1 环境说明 2.2 环境安装 2.2.1 searXNG安装 三、代码实现 代码 结果输出 直接请求模型输出 四、参考 一、背景 大语言模型的出现带来了新的技术革新&#xff0c;但是大模型由于训练语料的原因&#xff0c;它的知识和当前实时热点…

白酒酿造设备大揭秘:科技与传统的结合

在白酒的酿造世界里&#xff0c;设备与工艺同样重要。它们共同构建了白酒的不同风味和品质。今天&#xff0c;就让我们一起走进豪迈白酒&#xff08;HOMANLISM&#xff09;的酿造车间&#xff0c;探索那些科技与传统相结合的酿造设备&#xff0c;感受它们如何为白酒的酿造增添魅…

Seata环境搭建

1、Seata下载&#xff1a; 1.下载地址 2.下载的版本 2、Seata参数配置参考&#xff1a; 各种seata参数官网参考 3、Seata安装部署&#xff1a; 3.1.Seata新手部署指南: 3.2.在mysql8.0数据库里面建库建表 a.建数据库&#xff1a; create database seata; use seata;b.建…

开源项目管理工具 Plane 安装和使用教程

说到项目管理工具&#xff0c;很多人脑海中第一个蹦出来的可能就是 Jira 了。没错&#xff0c;Jira 确实很强大&#xff0c;但是...它也有点太强大了&#xff0c;既复杂又昂贵&#xff0c;而且目前也不再提供私有化部署版本了。 再说说飞书&#xff0c;作为国产之光&#xff0…

电路基础 ---- 负反馈放大电路的方框图分析法

1 方框图分析法 方框图如下&#xff1a; 图中 A u o A_{uo} Auo​是一个电压输入的放大器的放大倍数&#xff0c;称为开环放大倍数。 F F F为反馈系数&#xff0c;是一个矢量&#xff0c;是指输出信号 x o x_{o} xo​的多少倍回送到放大器的输入端。 M M M为衰减系数&#x…

[pytorch] --- pytorch基础之损失函数与反向传播

1 损失函数 1.1 Loss Function的作用 每次训练神经网络的时候都会有一个目标&#xff0c;也会有一个输出。目标和输出之间的误差&#xff0c;就是用Loss Function来衡量的。所以Loss误差是越小越好的。此外&#xff0c;我们可以根据误差Loss&#xff0c;指导输出output接近目…

浏览器百科:网页存储篇-Cookie详解(一)

1.引言 在现代网页开发中&#xff0c;数据存储和管理是提升用户体验的重要环节之一。作为网页存储技术的元老&#xff0c;Cookie 自从诞生以来就扮演着不可或缺的角色。Cookie 允许网站在用户浏览器中存储小块数据&#xff0c;从而实现状态保持、用户跟踪以及个性化设置等功能…

数仓基础(六):离线与实时数仓区别和建设思路

文章目录 离线与实时数仓区别和建设思路 一、离线数仓与实时数仓区别 二、实时数仓建设思路 离线与实时数仓区别和建设思路 ​​​​​​​一、离线数仓与实时数仓区别 离线数据与实时数仓区别如下&#xff1a; 对比方面 离线数仓 实时数仓 架构选择 传统大数据架构 …