docx4j linux上文件内容乱码问题

Posted supingemail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
	}

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

以上是关于docx4j linux上文件内容乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux中文显示乱码问题解决方法(编码查看及转换)

linux 文件名、文件内容 乱码

解决Windows中的文件上传到Linux中出现乱码问题

我想把一个html的内容转化成为图片,在本地win是好的,但是在linux上总是乱码

急!!java linux 从服务器上创建一个zip包 向zip包里写文件 下载zip包中文乱码

tomcat乱码问题解决