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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:40:22