首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

CentOS 安裝中文字體讓 Java/JVM 正確顯示中文(PDFBox、iText 通用)

     編輯:Java 相關知識

Linux 伺服器預設無中文字體,導致 PDFBox、iText、JFreeChart 等產出的 PDF/圖片中文變□亂碼。本文提供 CentOS 完整字體安裝流程,含建立字體目錄、軟連結至 JRE fallback、字體快取更新與驗證步驟。

操作步驟

1. 建立系統字體目錄並上傳字體

mkdir -p /usr/share/fonts/chineses/TrueType
# 將 .ttf/.ttc 字體檔上傳至上述目錄
# 例:wget https://example.com/msyh.ttf -O /usr/share/fonts/chineses/TrueType/msyh.ttf

2. 建立 JRE fallback 字體目錄

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 查詢)。

3. 建立字體軟連結(每個字體檔皆需建立)

ln -s /usr/share/fonts/chineses/TrueType/msyh.ttf
ln -s /usr/share/fonts/chineses/TrueType/simhei.ttf
# ... 其他字體

4. 安裝字體工具並建立快取

yum install -y mkfontscale fontconfig
mkfontscale
mkfontdir
fc-cache -fv

5. 驗證字體是否被 JVM 識別

fc-list | grep -i "microsoft\|wenquan\|noto\|source han"
# 應列出剛安裝的字體完整名稱,如:
# /usr/share/fonts/chineses/TrueType/msyh.ttf: Microsoft YaHei:style=Regular

Dockerfile 一鍵安裝範例

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 即可)
  • Noto Sans CJK:Google 推出,字符覆蓋極廣

驗證 Java 程式碼片段

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);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved