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
相关产品推荐
相关产品推荐

