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的依赖包中,所有的关键对象都进行了混淆处理
导致的问题:
-
难以调试和维护:混淆后的类名和方法名使得代码难以阅读和理解,增加了调试和维护的复杂度。
-
反射操作困难:由于类名和方法名被混淆,使用反射操作这些类和方法时需要知道混淆后的名称,这通常是不可预测的。
-
序列化困难:混淆后直接通过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);
}
修改前:
修改后: