在完全离线的Linux服务器上部署LibreOffice,就像在没有说明书的情况下组装一台精密仪器。我最近在给某金融机构部署文档处理系统时就遇到了这个难题——他们的生产服务器严格隔离外网,但业务又急需文档转换功能。经过三天反复尝试,终于摸清了整套流程,现在把踩坑经验完整分享给大家。
离线部署最大的难点在于依赖树的完整获取。LibreOffice运行时需要Java环境、图形库、字体库等数十个组件,这些组件之间还存在复杂的版本依赖关系。比如我们第一次安装时就遇到了经典的libSM.so.6缺失问题,后来发现这个库又依赖libICE.so.6,像俄罗斯套娃一样层层嵌套。
我推荐在联网环境中用yum-utils工具生成完整依赖清单:
bash复制# 在联网机器上执行
repoquery --requires --resolve libreoffice | sort -u > libreoffice_deps.txt
这个命令会输出所有直接和间接依赖的rpm包名。实际操作时我发现列表可能不全,建议额外检查这些关键包:
把这些rpm包下载到本地后,用createrepo命令构建本地仓库:
bash复制mkdir /opt/offline_repo
createrepo /opt/offline_repo
然后在目标机器的/etc/yum.repos.d/下创建本地repo文件,这样后续安装时就能自动解决依赖关系。
虽然新版LibreOffice对Java的依赖有所降低,但处理复杂文档时仍然需要。我的经验是准备JDK和JRE两个包:
解压后要特别注意环境变量配置。有次我在/etc/profile里配置后不生效,后来发现是~/.bashrc里的PATH覆盖了全局设置。稳妥的做法是在/etc/profile.d/下新建java.sh:
bash复制export JAVA_HOME=/usr/local/jdk1.8.0_381
export PATH=$JAVA_HOME/bin:$PATH
官网提供了三种打包格式:
我推荐使用RPM包,虽然体积大些(约300MB),但包含完整的桌面集成组件。曾经有客户坚持用TAR包,结果发现缺少了libreoffice-headless服务,无法进行后台文档转换。
安装命令看似简单:
bash复制cd LibreOffice_7.6.4_Linux_x86-64_rpm/RPMS
yum --disablerepo=* --enablerepo=local install *.rpm
但这里有个坑——某些子包可能存在冲突。比如libreoffice-ure和libreoffice-ure-common的版本必须严格一致。遇到安装失败时,可以尝试rpm -ivh --nodeps强制安装,但这是最后手段。
最经典的libSM.so.6缺失问题,其实需要四个包:
bash复制libSM-1.2.3-1.el8.x86_64.rpm
libICE-1.0.10-1.el8.x86_64.rpm
libX11-1.6.8-5.el8.x86_64.rpm
libXext-1.3.4-1.el8.x86_64.rpm
我整理了一个依赖关系检查脚本:
bash复制#!/bin/bash
for lib in libSM.so.6 libICE.so.6 libX11.so.6; do
if ! ldconfig -p | grep -q $lib; then
echo "[ERROR] Missing $lib"
fi
done
中文乱码问题困扰了我整整一天。后来发现不仅需要安装字体,还要重建字体缓存:
bash复制# 安装基础工具
yum install -y fontconfig mkfontscale
# 拷贝字体到系统目录
cp msyh.ttf /usr/share/fonts/chinese/
# 重建缓存
cd /usr/share/fonts/chinese/
mkfontscale
mkfontdir
fc-cache -fv
测试时发现有些PDF仍然显示方框,原因是LibreOffice默认使用Liberation字体。需要在/opt/libreoffice7.6/share/registry/modules/org/openoffice/Office/Common.xcu中修改默认字体配置。
如果没有Windows字体,可以考虑开源字体:
实测下来,思源黑体的排版效果最接近微软雅黑。安装方法:
bash复制yum install -y google-noto-sans-cjk-fonts
我习惯用这个命令测试核心转换功能:
bash复制soffice --headless --convert-to pdf test.docx --outdir /tmp
对于批量转换,建议加上--norestore参数避免内存泄漏:
bash复制find /var/docs -name "*.docx" -exec soffice --headless --norestore --convert-to pdf {} --outdir /output \;
这个困扰很多人的问题,其实可以通过调整页面样式解决:
unoconv命令获取文档信息/opt/libreoffice7.6/program/soffice.cfg<style:style style:name="Wrapped" style:family="paragraph">配置项更彻底的办法是在转换时指定页面宽度:
bash复制soffice --headless --convert-to pdf:"writer_pdf_Export:{\"PageWidth\":10000}" long_text.xlsx
在金融行业项目里,我们最终采用了这样的架构:
关键配置参数:
bash复制# 限制内存使用
export OOO_DISABLE_RECOVERY=1
export SAL_USE_VCLPLUGIN=gen
对于高并发场景,建议启动多个实例:
bash复制for port in {8100..8103}; do
soffice --headless --accept="socket,host=0.0.0.0,port=$port;urp;" &
done