云函数中将Docxtemplater生成的Docx转PDF并通过Nodemailer发送
解决方案:将Docx Buffer转换为PDF用于邮件附件
针对你用docxtemplater生成docx buffer后转PDF的需求,以下几个工具和方案可解决问题,避免出现空白PDF的情况:
1. 使用libreoffice-convert直接转换(推荐)
这个工具基于LibreOffice,能直接将docx buffer转换为PDF,兼容性好,支持复杂格式的docx文档。
步骤:
- 安装依赖:
npm install libreoffice-convert
- 在现有代码基础上添加转换逻辑:
const libre = require('libreoffice-convert'); const util = require('util'); const convertAsync = util.promisify(libre.convert); // 接你已有的代码,拿到contentBuffer之后: try { const pdfBuffer = await convertAsync(contentBuffer, '.pdf', undefined); // pdfBuffer即为可用于邮件附件的PDF数据 } catch (err) { console.error('转换PDF失败:', err); errorHandler(err); }
注意事项:
云函数环境需要预装LibreOffice。比如Firebase云函数可通过自定义层或使用包含LibreOffice的基础镜像部署,否则会出现找不到LibreOffice的错误。
2. 先提取Docx内容再用PDFmake渲染(解决之前空白问题)
你之前用PDFmake生成空白PDF,大概率是因为直接传入了docx buffer而非可识别的内容。可以先用mammoth提取docx的HTML或文本,再用PDFmake渲染:
- 安装依赖:
npm install mammoth pdfmake
- 代码示例:
const mammoth = require('mammoth'); const pdfMake = require('pdfmake'); // 提取docx内容为HTML const result = await mammoth.convertToHtml({ buffer: contentBuffer }); const htmlContent = result.value; // 配置PDFmake字体(按需调整) const fonts = { Roboto: { normal: 'Roboto-Regular.ttf', bold: 'Roboto-Bold.ttf', italics: 'Roboto-Italic.ttf', bolditalics: 'Roboto-BoldItalic.ttf' } }; const printer = new pdfMake(fonts); // 生成PDF定义(复杂格式需额外调整) const docDefinition = { content: [ { html: htmlContent } ] }; const pdfBuffer = await printer.createPdfKitDocument(docDefinition).toBuffer();
这个方案适合不需要保留复杂格式的场景,若你的docx模板格式复杂,仍推荐第一种方案。
3. 使用docx-pdf(简化版)
这个包封装了LibreOffice的转换逻辑,用法更简洁,但同样需要环境支持LibreOffice:
- 安装依赖:
npm install docx-pdf
- 代码示例:
const docxConverter = require('docx-pdf'); const util = require('util'); const convertDocxToPdf = util.promisify(docxConverter); const pdfBuffer = await convertDocxToPdf(contentBuffer);
内容的提问来源于stack exchange,提问作者Deji James
相关产品推荐
相关产品推荐

