Java 通过aspose.words 把docx转成pdf后中文变成小方块的解决方法.md
在有些应用场景中需要将word生成pdf,一开始以为是response的问题,设置了
response.setCharacterEncoding("UTF-8");
以后也没有效果,后来发现java中间生成的word文件是可以正常显示中文的,问题就出在word转pdf的过程中,几经测试,发现是服务器上没有word中的相关字体文件,那么就分两步走解决问题:
- 将字体文件上传到服务器上
- 将windows操作系统上的字体文件(C:\WINDOWS\FONTS)拷贝出来,改字体文件名为:simsun.ttc。
- 登录linux服务器,查看系统中包含哪些字体。
shell> fc-list
/usr/share/fonts/abattis-cantarell/Cantarell-Bold.otf: Cantarell:style=Bold
/usr/share/fonts/abattis-cantarell/Cantarell-Regular.otf: Cantarell:style=Regular
/usr/share/fonts/abattis-cantarell/Cantarell-Oblique.otf: Cantarell:style=Oblique
/usr/share/fonts/abattis-cantarell/Cantarell-BoldOblique.otf: Cantarell:style=BoldOblique
没有宋体字体。
- 将字体文件(simsun.ttc)上传到目录/usr/share/fonts/chinese(如果目录不存在则创建目录)下。
- 修改字体文件的权限。
shell> cd /usr/share/fonts/chinese
shell> chmod 755 simsun.ttc
安装ttmkfdir(如已安装,跳过)
shell> yum -y install ttmkfdir
搜索目录中所有的字体信息,汇总生成fonts.scale文件
shell> ttmkfdir /usr/share/fonts/chinese
刷新内存中的字体缓存。
shell> fc-cache
再次查看系统中包含哪些字体。
shell> fc-list
/usr/share/fonts/chinese/simsun.ttc: SimSun,宋体:style=Regular,常规
/usr/share/fonts/abattis-cantarell/Cantarell-Bold.otf: Cantarell:style=Bold
/usr/share/fonts/chinese/simsun.ttc: NSimSun,新宋体:style=Regular,常规
/usr/share/fonts/abattis-cantarell/Cantarell-Regular.otf: Cantarell:style=Regular
/usr/share/fonts/abattis-cantarell/Cantarell-Oblique.otf: Cantarell:style=Oblique
/usr/share/fonts/abattis-cantarell/Cantarell-BoldOblique.otf: Cantarell:style=BoldOblique
参考链接
2. 在代码中做如下设置
// 新建一个空白pdf文档
File tempFilePDF = File.createTempFile("temp", ".pdf");
if (operationSystemName.contains("nix") || operationSystemName.contains("nux") || operationSystemName.contains("mac")) {
String[] fontsFolder = {"/usr/share/fonts"};
FontSettings.setFontsFolders(fontsFolder,true );
}
os = new FileOutputStream(tempFilePDF);
Document doc = new Document(tempFileDocx.getAbsolutePath());
doc.save(os, SaveFormat.PDF);