aspose如何获取PPT放映页“切换”的“持续时间”值

aspose如何获取PPT放映页"切换"的"持续时间"值

项目场景

需求:

  • 使用的是版本是:aspose-slides-22.5-jdk16
    使用PowerPoint创建的ppt文件,点击左侧页后,在上面的菜单栏点击"切换" -> "淡出" -> "持续时间",此时在aspose中如果获取或者修改这个值呢?

问题描述

  • 在aspose官方接口中"切换"设置的属性是在ISlideShowTransition中获取,以下是官方接口提供的方法:

文档地址:https://reference.aspose.com/slides/java/com.aspose.slides/islideshowtransition/

问题1:从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法


导致的问题

  • 获取困难:无法通过aspose提供的api接口,直接对持续时间进行获取和修改操作

问题2:aspose的依赖包中,所有的关键对象都进行了混淆处理


图 ISlideShowTransition对象运行中对象属性值


图 ISlideShowTransition对象方法


图 gson 对象序列化处理报错

导致的问题

  • 难以调试和维护:混淆后的类名和方法名使得代码难以阅读和理解,增加了调试和维护的复杂度。

  • 反射操作困难:由于类名和方法名被混淆,使用反射操作这些类和方法时需要知道混淆后的名称,这通常是不可预测的。

  • 序列化困难:混淆后直接通过gson、jackson等方式, JSON 解析或对象序列化处理会报错


解决方案

获取混淆后的对象属性值,确实会比未混淆的情况下更为复杂。混淆会改变类名、方法名、字段名等,这可能导致在调试或反射时无法直接访问这些属性。然而,可以通过以下方法尝试访问混淆后的对象属性值:

  • 反射可以绕过混淆的名称变化,直接访问对象的字段和方法。即使字段和方法的名称被混淆,只要知道其访问方式,就可以通过反射获取这些属性的值。

1、找到ppt切换的持续时间对应的混淆对象中的字段

首先需要找到ppt切换的持续时间对应的混淆对象中的哪一个字段。这里是ISlideShowTransition对象 ---> else ---> if 对应着 持续时间值 20s

2、获取ppt切换的持续时间

方法描述: 通过反射获取对象中混淆后的字段值。

java 复制代码
	/**
     * @description: 获取ppt切换的持续时间
     * @param transition
     * @return: String
     **/
    public String getSwitchDuration(ISlideShowTransition transition) {
        String duration = "0";
        try {
            // 获取 'else' 字段的值,它是一个 'com.aspose.slides.aye' 类型的对象
            Field elseField = transition.getClass().getDeclaredField("else");
            elseField.setAccessible(true);  // 设置字段可访问

            Object elseFieldValue = elseField.get(transition);
            if (elseFieldValue != null) {
                Class<?> ayeClass = elseFieldValue.getClass();

                Field[] ayeFields = ayeClass.getDeclaredFields();

                for (Field ayeField : ayeFields) {
                    ayeField.setAccessible(true);  // 如果字段是私有的,设置为可访问
                    Object fieldValue = ayeField.get(elseFieldValue);  // 获取字段的值

                    if (ayeField.getName().equals("if") && fieldValue != null) {
                        duration = fieldValue.toString();
                    }
                }
            }
        } catch (Exception e) {
            log.error("获取ppt切换的持续时间失败");
        }
        return duration;
    }

3、设置ppt切换的持续时间

方法描述: 通过反射设置对象中混淆后的字段值。

java 复制代码
	/**
     * @description: 设置ppt切换的持续时间
     * @param transition
     * @param duration
     * @return: void
     **/
    public void setSwitchDuration(ISlideShowTransition transition, String duration) {
        try {
            // 获取 'else' 字段的值,它是一个 'com.aspose.slides.aye' 类型的对象
            Field elseField = transition.getClass().getDeclaredField("else");
            elseField.setAccessible(true);  // 设置字段可访问

            Object elseFieldValue = elseField.get(transition);
            if (elseFieldValue != null) {
                Class<?> ayeClass = elseFieldValue.getClass();
                Field[] ayeFields = ayeClass.getDeclaredFields();

                for (Field ayeField : ayeFields) {
                    ayeField.setAccessible(true);  // 如果字段是私有的,设置为可访问
                    if (ayeField.getName().equals("if")) {
                        // 修改字段值
                        ayeField.set(elseFieldValue, duration);
                        System.out.println("PPT切换时间已修改为: " + duration);

                        // 确认修改成功
                        Object updatedValue = ayeField.get(elseFieldValue);
                        System.out.println("更新后的值: " + updatedValue);
                    }
                }
            }
        } catch (Exception e) {
            log.error("设置ppt切换的持续时间失败", e);
        }
    }

4、处理结果

修改为1.5秒

java 复制代码
     /**
     * @description: 测试修改持续时间
     * @param
     * @return: void
     **/
    @Test
    public void test(){
        String pptFile = "D:\\Desktop\\anim.pptx";
        Presentation presentation = new Presentation(pptFile);

        // 遍历每一张幻灯片
        for (ISlide slide : presentation.getSlides()) {
            ISlideShowTransition transition = slide.getSlideShowTransition();
            String duration = getSwitchDuration(transition);
            System.out.println(String.format("幻灯片切换的持续时间: %sms", duration));
            String setTime = "1500";
            setSwitchDuration(transition, setTime);
            System.out.println(transition);
        }

        // 保存修改后的PPT
        presentation.save(pptFile, SaveFormat.Pptx);  // 保存修改后的文件
        System.out.println("修改后的PPT已保存到: " + pptFile);
    }

修改前:

修改后:


相关推荐
张张张31213 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~16 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL31 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing33 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