You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jszip和pdfmake生成并下载包含PDF文件的zip压缩包?

问题根因

  • 核心是异步执行顺序错误:ddPdf.getBlob() 是异步回调方法,你调用 zip.generateAsync 生成压缩包的时候,所有PDF的Blob还没返回、也没被添加到压缩目录里,只有同步创建的txt文件被成功加入压缩包。
  • 次要问题:循环内重复创建examples文件夹属于冗余操作,虽不会报错但无意义。

修复后的代码

// 先创建examples文件夹,避免循环内重复创建
const examples = zip.folder("examples");
// 收集所有PDF生成任务的Promise
const pdfTasks = [];

for (let i = 0; i < 3; i++) {
  const dd = {
    content: [
      "First paragraph",
      "Another paragraph, this time a little bit longer to make sure, this line will be divided into at least two lines"
    ]
  };

  const ddPdf = this.$pdfmake.createPdf(dd);
  examples.file(`Hello${i}.txt`, "Hello World\n");
  // 把回调方法包装为Promise
  pdfTasks.push(new Promise(resolve => {
    ddPdf.getBlob(blob => {
      examples.file(
        `example${i}.pdf`,
        blob,
        { binary: true }
      );
      resolve();
    });
  }));
}

// 等待所有PDF生成并添加到压缩目录后,再生成压缩包下载
Promise.all(pdfTasks).then(() => {
  zip.generateAsync({ type: "blob" }).then(function(content) {
    FileSaver.saveAs(content, "example.zip");
  });
});

关键修改说明

  • 把getBlob的回调包装成Promise,统一存入数组,使用Promise.all等待所有PDF生成、添加到压缩包的操作全部完成后,再执行zip.generateAsync生成最终压缩包
  • 把examples文件夹的创建移到循环外,减少冗余操作

内容的提问来源于stack exchange,提问作者Danstadje

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:27:00