Aspose工具包从word和ppt转到pdf的实现过程
直接放项目地址
https://github.com/lichangliu1098/File2Pdf
说一下实现过程中遇到的坑
jar包的引入,aspose的jar包是第三方的,从maven拉不下来,有两种办法,一个是把jar包导入公司的仓库里引用,还有一个是放在项目里,使用pom本地引用的办法添加依赖,如下
<!-- word/ppt 转pdf依赖jar包 -->
<dependency>
<groupId>aspose</groupId>
<artifactId>aspose-word</artifactId>
<version>18.10</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/aspose-word-18.10.jar</systemPath>
</dependency>
<dependency>
<groupId>aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>18.9</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/aspose-cells-18.9.jar</systemPath>
</dependency>
<dependency>
<groupId>aspose</groupId>
<artifactId>aspose-slides</artifactId>
<version>19.6</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/aspose-slides-19.6.jar</systemPath>
</dependency>
<!-- word/ppt 转pdf依赖jar包 -->
使用默认的save方法生成的pdf,格式会有问题,字体会出现挤压的情况,下面上图展示,这个问题解决方式也很魔幻,换了一下jar包版本由aspose-slides-19.6.jar更换为16.7版本就可以了,具体原因没有找出来,猜测是字体格式导致的
后面遇到的是代码上到测试环境后,生成出的pdf所有中文字体都变成了框框,原因是由于测试环境项目部署用的是docker容器,构建的镜像没有安装中文字体。解决办法有两种,1.构建镜像时把中文字体安装进去,(这种成本影响有点大,根据自己项目环境选择操作),2.在浏览aspose官网提供的文档后,发现一种可以引入外部字体的方法,只需要把文档中使用的字体放入到一个文件夹,在docker中直接映射进去,在代码中配好文件夹的位置引入即可,下面贴具体代码
/**
* ppt转pdf
* @param inPath
* @param outPath
*/
public static void ppt2pdf(String inPath,String outPath) {
// 验证License
if (!getPptLicense()) {
return;
}
//下面两行为引用外部的字体的代码,实验证明,源文件使用的字体和外部引用的字体要对应,不然转出来的pdf的字体会乱码,注意文件夹的位置mac和windows注意区分
//font为引入的文件夹名称,根据自己所配置的文件夹进行调整
String[] folders = new String[]{"/font"};
FontsLoader.loadExternalFonts(folders);
Presentation pres = new Presentation(inPath);//输入pdf路径
try {
pres.save(outPath, com.aspose.slides.SaveFormat.Pdf);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(pres != null){
pres.dispose();
}
//清空字体缓存
FontsLoader.clearCache();
}
}
/**
* word转pdf
* @param inPath
* @param outPath
*/
public static void doc2pdf(String inPath, String outPath) {
if (!getWordLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
return;
}
try {
//下面两行为引用外部的字体的代码,实验证明,源文件使用的字体和外部引用的字体要对应,不然转出来的pdf的字体会乱码,注意文件夹的位置mac和windows注意区分
//font为引入的文件夹名称,根据自己所配置的文件夹进行调整
FontSettings fontSettings = new FontSettings();
fontSettings.setFontsFolder("/font",true);//true为是否递归文件夹
LoadOptions loadOptions = new LoadOptions();
loadOptions.setFontSettings(fontSettings);
Document doc = new Document(inPath,loadOptions); // Address是将要被转化的word文档
doc.save(outPath, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
} catch (Exception e) {
e.printStackTrace();
}
}
(项目环境非容器化的可忽略)在上述问题解决后,为了尽量不改动容器化部署的配置,也就是上面问题中新增引用的外部字体文件位置要映射到容器里,打算把文件夹直接打包到jar中,看是否能引入,试了很多次发现行不通只好放弃
最后一个问题,aspose转pdf时特别吃内存,在测试环境进行测试时,发现项目老是oom重启,在本地进行测试后,发现这个玩意贼吃内存啊,一个2M的文件转pdf能吃1个G的内存,测试环境内存是4G的,但扛不住一个7M多的PPT文件转pdf,实在无力,最后从项目安全考虑这个功能先搁置,后面打算重新部署一个容器专门为它服务…
下面贴下aspose官方文档的链接,如果要用aspose的其他功能,很有帮助
链接: word文档link.
链接: ppt文档link.
链接: cell文档link.
链接: aspose总的文档link.
希望对你们有帮助,如果有问题请指出,如果上述遇到的问题中有更好的方案,也请告知让更多的人知道,谢谢观看