如何将使用Docxtemplater生成的word文档转换为PDF?

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

大家好,我目前正在使用 Angular.js 开发一个网站,我想根据用户的输入生成一个 Word 文档,效果很好!!

问题是我想让用户预览并将word文档下载为PDF文档 因此我尝试更改 MIME 类型并更改 SaveAs 格式,但它不起作用

我也尝试过使用包将单词更改为 PDF,但到目前为止还没有成功

这里是保存生成的word文档的代码

this.loadFile("/assets/document/Template.docx", function(
  error,
  content
) {
  if (error) {
   console.log("Load file error: ",error) ;
  }
  var zip = new PizZip(content);
  var doc = new Docxtemplater().loadZip(zip);
doc.setData({
  tag: "Hello"
});
try {
   
        doc.render();
      } catch (error) {
       console.log(error)
      }
       var out = doc.getZip().generate({
        type: "blob",
        mimeType:
        //"application/pdf;charset=utf-8"
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
      }); //Output the document using Data-URI

     saveAs(out, "GeneratedDocx.docx");
    });
  }

我仍然无法使用 out 变量使用 docxConverter 或任何其他包进行转换

node.js angular typescript pdf ms-word
2个回答
0
投票

我在使用 docxtemplater 的项目中遇到了类似的问题。以下事情对我有用。我使用 docx-pdf npm 包将其转换为 pdf。 https://www.npmjs.com/package/docx-pdf

    var doc = new Docxtemplater()
    .attachModule(imageModule)
    .loadZip(zip)
    .setData(finalData)
    .render();

  var buffer = await doc.getZip().generate({ type: "nodebuffer" });

  fs.writeFile(outputPath, buffer, function (err, result) {
    if (err) {
      return next(new ErrorHandler(err.response, 401));
    }
  });
  
  docxConverter(outputPath,'./output.pdf',function(err,result){
    if(err){
      console.log(err);
    }
    console.log('result'+result);
  });

转换不是那么准确,但它在很多情况下对我有用。还有一些 API 可用,但它们免费提供次数有限。


0
投票

正如我建议的 在并行线程中,使用

libreoffice-convert
根本不需要保留到磁盘 DOCX 或 PDF 文件。但缺点是你需要在服务机器上安装 libreoffice:

// In your controller or service:

export const exportTextToFile = async (text: string, filetype: string): Promise<Blob> => {
    const exportToFileEndpointUrl = `${API_BASE_URL}/api/export/${filetype}`;
    const response = await axios.post<ArrayBuffer>(exportToFileEndpointUrl, text, {
        responseType: 'arraybuffer',
    });

    return new Blob([response.data]);
};



// In your component:

const getAndDownloadFile = async (filetype: string) => {
        try {
            const blob = await exportTextToFile(text, filetype);
            saveAs(blob, `MyFile.${filetype}`);
        } catch (error) {
            console.error(error);
        }
    };

在 NodeJS 后端应用程序中:

import libre from 'libreoffice-convert';


try {
        const docxBuffer = await generateDocx(...);

        if (filetype === 'pdf') {
            libre.convert(docxBuffer, 'pdf', undefined, (err, pdfBuffer) => {
                if (err) {
                    throw err;
                } else {
                    res.send(pdfBuffer);
                }
            });
        } else if (filetype === 'docx') {
            res.send(docxBuffer);
        }

        logger.info('Sent file buffer to the client', { filetype });
    } catch (error) {
        logger.error('Error during file creation', { filetype, error: error.message });
        res.sendStatus(500);
    }


// Your docxtemplater generator:

import Docxtemplater from 'docxtemplater';

function generateDocx(...): Promise<Buffer> {
    const content = fs.readFileSync(path.resolve(__dirname, 'your-template.docx'), 'binary');

    const zip = new PizZip(content);
    const doc = new Docxtemplater(zip, {
        paragraphLoop: true,
        linebreaks: true,
    });
    doc.render({
       /// your template params
    });

    const buffer = doc.getZip().generate({
        type: 'nodebuffer',
        compression: 'DEFLATE',
    });

    return buffer;
}
© www.soinside.com 2019 - 2024. All rights reserved.