夜雨聆风学习资料网

ARTICLE · 1033614

LibreOffice 转 PDF 全是乱码?你缺的不是 Java,是中文字体

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 要把文档里的字符画出来,如果系统里一个中文字体都没有,它找不到字形,就只能画方框、或者落到默认的拉丁字体上——于是中文全乱。

根因链条就一条:

text
系统缺 CJK 中文字体 → LibreOffice 找不到字形 → 转出的 PDF 中文变成方框/乱码

而 Java 根本不在这条链上。纯 Office 转 PDF 用不到 Java,那是 Base 数据库、宏脚本才需要的东西。

安装流程

整体顺序见下图,乱码修正在「判断」这一步分叉出来:

1. 下载

从官网选 rpm + x86_64 + 简体中文,拿到对应的安装包:

text
https://zh-cn.libreoffice.org/download/libreoffice/?type=rpm-x86_64&version=26.2.6&lang=zh-CN

直接下载下来的文件名长这样:

bash
LibreOffice_26.2.6_Linux_x86-64_rpm.tar.gz
⚠️ 包名变了

老版本是 .tar.xz,24.x 之后的 rpm 包统一是 .tar.gz。别照着旧命令里的 .tar.xz 来解压,会找不到文件。

2. 解压

bash
tar -xf LibreOffice_26.2.6_Linux_x86-64_rpm.tar.gz

解压后得到 LibreOffice_26.2.6.2_Linux_x86-64_rpm/ 目录,进去能看到 RPMS/ 子目录。

3. 本地安装

进入 RPMS 目录,一次性装掉里面所有 rpm:

bash
cd LibreOffice_26.2.6.2_Linux_x86-64_rpm/RPMS
dnf localinstall -y ./*.rpm
✏️ yum 还是 dnf

RHEL 8 / 9、Rocky、Alma、CentOS Stream 用 dnf localinstall ./*.rpm;老 CentOS 7 用 yum localinstall ./*.rpm,二者语法一致,只是命令名不同。

装完确认一下:

bash
soffice --version

会打印类似 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:

bash
# RHEL 8 / 9
dnf install -y java-17-openjdk-headless
# CentOS 7
yum install -y java-11-openjdk-headless

-headless 不带图形库,服务器环境首选。可以先用 soffice --headless --convert-to pdf 试转换一次,转成功就说明你根本不需要 Java。

修复中文乱码(关键一步)

转换能跑通,但中文是方框/乱码——进入乱码修复分支。

1. 装字体管理工具

bash
dnf install -y fontconfig
✏️ 老系统差异

原笔记里的 cups-libs 是给打印用的,做纯转换可以不用。ttmkfdir 是 EL6/7 时代的老工具,EL8 之后仓库里已经移除了,不需要再装,也用不上了。

2. 装中文字体,两条路选一

路 A:直接装发行版自带的 CJK 字体(推荐,最省事)

bash
# RHEL 8 / 9 / Rocky / Alma —— Noto CJK 是全功能免版权字体
dnf install -y google-noto-sans-cjk-ttc-fonts
# CentOS 7 —— 文泉驿微米黑
yum install -y wqy-microhei-fonts cjkuni-uming-fonts

路 B:拷贝 Windows 的中文字体(需要字体文件可用)

把 Windows 机器 C:\Windows\Fonts 里的宋体(simsun.ttc)、黑体(simhei.ttf)拷到服务器:

bash
mkdir -p /usr/share/fonts/chinese
cp simsun.ttc simhei.ttf /usr/share/fonts/chinese/
chmod 644 /usr/share/fonts/chinese/*
⚠️ 授权问题

宋体、黑体是微软版权字体,只在你有合法 Windows 授权的前提下用于内部服务器才安全。企业生产环境优先用 Noto CJK,无版权风险。

3. 刷新字体缓存并验证

这是原流程里容易漏掉的一步——字体文件放进去,不刷新缓存,LibreOffice 照样认不到

bash
fc-cache -fv
fc-list :lang=zh

fc-list :lang=zh 能列出字体名,就说明系统已经认到中文字体了:

text
/usr/share/fonts/google-noto-sans-cjk-ttc/NotoSansCJK-Regular.ttc: Noto Sans CJK SC:style=Regular

无头转换命令

字体就绪后,用 --headless 让 LibreOffice 不开界面直接转换:

bash
soffice --headless --convert-to pdf /path/to/input.docx --outdir /path/to/output

看完整参数:

bash
soffice --help

几个常用形态:

bash
# 单个文件,输出到指定目录
soffice --headless --convert-to pdf report.docx --outdir ./pdf
# 通配符批量转(当前目录所有 docx)
soffice --headless --convert-to pdf ./*.docx --outdir ./pdf
# 指定输出过滤器(writer_pdf_Export 是 Word/Writer 转 PDF 的标准过滤器)
soffice --headless --convert-to pdf:writer_pdf_Export report.docx --outdir ./pdf
💡 生产环境建议加 `--norestore`

服务器上并行转换多份文件时,加 --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.xzyum install jrettmkfdir 这些都是 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)

相关学习资料