在 CentOS 上使用 LibreOffice 进行文档转换
一 安装与准备
- 安装 LibreOffice 与无头组件(推荐在最小化服务器环境也安装 headless,以避免 GUI 依赖):
- 命令:sudo yum install -y libreoffice libreoffice-headless
- 可选:安装中文语言包,避免界面或转换时的本地化问题:
- 命令:sudo yum install -y libreoffice-langpacks-zh_CN
- 验证安装与版本:
- 命令:soffice --version 或 libreoffice --version
- 说明:在部分环境中,未安装 headless 可能触发 X11/Display 相关报错,安装 headless 后即可在无界面服务器正常执行转换。
二 命令行转换
- 基本语法:
- 命令:soffice --headless --convert-to <目标后缀> <源文件路径> --outdir <输出目录>
- 常用示例:
- Word 转 PDF:soffice --headless --convert-to pdf /opt/docs/input.docx --outdir /opt/docs/out
- 指定导出过滤器(更可控):soffice --headless --convert-to pdf:writer_pdf_Export /opt/docs/input.docx --outdir /opt/docs/out
- 批量转换:soffice --headless --convert-to pdf /opt/docs/*.docx --outdir /opt/docs/out
- 其他格式:soffice --headless --convert-to docx /opt/docs/input.doc --outdir /opt/docs/out
- 行为要点:
- 输出文件使用源文件名+新扩展名;若目标已存在将直接覆盖;LibreOffice 会自动选择过滤器,也可通过“:过滤器名”显式指定。
三 中文与字体问题
- 现象:转换后的 PDF 中文显示为小方框/乱码。
- 解决步骤:
- 将 Windows 字体(如 simsun.ttc、msyh.ttc 等)复制到字体目录(如 /usr/share/fonts/),或放置于用户目录 ~/.fonts/。
- 设置权限并刷新字体缓存:
- 命令:sudo chmod 644 /usr/share/fonts/*.ttc
- 命令:fc-cache -fv
- 如需界面/语言支持,可安装中文语言包:sudo yum install -y libreoffice-langpacks-zh_CN
- 说明:字体缓存刷新后,LibreOffice 渲染 PDF 时将正确调用中文字体。
四 服务化与程序集成
- 作为服务常驻(UNO 监听,多任务复用,减少启动开销):
- 启动命令:/usr/lib64/libreoffice/program/soffice -headless -accept=“socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard &
- 停止残留进程:ps -ef | grep soffice | awk ‘{print $2}’ | xargs kill -9
- Java 集成(JODConverter + LibreOffice 本地服务):
- 依赖示例(Maven):
- org.jodconverter:jodconverter-local:5.3.0
- org.apache.poi:poi:5.2.5
- 思路:启动本地 OfficeManager(指向上述 UNO 端口或安装路径),使用 LocalConverter 执行 convert 操作。
- Docker 方式(环境隔离、部署简便):
- 拉取镜像:docker pull libreoffice
- 运行示例:docker run -it --rm --name libreoffice libreoffice(实际转换需挂载卷并调用容器内 soffice 命令)。
五 常见问题与排查
- X11/Display 报错:未安装 headless 或缺少显示环境时会出现,安装 libreoffice-headless 并确保以无头模式运行。
- 转换失败或无输出:检查源文件路径、输出目录写权限、磁盘空间;必要时查看 soffice 的标准输出/错误日志定位问题。
- 中文乱码:确认已安装中文字体并执行 fc-cache -fv 刷新缓存;必要时安装中文语言包。
- 批量/并发:频繁启动 soffice 开销较大,建议使用服务化(UNO)或队列+单实例方式控制并发与复用。