如何在Node.js应用的Dockerfile中添加LibreOffice并实现调用
在容器化Node.js应用中集成LibreOffice实现PDF转换
一、修改Dockerfile安装LibreOffice
Alpine镜像可直接通过apk包管理器安装LibreOffice,同时建议搭配基础字体包,避免PDF转换时出现乱码或无字体导致的转换失败问题。修改后的完整Dockerfile如下:
FROM node:16.8.0-alpine # Create app directory WORKDIR /usr/src/app # Install app dependencies and LibreOffice with fonts COPY package*.json ./ # 安装构建依赖、LibreOffice核心包及基础字体 RUN apk add --update python3 make g++ libreoffice ttf-dejavu && rm -rf /var/cache/apk/* RUN npm install # If you are building your code for production #RUN npm ci --only=production # Bundle app source COPY . . RUN npm run build EXPOSE 80:80 CMD [ "node", "build/index.js","STAGING"]
关键说明:
libreoffice:提供文档格式转换的核心功能ttf-dejavu:基础开源字体包,解决无字体环境下的转换异常问题
二、Node.js应用中调用LibreOffice
借助Node.js内置的child_process模块,执行LibreOffice的命令行工具即可完成转换。以下是实用的代码示例:
const { spawn } = require('child_process'); const path = require('path'); // 文档转PDF函数:接收输入文件路径、输出目录 function convertToPdf(inputFilePath, outputDir) { return new Promise((resolve, reject) => { // LibreOffice无头模式转换命令参数 const cmdArgs = [ '--headless', '--convert-to', 'pdf', inputFilePath, '--outdir', outputDir ]; const libreofficeProc = spawn('libreoffice', cmdArgs); // 捕获转换日志 libreofficeProc.stdout.on('data', (data) => { console.log(`转换详情: ${data}`); }); // 捕获错误信息 libreofficeProc.stderr.on('data', (data) => { console.error(`转换警告/错误: ${data}`); }); // 处理进程退出状态 libreofficeProc.on('close', (exitCode) => { if (exitCode === 0) { const pdfFileName = path.basename(inputFilePath, path.extname(inputFilePath)) + '.pdf'; resolve(path.join(outputDir, pdfFileName)); } else { reject(new Error(`转换失败,进程退出码: ${exitCode}`)); } }); }); } // 使用示例 convertToPdf('./uploads/sample.docx', './pdf-output') .then((pdfPath) => console.log(`转换完成,PDF路径: ${pdfPath}`)) .catch((err) => console.error('转换出错:', err));
注意事项:
--headless:让LibreOffice以无界面模式运行,适配容器无桌面环境的场景- 确保Node进程对输入文件路径和输出目录有读写权限,避免转换失败
- 若需转换特殊格式文件(如Excel、PPT),无需修改命令参数,LibreOffice会自动识别源格式
内容的提问来源于stack exchange,提问作者Şahin Ersever
相关产品推荐
相关产品推荐

