当前位置: 首页 > 工具软件 > jszip > 使用案例 >

JSZip解压PDF文件并批量下载

彭浩穰
2023-12-01

JSzip解压PDF文件并批量下载

因需要解压PDF文件并且实现批量下载,但网上找到的基本都是图片的解压和下载,所以参考图片的解压修改了一下。
用到了jszip,jszip-utils,file-saver这三个依赖

下面进入正题

实现zip文件的解压并打包

async unZipHandle(arr) {
	// arr为需要解压的数组
	let zip = new JSZip();
 	let promises = []; // 存放解压的文件
 	let that = this;
 	// 这里用await就是为了改成同步,需要等数据处理完才进行下一步
 	await arr.forEach((item) => {
        let promise = that
          .getUrlBuffer(item)
          .then((pdf) => {
            // getUrlBuffer这里是把url解压转化成文件
            for (let key in pdf.files) {
              // 判断是否是目录
              if (!pdf.files[key].dir) {
                if (/\.(pdf)$/.test(pdf.files[key].name)) {
                // 这里判断是pdf文件,其他文件的话,换个格式
                  return pdf
                    .file(pdf.files[key].name)
                    .async("ArrayBuffer")
                    .then((data) => {
						// 把文件转化为buffer
                      // this.arrayBufferToBlob(data);这个是因为pdf需要展示,所以我这边把buffer转化成blob文件会得到个url,方便用来展示。后面会补充这个方法
                      // return出buffer生成的文件
                      return zip.file(pdf.files[key].name, data, {
                        binary: true,
                      });
                    });
                }
              }
            }
            // zip.file("测试", pdf, { binary: true });
          });
          // 将循环得到的所有promise存到一个数组里面
        promises.push(promise);
      });
      Promise.all(promises) // this.policyNo
        .then((res) => {
        	// 这里就简单了,当所有promise执行完之后,打包下载
          zip
            .generateAsync({
              type: "blob",
            })
            .then((content) => {
            	// zipName这个是压缩包名称,可以自己定义
               FileSaver.saveAs(content, zipName);
            });
        });
}
 

解压方法内的方法补充

zip解压成源文件的方法

getUrlBuffer(url) {
// zip解压成源文件的方法
      return new JSZip.external.Promise(function (resolve, reject) {
        JSZipUtils.getBinaryContent(url, function (err, data) {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      }).then(function (data) {
        return JSZip.loadAsync(data);
      });
     }

将arrayBuffer转化成blob

 arrayBufferToBlob(arrayBuffer) {	// 为了得到文件临时的url
      return URL.createObjectURL(
        new Blob([arrayBuffer], { type: "application/pdf" }) // 不加type会乱码
      );
    },

上面的解压方法内包含了文件的解压,转化arrayBuffer以及Blob(转Blob是因为临时展示文件不需要的同学可以忽略)循环解压一定要改成同步,不然数据处理会有问题。

喜欢的同学,可以点个赞再走,谢谢了!

 类似资料: