ARTICLE · 1033614
LibreOffice 转 PDF 全是乱码?你缺的不是 Java,是中文字体
LibreOffice 转 PDF 全是乱码?你缺的不是 Java,是中文字体
服务器上转出来的 PDF,下载下来一打开,中文要么变成方框,要么直接变乱码。我的第一反应和大多数人一样:是不是没装 Java?结果 Java 装上了,乱码纹丝不动。后来才发现,坑根本不在 Java,在字体。
这篇文章讲两件事:怎么在 rpm 系的 Linux 上装 LibreOffice 并用无头模式把 Office 转成 PDF,以及为什么你转出来的中文会乱码、怎么一次性修好。
这份笔记解决什么
一句话:无 GUI 环境下,用 LibreOffice 把 doc / docx / odt 之类的文档批量转成 PDF,并保证中文不乱码。
本文以 LibreOffice 26.2.6(rpm x86_64)为例。24.8 之后官方把版本号从「7.x」改成「年份.月份」格式,所以原来的 7.4 已经过时了。26.2 是保守/企业线,官方维护期到 2026 年 6 月,适合生产环境。
乱码的真正原因
先说结论,免得多走弯路:LibreOffice 渲染中文,靠的是系统字体,不是它自带的字体。 你转 PDF 时,Writer 要把文档里的字符画出来,如果系统里一个中文字体都没有,它找不到字形,就只能画方框、或者落到默认的拉丁字体上——于是中文全乱。
根因链条就一条:
而 Java 根本不在这条链上。纯 Office 转 PDF 用不到 Java,那是 Base 数据库、宏脚本才需要的东西。
安装流程
整体顺序见下图,乱码修正在「判断」这一步分叉出来:

1. 下载
从官网选 rpm + x86_64 + 简体中文,拿到对应的安装包:
直接下载下来的文件名长这样:
老版本是 .tar.xz,24.x 之后的 rpm 包统一是 .tar.gz。别照着旧命令里的 .tar.xz 来解压,会找不到文件。
2. 解压
解压后得到 LibreOffice_26.2.6.2_Linux_x86-64_rpm/ 目录,进去能看到 RPMS/ 子目录。
3. 本地安装
进入 RPMS 目录,一次性装掉里面所有 rpm:
RHEL 8 / 9、Rocky、Alma、CentOS Stream 用 dnf localinstall ./*.rpm;老 CentOS 7 用 yum localinstall ./*.rpm,二者语法一致,只是命令名不同。
装完确认一下:
会打印类似 LibreOffice 26.2.6.2 ... 的版本信息。
老版本装完后可执行文件叫 libreoffice7.4 之类带版本号的名字。新版统一用 soffice(/usr/bin/soffice,是 LibreOffice 的标准启动器,Windows 上也叫这个)。后续所有转换都用 soffice,不要再写 libreoffice7.4。
要不要装 Java
原笔记里写「缺 Java 环境,安装 jre」,这一步在新版里其实可以跳过。
纯 Office 转 PDF 的链路是 C++ 写的过滤器,不碰 Java 虚拟机。真正需要 Java 的只有这几个场景:
用 Base 连数据库 跑带 Java 宏的文档 某些第三方的导出扩展
如果你确实用到了,装的也不是 jre 这个包名——这个包在 EL 系仓库里根本搜不到。要装的是 OpenJDK:
-headless 不带图形库,服务器环境首选。可以先用 soffice --headless --convert-to pdf 试转换一次,转成功就说明你根本不需要 Java。
修复中文乱码(关键一步)
转换能跑通,但中文是方框/乱码——进入乱码修复分支。
1. 装字体管理工具
原笔记里的 cups-libs 是给打印用的,做纯转换可以不用。ttmkfdir 是 EL6/7 时代的老工具,EL8 之后仓库里已经移除了,不需要再装,也用不上了。
2. 装中文字体,两条路选一
路 A:直接装发行版自带的 CJK 字体(推荐,最省事)
路 B:拷贝 Windows 的中文字体(需要字体文件可用)

把 Windows 机器 C:\Windows\Fonts 里的宋体(simsun.ttc)、黑体(simhei.ttf)拷到服务器:
宋体、黑体是微软版权字体,只在你有合法 Windows 授权的前提下用于内部服务器才安全。企业生产环境优先用 Noto CJK,无版权风险。
3. 刷新字体缓存并验证
这是原流程里容易漏掉的一步——字体文件放进去,不刷新缓存,LibreOffice 照样认不到。
fc-list :lang=zh 能列出字体名,就说明系统已经认到中文字体了:
无头转换命令
字体就绪后,用 --headless 让 LibreOffice 不开界面直接转换:
看完整参数:
几个常用形态:
服务器上并行转换多份文件时,加 --norestore 可以避免 LibreOffice 弹出「文档恢复」干扰,也能减少并发时的用户配置文件锁冲突。
常见坑
- Java 不是乱码的原因
。先把字体搞定,别在 Java 上耗时间。转换跑通 = 不需要 Java。 - 字体放进去没刷新缓存
。光 cp文件不够,必须fc-cache -fv,否则fc-list看不到、LibreOffice 也看不到。 - 只装了英文字体
。系统默认的 DejaVu 之类不含中文,转中文文档必乱。要用 CJK 字体(Noto CJK / 文泉驿 / 宋体),不是随便一个字体都行。 - 用 root 跑转换
。某些环境若必须 root 运行,要注意 root 下 LibreOffice 有自己独立的 profile;报 profile相关错时,可以用-env:UserInstallation指定独立的 profile 路径来做隔离。 - 老命令残留
。 libreoffice7.4、.tar.xz、yum install jre、ttmkfdir这些都是 7.x / EL6-7 时代的写法,换了新版本和新系统后逐个失效。
善意忠告
先把最小闭环跑通,再谈优化:装好字体,转一个含中文的 docx,确认中文正常,再去做批量脚本。顺序反了,你会在一堆乱码输出里排查半天,最后发现是字体没刷新。
生产上记住三件事:字体用无版权风险的 Noto CJK;转换命令统一用 soffice --headless 加 --norestore;服务器是 Headless 的,别指望它弹出界面,任何「闪了一下就没反应」的问题,先看是不是走了 GUI 路径。
参考来源
官方文档
- LibreOffice 官方下载页(rpm x86_64)(https://zh-cn.libreoffice.org/download/libreoffice/?type=rpm-x86_64&version=26.2.6&lang=zh-CN)
- LibreOffice 26.2 发行说明(https://wiki.documentfoundation.org/ReleaseNotes/26.2)
- LibreOffice 命令行启动参数(https://help.libreoffice.org/latest/zh-CN/text/shared/guide/start_parameters.html)
- LibreOffice 文件转换过滤器名称(https://help.libreoffice.org/latest/zh-CN/text/shared/guide/convertfilters.html)
其他资料
- Red Hat Enterprise Linux 8 发行说明 · 国际化(简体中文字体包)(https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/8.9_release_notes/internationalization)