Aspose工具实现word和ppt转pdf功能及遇到的一些问题

2023-11-03

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.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aspose工具实现word和ppt转pdf功能及遇到的一些问题 的相关文章

  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 如何在url请求中发送数组

    我的要求如下 我想给出演员姓名 开始日期 结束日期并获取他在该时期出演的所有电影 因此 我的服务请求是这样的 http localhost 8080 MovieDB GetJson name Actor startDate 20120101
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • /var/lib/docker/中docker目录结构的作用

    当我启动一个新的 docker 守护进程时 docker 目录如下 var lib docker aufs diff layers mnt containers graph init dockerinit 0 7 3 linkgraph d
  • 如何在 MSSQL 中获取 CURRENT_DATE?

    我正在使用 jpa 3 o 和 Hibernate 我有一个命名查询 SELECT COUNT wt id FROM WPSTransaction wt WHERE wt createdDate gt CURRENT DATE WPSTra
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • 生成 equals 和 hashcode 时忽略属性

    假设我有一个类 Customer public class Customer private String firstName private String lastName private String doNotAddMeToEqual
  • 在带有 Protocol Buffers 的项目中使用 Proguard 有什么特点?

    我有一个使用 Google Protocol Buffers 的项目 一旦我尝试用 ProGuard 对其进行混淆 似乎 protobuf 会导致问题 我将所有自己的类打包成mybuildedclasses jar 谷歌代码被打包成prot
  • JUNIT 测试 void 方法

    我有一个充满 void 方法的 java 类 我想进行一些单元测试以获得最大的代码覆盖率 例如我有这个方法 protected static void checkifValidElements int arg1 int arg2 metho
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • 受信任的 1.5 小程序可以执行系统命令吗?

    如果是的话 这个能力有什么限制吗 具体来说 我需要以 Mac OSX 为目标 我以前用过这个在 Windows 系统上启动东西 但从未在 Mac 上尝试过 public void launchScript String args Strin
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle

随机推荐

  • 《英语(二)》作文案例

    翻译文章 1 More than twenty years ago my hometown was just a small old and poor town Most of people were farmers There were
  • GLES3.0中文API-glGetQueryObjectuiv

    名称 glGetQueryObjectuiv 返回查询对象的参数 C规格 void glGetQueryObjectuiv GLuint id GLenum pname GLuint params 参数 id 指定查询对象的名称 pname
  • js逆向解析,js爬虫

    废话不多说 直接开干 吸取了百度精华 来写文章了 难度系数 两颗星 大概逻辑 1 请求url 2 找到请求参数 3 分析参数产生过程 4 整合参数 1 请求url http fanyi youdao com 2 找到请求参数 3 分析参数产
  • SQL中的循环、for循环、游标

    SQL中的循环 for循环 游标 1 利用游标循环更新 删除MemberAccount表中的数据 DECLARE My Cursor CURSOR 定义游标 FOR SELECT FROM dbo MemberAccount 查出需要的集合
  • K8S的概念和基本应用

    学习视频 Kubernetes基本概念和应用 哔哩哔哩 bilibili 零 架构概览 master节点 管理调度集群资源 一般为多节点构成 可以是物理机 也可以是虚拟机 worker节点 资源的提供者 一般为多节点构成 可以是物理机 也可
  • 在vue项目当中实现对某个数据的复制vue-clipboard2

    在vue项目当中实现对某个数据的复制 运用插件是十分方便快捷的vue clipboard2 安装 npm install save vue clipboard2 main js import Vue from vue import VueC
  • 推荐-社交推荐相关

    总结 近时间矩阵分解 社交信息的融合模型 2018 模型性能 不同社交推荐方法在不同数据集中不同用户社交强度下的性能对比 研究难点与热点 数据稀疏性 社交关系的有效挖掘 社交噪声 可解释性社交推荐 可扩展型社交推荐模型与多源信息的融合 社交
  • Linux 面试常见(55题)

    TOC删除线格式 一 文件管理 目录操作 创建目录 mkdir mkdir命令可以创建一个新的目录 例如 在当前目录下创建一个名为 test 的目录 mkdir test 2 删除目录 rmdir rmdir命令可以删除一个空目录 例如 要
  • 结构体输入输出(c语言)

    include
  • 实现Echarts词云和随机颜色(vue2)

    1 首先需要安装echarts和echarts wordcloud插件 2 echarts的版本和echarts wordcloud版本有对应要求才能实现 否则会报错 经过查询如果是用的是echarts4那么需要对应着echarts wor
  • python自动化课程笔记(十一)封装、继承、多态

    class Dog object good dog 说明文档 def init self new name color age 5 self name new name self color color self age age def s
  • Tomcat安装及部署

    Aphorism 安装 忽略下载过程 1 解压文件 把 tomcat 安装包解压到 D Program Files 下 2 启动 tomcat 在 tomcat 文件包的 bin 文件夹中 双击 startup bat 文件启动tomcat
  • 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(C++实现)

    题目介绍 给定一个链表 删除链表的倒数第 n 个节点 并且返回链表的头结点 示例 给定一个链表 1 gt 2 gt 3 gt 4 gt 5 和 n 2 当删除了倒数第二个节点后 链表变为 1 gt 2 gt 3 gt 5 说明 给定的 n
  • Oil Deposits

    http poj org problem id 1562 Oil Deposits Description The GeoSurvComp geologic survey company is responsible for detecti
  • 10个超炫超有用的js库/插件

    原文地址 http blog csdn net shyy123 article details 7471782 1 CodeMirror CodeMirror 是一款 Online Source Editor 基于 Javascript 短
  • MyEclipse集成PMD代码检测插件自定义规则配置文件

    把我今天最新更新的MyEclipse2014集成PMD代码检测插件自定义规则配置文件JAVA版发布出来吧 方便自己以后回顾的同时 也看看能不能帮到有这方面需求的小伙伴们 文件名 cplatform pmd5 2 3 rules xml
  • Android.bp文件简介

    Android bp Android bp的出现就是为了替换Android mk文件 bp跟mk文件不同 它是纯粹的配置 没有分支 循环等流程控制 不能做算数逻辑运算 如果需要控制逻辑 那么只能通过Go语言编写 语法 根据设计 Androi
  • 为什么opencv用GPU实现比用CPU实现的慢?

    问题 打算通过OpenCV的GPU模块优化现有代码的运行效率 怀抱着美好愿望开始了代码的改写工作 改写的过程并不顺利 遇到了不少问题 例如 gpu模块提供的接口非常坑爹 相当一部分不支持浮点类型 像histogram integral这类常
  • SpringCloud实践(四) 通过Feign组件实现消费者

    在前面使用了RestTemplate和Ribbon来实现了服务消费者 Feign 是一个集成了Ribbon和Eureka的组件 通过声明的方式 就可以实现Http客户端 简化了http客户端 服务消费者 对于Feign 我们只要记得两个特点
  • Aspose工具实现word和ppt转pdf功能及遇到的一些问题

    Aspose工具包从word和ppt转到pdf的实现过程 直接放项目地址 说一下实现过程中遇到的坑 直接放项目地址 https github com lichangliu1098 File2Pdf 说一下实现过程中遇到的坑 jar包的引入