aspose-words 解决linux目录更新页码错乱问题
问题描述
aspose-words踩坑-windows环境下正常,在linux环境下目录的页码错乱
导出word我用的是poi-tl,poi-tl要对目录更新只能用
Apache POI的document().enforceUpdateFields()来更新目录
,但是使用enforceUpdateFields()方法导出的word文件打开的时候会有一个提示框
,并且是不支持wps的,所以在目录更新我改用aspose-words
原因分析:
在window下没有问题但是在linux下有问题,说明不是代码或者输入输出流编码的问题,原因是两个平台环境的问题。说明linux环境中缺少相应的字体以供使用,可能会导致导出的文件字体乱码,或者更新域错乱问题。
解决方案:
1.更新字体
- 在linux环境下安装win字体,将win机器的C:\Windows\Fonts目录下的全部文件拷贝到linux服务器字体安装目录下,然后执行以下命令更新字体缓存。
- linux字体库位置在/usr/share/fonts/,在这个目录下新建一个文件夹,将win下的字体文件全部拷贝进去
- 安装字体命令
contos安装插件
yum install fontconfig
yum install mkfontscale
修改字体权限
chmod -R 755 /usr/share/fonts/chinese
安装字体命令
cd /usr/share/fonts/chinese
mkfontscale
mkfontdir
fc-cache -fv
让字体生效命令
source /etc/profile
4.如果项目是用docker部署,可以在docker-compose文件里添加数据卷,共享宿主机字体。如果项目不是用docker部署这步跳过。
ufo-evaluation:
build:
context: /root/build/evaluation
image: ufo/evaluation:1.0.0.alpha
container_name: ufo-evaluation
command:
- --spring.profiles.active=test
ports:
- "88:88"
#共享宿主机字体
volumes:
- /usr/share/fonts/chinese:/usr/share/fonts/chinese
privileged: true
restart: always
networks:
- ufo_net
depends_on:
- ufo-redis
- ufo-mysql
2.修改代码
OsInfo osInfo = SystemUtil.getOsInfo();
//如果是linux系统,使用/usr/share/fonts/chinese文件下的字体库
if (osInfo.isLinux()) {
FontSettings.getDefaultInstance().setFontsFolder("/usr/share/fonts/chinese", true);
}
//实例化document
Document document = new Document(file.getPath());
//aspose.words更新目录
document.updateFields();
//导出word
document.save(response.getOutputStream(), SaveFormat.DOCX);