当前位置: 首页 > article >正文

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

文章目录

  • 项目场景
  • 问题描述
    • 问题1:从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法
    • 问题2:aspose的依赖包中,所有的关键对象都进行了混淆处理
  • 解决方案
    • 1、找到ppt切换的持续时间对应的混淆对象中的字段
    • 2、获取ppt切换的持续时间
    • 3、设置ppt切换的持续时间
    • 4、处理结果

项目场景

需求:

  • 使用的是版本是: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切换的持续时间

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

	/**
     * @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切换的持续时间

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

	/**
     * @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秒

     /**
     * @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);
    }

修改前:
在这里插入图片描述

修改后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/383945.html

相关文章:

  • 重构代码之参数化方法
  • 基于 Encoder-only 架构的大语言模型
  • 基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
  • Python | Leetcode Python题解之第537题复数乘法
  • 【LeetCode】【算法】206. 反转链表
  • git 提交代码流程
  • 基础数据结构——队列(链表实现)
  • 【django】Django REST Framework (DRF) 项目中实现 JWT
  • Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
  • Java实现pdf转图片
  • ipv6的 fc00(FC00::/7) 和 fec0(FEC0::/10)
  • 深度学习:Masked Self-Attention 详解
  • 【Chapter 2_ Sentosa_DSML Community Edition Product Features】
  • 职场浅谈:情商高的“4”种表现,情商高的人才更容易走向成功
  • yolo v5 开源项目
  • 基于Spring Boot的中小型制造企业质量管理系统设计与实现,LW+源码+讲解
  • Cesium 贝塞尔曲线
  • 【Ai测评】GPT Search偷偷上线,向Google和微软发起挑战!
  • win11安装最新rabbitmq
  • SSM— spring,springMVC,mybatis整合
  • Flutter鸿蒙next 实现一个计算器应用
  • SpringBoot中使用SpringTask实现定时任务
  • OpenDroneMap Webodm
  • java-web-苍穹外卖-day1:软件开发步骤简化版+后端环境搭建
  • OCR、语音识别与信息抽取:免费开源的AI平台在医疗领域的创新应用
  • Rust智能指针和生命周期