java 程序生成的文件,中文不显示,显示方框等问题,linux 安装中文字体..

本文介绍在CentOS7中解决报表中文乱码及字体不整齐问题的方法,包括安装字体库、添加中文字体的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自
http://blog.youkuaiyun.com/wlwlwlwl015/article/details/51482065

前言

报表中发现有中文乱码和中文字体不整齐(重叠)的情况,或是生成PDF没有中文,或是java生成的报表中文是方框,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效:
这里写图片描述
如上图可以看出,不仅没有中文字体,连字体库都没有,那么接下来就记录一下在Linux CentOS 7中如何安装字体库以及中文字体。

安装字体库

在CentOS 4.x开始用fontconfig来安装字体库,所以输入以下命令即可:

yum -y install fontconfig

当看到下图的提示信息时说明已安装成功:
这里写图片描述

这时在/usr/shared目录就可以看到fonts和fontconfig目录了(之前是没有的):
这里写图片描述

接下来就可以给我们的字体库中添加中文字体了。

添加中文字体

在CentOS中,字体库的存放位置正是上图中看到的fonts目录,所以我们首先要做的就是找到中文字体文件放到该目录下,而中文字体文件在我们的windows系统中就可以找到,打开c盘下的Windows/Fonts目录:
这里写图片描述

如上图,我们只需要将我们需要的字体拷贝出来并上传至linux服务器即可,在这里我选择宋体和黑体(报表中用到了这两种字体),可以看到是两个后缀名为ttf和ttc的文件:
这里写图片描述
在这之前我们还需要新建目录,首先在/usr/share/fonts目录下新建一个目录chinese:
这里写图片描述
然后就是将上面的两个字体上传至/usr/share/fonts/chinese目录下即可:

紧接着需要修改chinese目录的权限:

chmod -R 755 /usr/share/fonts/chinese

接下来需要安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件,输入命令:

yum -y install ttmkfdir

当看到下图的提示信息时说明已安装成功:
这里写图片描述

然后执行ttmkfdir命令即可:

ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir

最后一步就是修改字体配置文件了,首先通过编辑器打开配置文件:

vi /etc/fonts/fonts.conf

可以看到一个Font list,即字体列表,在这里需要把我们添加的中文字体位置加进去:
这里写图片描述
然后输入:wq保存退出,最后别忘了刷新内存中的字体缓存,这样就不用reboot重启了:

fc-cache

这样所有的步骤就算完成了,最后再次通过fc-list看一下字体列表:
这里写图片描述

可以看到已经成功安装上了中文字体,至此安装过程就全部结束,再次查看报表可以发现中文样式和内容均已可以正常显示了。

总结

简单记录一下在CentOS 7中安装字体库以及中文字体的问题,希望对遇到同样问题的同学有所帮助
转自
http://blog.youkuaiyun.com/wlwlwlwl015/article/details/51482065

