在Linux环境中,如何使用docker进行word文档转换pdf?

267 阅读1分钟

要件一览

  • 开源工具:libreoffice
  • sh脚本
  • 字体
  • docker & docker-compose

编写Dockerfile.openoffice

FROM ubuntu:20.04

# 安装依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    libreoffice \
    inotify-tools \
    default-jre \
    libreoffice-java-common \
    fonts-wqy-zenhei \
    fonts-noto-cjk \
    fontconfig \
    openjdk-11-jdk && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 设置 JAVA_HOME 环境变量
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
ENV PATH=$JAVA_HOME/bin:$PATH

# 拷贝宋体和仿宋字体文件
COPY ./fonts/SimSun.ttf /usr/share/fonts/truetype/
COPY ./fonts/FangSong.ttf /usr/share/fonts/truetype/

# 更新字体缓存
RUN fc-cache -fv

# 设置工作目录
WORKDIR /usr/src/app/

# 创建 logs 目录 
RUN mkdir -p /usr/src/app/logs

# 复制监测脚本文件
COPY monitor.sh /usr/src/app/monitor.sh
RUN chmod +x /usr/src/app/monitor.sh

# 启动 LibreOffice 并运行监测脚本
CMD ["bash", "-c", "libreoffice --headless --accept='socket,host=0.0.0.0,port=8100,tcpNoDelay=1;http;StarOffice.ServiceManager' --nofirststartwizard & /usr/src/app/monitor.sh & tail -f /usr/src/app/logs/monitor.log"]

字体

SimSun.ttf

Windows11中的 仿宋 常规(simfang.ttf)

sh脚本

#!/bin/bash

LOG_FILE="/usr/src/app/logs/monitor.log"  # 定义日志文件路径
MONITOR_DIR="/usr/src/app/files"  # 定义监视的目录

echo "开始监控脚本" >> "$LOG_FILE"  # 开始脚本并记录日志

while true; do
    for FILE in "$MONITOR_DIR"/*.docx; do
        if [[ -f "$FILE" ]]; then  # 如果找到 .docx 文件
            echo "检测到文件: $FILE" >> "$LOG_FILE"  # 记录检测到的文件
            echo "转换 $FILE 为PDF并保留原始字体设置" >> "$LOG_FILE"  # 记录转换开始的信息
            libreoffice --headless --convert-to pdf --outdir "$MONITOR_DIR" "$FILE"  # 转换文件为 PDF
            if [[ $? -eq 0 ]]; then  # 如果转换成功
                echo "转换成功,删除 $FILE" >> "$LOG_FILE"  # 记录成功信息并删除原文件
                rm "$FILE"
            else
                echo "转换失败 $FILE" >> "$LOG_FILE"  # 如果转换失败,记录失败信息
            fi
        fi
    done
    sleep 1  # 每1秒检查一次
done

echo "监控脚本结束" >> "$LOG_FILE"  # 结束脚本并记录日志

DockerCompose

#version : '3.8'
services:
  libreoffice:
    build:
      context: .
      dockerfile: Dockerfile.openoffice
    ports:
      - "8100:8100"
    volumes:
      - type: bind
        source: ../emissionsCertificate
        target: /usr/src/app/files
      - type: bind
        source: ../huayu_docker_data/logs
        target: /usr/src/app/logs
    environment:
      - TZ=Asia/Shanghai
    stdin_open: true
    tty: true