Linux 伺服器預設無中文字體,導致 PDFBox、iText、JFreeChart 等產出的 PDF/圖片中文變□亂碼。本文提供 CentOS 完整字體安裝流程,含建立字體目錄、軟連結至 JRE fallback、字體快取更新與驗證步驟。
mkdir -p /usr/share/fonts/chineses/TrueType
# 將 .ttf/.ttc 字體檔上傳至上述目錄
# 例:wget https://example.com/msyh.ttf -O /usr/share/fonts/chineses/TrueType/msyh.ttf
mkdir -p /usr/java/jdk1.8.0_60/jre/lib/fonts/fallback
cd /usr/java/jdk1.8.0_60/jre/lib/fonts/fallback
路徑請依實際 JDK 安裝位置調整(java -XshowSettings:properties -version 2>&1 | grep java.home 查詢)。
ln -s /usr/share/fonts/chineses/TrueType/msyh.ttf
ln -s /usr/share/fonts/chineses/TrueType/simhei.ttf
# ... 其他字體
yum install -y mkfontscale fontconfig
mkfontscale
mkfontdir
fc-cache -fv
fc-list | grep -i "microsoft\|wenquan\|noto\|source han"
# 應列出剛安裝的字體完整名稱,如:
# /usr/share/fonts/chineses/TrueType/msyh.ttf: Microsoft YaHei:style=Regular
FROM openjdk:8-jdk
RUN mkdir -p /usr/share/fonts/chineses/TrueType \
&& curl -o /usr/share/fonts/chineses/TrueType/msyh.ttf https://example.com/msyh.ttf \
&& mkdir -p /usr/java/openjdk-8/jre/lib/fonts/fallback \
&& ln -s /usr/share/fonts/chineses/TrueType/msyh.ttf /usr/java/openjdk-8/jre/lib/fonts/fallback/ \
&& yum install -y mkfontscale fontconfig \
&& mkfontscale && mkfontdir && fc-cache -fv
| 現象 | 可能原因 | 解決 |
|---|---|---|
| fc-list 無輸出 | 字體檔損壞/非 TTF 格式 | 用 file xxx.ttf 驗證,重新下載 |
| PDF 仍有 □ | 程式碼未指定字體 / 字體名稱錯誤 | PDFBox: PDType0Font.load(doc, new File("...")) 明確載入 |
| JDK 路徑不同 | OpenJDK / Oracle JDK / 自訂安裝 | 用 java -XshowSettings:properties 確認 java.home |
SourceHanSansCN(OTF/TTF,完整字符集)wqy-microhei(yum install wqy-microhei-fonts 即可)import java.awt.GraphicsEnvironment;
public class FontTest {
public static void main(String[] args) {
String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for (String f : fonts) if (f.contains("YaHei") || f.contains("WenQuan") || f.contains("Noto")) System.out.println(f);
}
}