<think>嗯,用户遇到了Java项目在Linux环境下使用Document.save()方法将Word转PDF时,生成的PDF中文显示方框问题,即使尝试添加字体也没解决。我需要分析可能的原因并提供解决方案。 首先,用户提到已经尝试添加字体,但问题依旧。这说明可能的问题点可能止字体缺失。我需要考虑几个方面: 1. **字体嵌入权限**:某些字体可能有许可证限制,允许嵌入到PDF中。检查使用的字体是否允许嵌入,特别是中文字体如宋体、黑体等。用户可能需要更换为免费可嵌入的字体,比如思源字体(Source Han Sans/Source Han Serif)。 2. **字体路径和加载方式**:在Linux系统中,字体文件路径可能和Windows同。用户是否正确指定了字体文件的绝对路径?是否将字体安装到了系统字体目录(如`/usr/share/fonts/`)?或者是否在代码中正确配置了字体目录? 3. **文档处理库的字体缓存**:如果之前运行过应用,字体缓存可能导致新添加的字体未被识别。可能需要清除缓存或重启应用,让库重新加载字体。 4. **编码和字体选择**:检查文档中是否正确指定了中文字体名称。比如,代码中是否使用了正确的字体Family名称,如“SimSun”对应宋体,可能需要准确匹配。 5. **PDF生成库的兼容性**:使用的库如Apache POI或docx4j可能存在版本问题,或者对Linux环境的支持足。确认库的版本是否为最新,或者是否有已知的中文支持问题。 接下来,具体步骤建议: - **确认字体嵌入权限**:使用工具查看生成的PDF属性,检查所需字体是否成功嵌入。如果未嵌入,可能需要更换字体。 - **正确安装字体到系统**:在Linux上,将字体文件复制到`/usr/share/fonts/`目录,运行`fc-cache -fv`更新字体缓存,确保系统识别。 - **代码中显式加载字体**:在Java代码中,使用`FontFactory.register()`方法注册字体路径,确保库能够找到并加载字体。 - **指定文档使用的字体**:在创建文档元素时,明确设置字体,例如`Font font = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", BaseFont.IDENTITY_H);`。 - **检查库的日志或错误输出**:查看是否有关于字体加载失败的警告或错误信息,帮助定位问题。 可能的示例代码调整: 确保在转换前正确注册字体,并设置编码: ```java // 注册字体路径 FontFactory.register("/usr/share/fonts/simhei.ttf", "SimHei"); // 创建字体,指定编码 Font chineseFont = FontFactory.getFont("SimHei", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); // 在文档中使用该字体 Paragraph paragraph = new Paragraph("中文内容", chineseFont); document.add(paragraph); ``` 此外,用户可能需要检查生成PDF的查看器是否支持嵌入的字体,或者尝试同的查看器排除显示问题。 总结可能原因后,分步骤给出解决方案,并提醒用户注意系统环境差异和库的配置细节,应该能解决方框显示问题。</think>在Linux环境下使用Java库(如Apache POI、docx4j或iText)将Word转PDF时,中文显示方框的根本原因是**未正确加载或嵌入中文字体**。以下是逐步排查和解决方案: --- ### **一、核心原因分析** 1. **系统缺少中文字体** Linux默认未安装中文字体(如宋体、黑体),需手动安装并配置。 2. **字体未正确嵌入PDF** 即使代码中设置了字体,若字体文件未嵌入PDF或权限允许嵌入,仍会显示方框。 3. **编码匹配** 文档内容编码(如UTF-8)与字体编码(如Identity-H)一致,导致字符映射失败。 --- ### **二、解决方案步骤** #### **步骤1:安装中文字体Linux系统** 1. 下载免费中文字体(如[思源字体](https://github.com/adobe-fonts)): ```bash wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansSC.zip unzip SourceHanSansSC.zip -d /usr/share/fonts/source-han-sans/ ``` 2. 刷新字体缓存: ```bash fc-cache -fv ``` 3. 验证安装: ```bash fc-list :lang=zh ``` 应输出类似:`/usr/share/fonts/source-han-sans/SourceHanSansSC-Regular.otf: Source Han Sans SC,思源黑体 CN:style=Regular` --- #### **步骤2:代码中显式加载字体** 以 **iText** 为例,需注册字体路径并指定编码: ```java import com.itextpdf.text.Font; import com.itextpdf.text.pdf.BaseFont; // 1. 注册字体文件(绝对路径) BaseFont baseFont = BaseFont.createFont( "/usr/share/fonts/source-han-sans/SourceHanSansSC-Regular.otf", BaseFont.IDENTITY_H, // 使用Unicode编码 BaseFont.EMBEDDED // 必须嵌入字体 ); // 2. 创建中文字体对象 Font chineseFont = new Font(baseFont, 12); // 3. 在文档中使用字体 Document document = new Document(); document.open(); document.add(new Paragraph("你好,世界!", chineseFont)); document.close(); ``` --- #### **步骤3:检查字体嵌入权限** - 某些商业字体(如微软雅黑)禁止嵌入PDF,需替换为开源字体(如思源黑体)。 - 生成PDF后,用Adobe Acrobat验证字体是否嵌入: 1. 打开PDF → 文件 → 属性 → 字体 2. 检查字体名称旁是否有`(嵌入子集)`字样。 --- #### **步骤4:处理Apache POI或docx4j的字体配置** 若使用 **Apache POI** 或 **docx4j**: 1. 在JVM启动参数中指定字体目录: ```bash java -Djava.awt.headless=true -Djava.awt.fonts=/usr/share/fonts/ ``` 2. 代码中强制指定字体: ```java // docx4j示例 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("input.docx")); wordMLPackage.setFontMapper(new IdentityPlusMapper()); ((IdentityPlusMapper) wordMLPackage.getFontMapper()).put("宋体", PhysicalFonts.get("SimSun")); ``` --- ### **三、常见问题排查** 1. **日志报错`Font not found`** 检查字体路径是否正确,Linux需区分大小写。 2. **PDF仍显示方框** 确保`BaseFont.createFont()`参数中设置了`BaseFont.IDENTITY_H`和`BaseFont.EMBEDDED`。 3. **Windows正常但Linux异常** 绝对路径替换为Linux格式(如`/opt/fonts/xxx.ttf`),避免`C:\Windows\Fonts`。 --- ### **四、推荐字体列表** | 字体名称 | 下载来源 | |----------------|----------------------------------------| | 思源黑体 | [GitHub](https://github.com/adobe-fonts/source-han-sans) | | 思源宋体 | [GitHub](https://github.com/adobe-fonts/source-han-serif) | | 文泉驿微米黑 | [官方网站](http://wenq.org/wqy2/index.cgi) | 通过以上步骤,90%的中文方框问题可解决。如仍异常,建议检查PDF生成库的版本兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值