马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
项目场景
需求:
- 使用的是版本是: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);
- }
复制代码 修改前:
修改后:
|