docx4j linux上文件内容乱码问题

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。

目录

一、问题

二、解决方案

1.找到window是字体库

2.添加linux字体库

3. docx4j 字体库加载


一、问题

今天遇到一个问题,利用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);
	}

如此一来,就不会有乱码的情况出现了,生成的报告也是正常显示

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值