docx4j linux上文件内容乱码问题
Posted supingemail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docx4j linux上文件内容乱码问题相关的知识,希望对你有一定的参考价值。
好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。
目录
一、问题
今天遇到一个问题,利用docx4j生成文档程序,在本地的window上都好好的,可是到了linux上之后,直接乱码。开始根本没有想到是因为字体库的原因,直到排查了很多原因之后,才猜测可能是因为字体库,导致了乱码的出现。
二、解决方案
1.找到window是字体库
将windows的C:\\Windows\\Fonts\\下的所有字体库都拷贝出来,放在桌面的fonts文件夹里
2.添加linux字体库
a. 到文件目录
/usr/share/fonts/chinese ,/usr/share/fonts/zh_CN
查找是否有中文字体库,如果没有chinese文件夹或者没有zh_CN文件夹,创建其中的任意一个,比如创建 chinese 文件夹
b.使用xshell 将桌面上的fonts文件夹里的字体库,全部放入 /usr/share/fonts/chinese 文件夹下
c.给文件夹下的文件授权
chmod 775 /usr/share/fonts/chinese
d.建立字体缓存库
cd /usr/share/fonts/chinese
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv
如此几步,就可以使得linux具有和windows一样的字体库了。
3. docx4j 字体库加载
/**
* 设置字体
*
* @param mlPackage
* @throws Exception
*/
private void setFontMapper(WordprocessingMLPackage mlPackage) throws Exception {
Mapper fontMapper = new IdentityPlusMapper();
//加载字体文件(解决linux环境下无中文字体问题)
//PhysicalFonts.addPhysicalFonts("SimSun", new URL("simsun.ttc"));
fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
fontMapper.put("等线", PhysicalFonts.get("SimSun"));
fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
fontMapper.put("宋体扩展",PhysicalFonts.get("simsun-extB"));
fontMapper.put("仿宋_GB2312",PhysicalFonts.get("FangSong_GB2312"));
fontMapper.put("新細明體",PhysicalFonts.get("SimSun"));
//解决宋体(正文)和宋体(标题)的乱码问题
PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));
PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));
//宋体&新宋体
PhysicalFont simsunFont = PhysicalFonts.get("SimSun");
fontMapper.put("SimSun", simsunFont);
//设置字体
mlPackage.setFontMapper(fontMapper);
}
如此一来,就不会有乱码的情况出现了,生成的报告也是正常显示
以上是关于docx4j linux上文件内容乱码问题的主要内容,如果未能解决你的问题,请参考以下文章
我想把一个html的内容转化成为图片,在本地win是好的,但是在linux上总是乱码