You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay7.2生成PDF重音字符显示异常(Linux环境)求助

Linux环境下iText生成PDF重音字符显示异常的解决办法

问题根源

本地Windows环境正常,部署到Linux后重音字符(如é)乱码,核心原因是:你代码里用的Font.TIMES_ROMAN依赖系统预装的Times New Roman字体,但Linux默认没有这个Windows字体,iText会自动 fallback 到系统默认字体,而该字体不支持法语这类带重音的Unicode字符,最终导致显示异常。

解决方案

方案1:嵌入自定义字体文件(推荐)

把支持全Unicode字符的字体文件(比如开源的Liberation Serif、或者从Windows提取的Times New Roman.ttf)放到项目的资源目录,然后修改代码加载并嵌入字体:

Document document = new Document(PageSize.A4);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, baos);

// 注册并加载自定义字体,确保路径正确
FontFactory.register("/your-project-resources/fonts/LiberationSerif-Bold.ttf", "CustomBoldFont");
// 使用IDENTITY_H编码支持全Unicode,同时嵌入字体到PDF
Font font_titre = new Font(FontFactory.getFont("CustomBoldFont", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, coul_bleu));
Phrase ph1 = new Phrase("Activités", font_titre);

这样生成的PDF会把字体嵌入进去,不管在什么系统打开都能正确显示重音字符。

方案2:使用Linux预装的支持重音的字体

Linux系统一般预装了DejaVu、Liberation系列字体,这些字体支持Unicode重音字符,可以直接调用:

Font font_titre = new Font(FontFactory.getFont("DejaVu Serif", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 14, Font.BOLD, coul_bleu));

如果系统没装对应字体,需要先安装:

  • Debian/Ubuntu:sudo apt install fonts-dejavu
  • CentOS/RHEL:sudo yum install dejavu-serif-fonts

关键注意点

  • 不要依赖系统默认字体,跨环境差异极大
  • 必须指定BaseFont.IDENTITY_H编码,确保支持所有Unicode字符
  • 开启BaseFont.EMBEDDED把字体嵌入PDF,避免目标环境缺少字体导致显示异常

内容的提问来源于stack exchange,提问作者Med Riad SEBTI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:48:14