admin管理员组

文章数量:1605325

Aspose工具包从word和ppt转到pdf的实现过程

  • 直接放项目地址
  • 说一下实现过程中遇到的坑

直接放项目地址

https://github/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.

希望对你们有帮助,如果有问题请指出,如果上述遇到的问题中有更好的方案,也请告知让更多的人知道,谢谢观看

本文标签: 功能工具AsposewordPDF