一、 java 项目在Linux环境下word转pdf文字丢失以及乱码问题
例如这样的乱码
二、 问题原因
1. 因为linux系统没有word文本里面的字体文件,需要导入对应的字体文件。
2. java代码中FontSettings没有设置linux系统下的字体源路径。
字体文件路径:windows系统是在C:/Windows/Fonts/,linux系统是在/usr/share/fonts/
三、解决办法
示例代码(只展示fontSettings 相关代码)
import java.io.File;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.SaveFormat;
import sun.awt.OSInfo;
public String docToPdf(String fdfsUrl) throws Exception {
File dir = new File(fdfsUrl);
//word文档
Document doc = new Document(srcFile.getPath());
//获取fontSettings 默认的字体设置
FontSettings fontSettings = FontSettings.getDefaultInstance();
/** 第一种 设置字体源路径 */
//windows下的字体源文件路径
String windowsFonts = "C:/Windows/Fonts/";
//linux下的字体源文件路径
String linuxFonts = "/usr/share/fonts/";
String[] fontsFolders = new String[] {windowsFonts, linuxFonts};
/**
参数说明:
第一个参数String[] fontsFolders 字体源路径
“SetFontsFolders”方法从我们作为第一个参数传递的每个字体目录创建字体源。
第二个参数boolean recursive 是否递归
false: 不递归任何目录子文件夹中的任何字体
true: 包含我们传参的目录中的所有字体文件,以及其子目录中的所有字体
*/
fontSettings.setFontsFolders(fontsFolders, true);
doc.setFontSettings(fontSettings);
doc.save(os, SaveFormat.PDF);
/** 第二种 根据不同的环境设置字体源路径 */
String osType=String.valueOf(OSInfo.getOSType());
String fonts [] = null;
if(osType.equals("Linux")){
//设置字体文件路径
//fonts = new String[]{"/usr/share/fonts/"};
//也可以设置指定字体文件
fonts = new String[]{"/usr/share/fonts/chinese/","/usr/share/fonts/simsun/","/usr/share/fonts/black/","/usr/share/fonts/wingdings/"};
}else if(osType.equals("Windows")){
fonts = new String[]{"C:/Windows/Fonts/chinese/","C:/Windows/Fonts/simsun/","C:/Windows/Fonts/black/","C:/Windows/Fonts/wingdings/"};
}
doc.save(os, SaveFormat.PDF);
//上传pdf文件
String fileUrl = this.uploadFile(new FileInputStream(file), file.length(), "pdf");
//返回pdf文件路径
return fileUrl ;
}
Liunx系统导入字体文件:
-
找到C:\Windows下面的Fonts文件夹,将整个文件夹移到Linux环境的/usr/share/fonts目录下,再将Fonts文件夹改名为Chinese(也可以取别的名字)
-
在liunx系统下执行:
sudo chmod 755 /usr/share/fonts/Chinese/*(更改这些字体库的权限) -
cd /usr/share/fonts/Chinese/
-
sudo mkfontscale (创建字体的fonts.scale文件,它用来控制字体旋转缩放)
-
sudo mkfontdir (创建字体的fonts.dir文件,它用来控制字体粗斜体产生)
-
sudo fc-cache(刷新字体缓存)