我们可以使用docxtemplater渲染并生成多个.docx文件并将它们输出为一个.zip文件吗?

问题描述 投票:0回答:1

我在使用 docxtemplater 库创建多个生成 .docx 文档的函数时没有遇到任何问题。

但是,下面我创建了两个“docxtemplater”实例,渲染并生成了这两个文件,然后将它们添加到 Pizzip 实例中。最后,我尝试将此实例保存为 zip 文件。

该函数正在运行,输出是一个包含两个 .docx 文档的 zip 文件。不幸的是,这些文件将无法打开,因为“它们无效”。

import Docxtemplater from "docxtemplater";
import PizZip from "pizzip";
import PizZipUtils from "pizzip/utils";
import { saveAs } from "file-saver";
import expressionParser from "docxtemplater/expressions";
import JSZip from "jszip";

const storage = getStorage();



//New zip instance
const outputZip = new PizZip();
function loadFile(url, callback) {
  PizZipUtils.getBinaryContent(url, callback);
}

export const renderRelianceForms = async () => {
  try {
    await getDownloadURL(ref(storage, "RS1PD.docx")).then((url) => {
      loadFile(url, function (error, content) {
        if (error) {
          throw error;
        }

        const zip = new PizZip(content);
        const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true, parser: expressionParser });

        doc.render({
        //   date: referral?.creation_date.toDate().toLocaleDateString(),
        });
        const out = doc.getZip().generate({
          type: "arraybuffer",
          compression: "DEFLATE",
          mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        });

        outputZip.file("Reliance Section 1 - Personal Details.docx", out, { base64: true });
        console.log("success", out);
      });
    });

    await getDownloadURL(ref(storage, "RS1MP.docx")).then((url) => {
      loadFile(url, function (error, content) {
        if (error) {
          throw error;
        }

        const zip = new PizZip(content);
        const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true, parser: expressionParser });
        doc.render({
        //   date: referral?.creation_date.toDate().toLocaleDateString(),
        });
        const out = doc.getZip().generate({
          type: "arraybuffer",
          compression: "DEFLATE",
          mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        });

        outputZip.file("Reliance Section 1 - Missing Person Form.docx", out, { base64: true });
        console.log("success", out);
      });
    });

    //OUTZIP
    const output = outputZip.generate({
      type: "blob",
      compression: "DEFLATE",
      mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    });

    console.log(outputZip);
    saveAs(output, "Reliance.zip");
  } catch (err) {
    console.error(err);
  }
};

我已经使用了这个问题的答案中的代码,直到我尝试打开新保存的文件为止: 如何创建包含“docxtemplater”生成的多个 docx 文件的 zip 文件?

并且还从下面这个问题进行了研究:我尝试在没有参数的情况下生成().docx和最终输出(.zip文件),甚至包含{base64:true}也无济于事。 如何从 docxtemplater.js 输出 docx 以用于 jszip 中的输入

filesaver.js docxtemplater pizzip
1个回答
0
投票

我已经解决了这个问题。

如果您遵循以下问题的答案并进行链接下面提到的更改,则渲染多个 docx 文件并将它们保存到一个 .zip 文件中的以下情况将起作用:

如何创建包含“docxtemplater”生成的多个 docx 文件的 zip 文件?

  1. 在所有实例中以及最终输出 zip 中从 .generate() 中删除“压缩:DEFLATE”选项。

  2. 将 JSZip 更改为 Pizzip。

© www.soinside.com 2019 - 2024. All rights reserved.