使用JS导出一个或多个pdf并生成zip压缩包

前端生成和导出pdf zip

使用的插件:jspdf、html2canva、jszip、file-saver

插件安装 :npm install jspdf html2canvas jszip file-saver

可用于单个导出pdf ,或者多个 直接生成压缩包

ps:这里演示代码使用场景是:zip文件里多个pdf (自行修改)

pdf.js

//PDF.js
import html2canvas from 'html2canvas'
import jsPDF from 'jspdf'
/**
 * 网页转pdf
 * @param {*} dom 指定区域
 * @param {*} name 文件名
 */
export const downloadPDF = (dom, name) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      var _downDOM = dom
      // 导出之前先将滚动条置顶,不然会出现数据不全的现象
      window.pageYOffset = 0
      document.documentElement.scrollTop = 0
      document.body.scrollTop = 0
      html2canvas(_downDOM, {
        scale: 4, //按比例增加分辨率 (2=双倍).
        dpi: window.devicePixelRatio * 4, //设备像素比
      }).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 = 555.28
        var imgHeight = (555.28 / contentWidth) * contentHeight
        var pageData = new Image()
        //设置图片跨域访问
        pageData.setAttribute('crossOrigin', 'Anonymous')
        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', 20, 80, imgWidth, imgHeight)
        } else {
          while (leftHeight > 0) {
            pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight)
            leftHeight -= pageHeight
            position -= 841.89
            //避免添加空白页
            if (leftHeight > 0) {
              pdf.addPage()
            }
          }
        }
        //这里返回文件 用来处理多个下载 打包zip
        resolve({ PDF: pdf, name: name })
        //直接单个pdf可直接调用下面方法
        // pdf.save(name)
      })
    }, 10)
  })
}

template中使用

import JSZip from 'jszip'
import FileSaver from 'file-saver'
import { downloadPDF } from '@/utils/pdf' //引入封装的pdf.js文件
 
 /**
  * 触发下载
  */
 async download() {
  let promises = []
  //downloadTaskList 为下载的长度,我这里是为发票数组
  for (let i = 0; i < this.downloadTaskList.length; i++) {
     //dom 具体传入参数 自行修改
     let PDFres = await downloadPDF(this.$refs[`pdf${this.downloadTaskList[i].code}`][0], `${this.downloadTaskList[i].realName}-${this.downloadTaskList[i].code}`)
     promises.push(PDFres)
     const loading = this.$loading({
        lock: true,
        text: 'loading...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)',
      })
     //动态提示需要等待生成文件
     loading.setText(`正在生成第${i + 1}/${this.downloadTaskList.length}份回执单`)
     if (i === this.downloadTaskList.length - 1) {
      this.zipChange(promises)
      loading.close()
     }
   }
},
/**
 *生成zip
 */
zipChange(promises) {
    Promise.all(promises).then(async(pdfs) = >{
        const zip = new JSZip() 
        promises.forEach(async(item, index) = >{
            const {PDF,name} = item
            if (promises.length === 1) {
                PDF.save(`$ {name}.pdf`)
            } else {
                await zip.file(`$ {name}.pdf`, PDF.output('blob'))
            }
        }) 
        if (promises.length > 1) {
            zip.generateAsync({type: 'blob'}).then((content) = >{
                FileSaver.saveAs(content, '回执' + '.zip')
            })
        }
    })
},
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您可以使用Java中的ZipOutputStream类来实现压缩多个Excel文件。以下是一个简单的示例代码: ```java import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import java.io.*; import java.util.ArrayList; import java.util.List; public class ExportExcel { public static void main(String[] args) throws IOException { // 创建多个Excel文件 List<File> fileList = createExcelFiles(); // 创建压缩文件 File zipFile = new File("excel_files.zip"); ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(zipFile); zipOutputStream.setMethod(ZipArchiveOutputStream.DEFLATED); // 将多个Excel文件压缩压缩中 for (File file : fileList) { ZipArchiveEntry entry = new ZipArchiveEntry(file.getName()); entry.setSize(file.length()); zipOutputStream.putArchiveEntry(entry); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, len); } fis.close(); zipOutputStream.closeArchiveEntry(); } // 关闭ZipOutputStream流 zipOutputStream.finish(); zipOutputStream.close(); // 删除临时Excel文件 for (File file : fileList) { file.delete(); } } private static List<File> createExcelFiles() throws FileNotFoundException { List<File> fileList = new ArrayList<>(); for (int i = 1; i <= 3; i++) { // 创建Excel文件 File file = new File("excel_" + i + ".xlsx"); OutputStream out = new FileOutputStream(file); // EasyExcel导出数据 ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); Table table = new Table(1); List<List<String>> data = new ArrayList<>(); for (int j = 1; j <= 10; j++) { List<String> row = new ArrayList<>(); row.add("Data" + j); data.add(row); } table.setData(data); writer.write0(table, sheet); writer.finish(); // 添加Excel文件到列表中 fileList.add(file); } return fileList; } } ``` 在上面的代码中,我们首先创建了3个Excel文件,然后将它们压缩到一个名为“excel\_files.zip”的压缩中。最后,我们删除了临时的Excel文件。注意,我们使用了Apache Commons Compress库来实现压缩操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值