河南联通 网站备案,商标设计怎么收费,wordpress优化教程,wordpress 生成主题包aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2#xff1a;aspose的依赖包中#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混… aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2aspose的依赖包中所有的关键对象都进行了混淆处理 解决方案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接口直接对持续时间进行获取和修改操作
问题2aspose的依赖包中所有的关键对象都进行了混淆处理 图 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**/Testpublic 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);}// 保存修改后的PPTpresentation.save(pptFile, SaveFormat.Pptx); // 保存修改后的文件System.out.println(修改后的PPT已保存到: pptFile);}修改前
修改后