diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePage.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePage.java index f192372a..32edef08 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePage.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePage.java @@ -5,6 +5,8 @@ import jakarta.xml.bind.JAXBException; import org.docx4j.dml.*; import org.docx4j.jaxb.XPathBinderAssociationIsPartialException; import org.pptx4j.pml.*; +import pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils.PtToCmConverter; +import pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils.Transition; import java.math.BigInteger; import java.util.List; @@ -17,7 +19,11 @@ public class ShapePage { // 获取位置和尺寸(单位 EMU,1英寸=914400 EMU,1cm≈360000 EMU) CTPositiveSize2D ext = xfrm.getExt(); // 尺寸 double heightPt = emuToPt(ext.getCy()); - return String.valueOf(heightPt); + // 转换成磅 + double pt = Math.round(heightPt * 100.0) / 100.0; + // 转换成厘米 + double cm = PtToCmConverter.pointsToCm(pt); + return pt + "磅(" + cm + "厘米)"; } // 大小 - 宽度 @@ -26,7 +32,11 @@ public class ShapePage { // 获取位置和尺寸(单位 EMU,1英寸=914400 EMU,1cm≈360000 EMU) CTPositiveSize2D ext = xfrm.getExt(); // 尺寸 double widthPt = emuToPt(ext.getCx()); - return String.valueOf(widthPt); + // 转换成磅 + double pt = Math.round(widthPt * 100.0) / 100.0; + // 转换成厘米 + double cm = PtToCmConverter.pointsToCm(pt); + return pt + "磅(" + cm + "厘米)"; } // 大小 - 锁定纵横比 @@ -313,12 +323,12 @@ public class ShapePage { // 形状效果 阴影-效果 public static String getShapeShadowEffect(org.pptx4j.pml.Shape sp, CTSlideTiming timing) { if (sp == null || sp.getSpPr() == null) { - return "无阴影"; + return "否"; } CTShapeProperties spPr = sp.getSpPr(); CTEffectList effList = spPr.getEffectLst(); if (effList == null) { - return "无阴影"; + return "否"; } if (effList.getOuterShdw() != null) { @@ -328,7 +338,7 @@ public class ShapePage { } else if (effList.getPrstShdw() != null) { return "预设阴影"; } - return "无阴影"; + return "否"; } // 形状效果 倒影-绘制 @@ -336,21 +346,21 @@ public class ShapePage { CTShapeProperties spPr = sp.getSpPr(); CTEffectList effList = spPr.getEffectLst(); if (effList == null) { - return "无倒影"; + return "否"; } CTReflectionEffect reflection = effList.getReflection(); if (reflection != null) { // 如果需要详细参数,这里可以读取 - return "有倒影"; + return "是"; } - return "无倒影"; + return "否"; } // 形状效果 倒影-效果 public static String getShapeReflectionEffect(org.pptx4j.pml.Shape sp, CTSlideTiming timing) { CTReflectionEffect r = SlideUtils.getReflection(sp); - if (r == null) return "无倒影"; + if (r == null) return "否"; // —— 1) 倒影覆盖程度:用 stPos/endPos(0..100000)估算 —— // double st = SlideUtils.to100k(BigInteger.valueOf(r.getStPos()), 0); @@ -363,12 +373,12 @@ public class ShapePage { } else if (coverage >= 0.45) { coverageLabel = "半倒影"; } else { - coverageLabel = "短倒影"; + coverageLabel = "紧密倒影"; } - // —— 2) 偏移描述:dist EMU -> pt;<1pt 视作“紧贴”,否则 "Xpt 偏移" —— // + // —— 2) 偏移描述:dist EMU -> pt;<1pt 视作“接触”,否则 "Xpt 偏移" —— // double distPt = emuToPt(r.getDist()); // 可能为 0 - String offsetLabel = distPt < 1.0 ? "紧贴" : (SlideUtils.fmt1(distPt) + "pt 偏移"); + String offsetLabel = distPt < 1.0 ? "接触" : (SlideUtils.fmt1(distPt) + "pt 偏移"); return coverageLabel + " " + offsetLabel; } @@ -432,19 +442,47 @@ public class ShapePage { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "type"); if (!value.isEmpty()) { - return value; + String type = value.split("-")[0]; + // 动画类别 + String presetClass = value.split("-")[1]; + String presetClassCn = Transition.presetClass(presetClass); + // 动画效果 + String presetID = value.split("-")[2]; + return presetClassCn + "->" + presetID; } return ""; } public static String getAniationInfo(List objects, List upObjects, String spId, String parameter) { + boolean isDur = false; + boolean isDirection = false; for (Object object : objects) { + // 判断持续时间 + if (isDur) { + if (object instanceof CTTLAnimateEffectBehavior) { + return ((CTTLAnimateEffectBehavior) object).getCBhvr().getCTn().getDur(); + } + } + // 判断方向 + if (isDirection) { + if (object instanceof CTTLAnimateEffectBehavior) { + return ((CTTLAnimateEffectBehavior) object).getFilter(); + } + } if (object instanceof CTTLSetBehavior) { String spIds = ((CTTLSetBehavior) object).getCBhvr().getTgtEl().getSpTgt().getSpid(); // 判断ID是否一致 if (spIds.equals(spId)) { // 持续时间 if (parameter.equals("dur")) { - return ((CTTLSetBehavior) object).getCBhvr().getCTn().getDur(); + isDur = true; + String dur = ((CTTLSetBehavior) object).getCBhvr().getCTn().getDur(); + if (dur != null) { + return dur; + } + + } + if (parameter.equals("direction")) { + isDirection = true; } // 向上获取延迟 for (Object upObject : upObjects) { @@ -452,10 +490,13 @@ public class ShapePage { // 获取动画效果 if (parameter.equals("type")) { Integer type = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetSubtype(); - return String.valueOf(type); + String presetClass = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetClass().value(); + Integer presetID = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetID(); + return type + "-" + presetClass + "-" + presetID; } // 触发方式 if (parameter.equals("function")) { + String CTTLTimeNodeParallelFunction = ((CTTLTimeNodeParallel) upObject).getCTn().getNodeType().value(); return ((CTTLTimeNodeParallel) upObject).getCTn().getNodeType().value(); } // 获取延迟方法 @@ -468,9 +509,28 @@ public class ShapePage { } } } + if (upObject instanceof CTTLCommonTimeNodeData) { + // 获取动画效果 + if (parameter.equals("type")) { + Integer type = ((CTTLCommonTimeNodeData) upObject).getPresetSubtype(); + String presetClass = ((CTTLCommonTimeNodeData) upObject).getPresetClass().value(); + Integer presetID = ((CTTLCommonTimeNodeData) upObject).getPresetID(); + return type + "-" + presetClass + "-" + presetID; + } + } } } } + // 特殊取值的情况 + if (object instanceof CTTLCommonTimeNodeData) { + // 获取动画效果 + if (parameter.equals("type")) { + Integer type = ((CTTLCommonTimeNodeData) object).getPresetSubtype(); + String presetClass = ((CTTLCommonTimeNodeData) object).getPresetClass().value(); + Integer presetID = ((CTTLCommonTimeNodeData) object).getPresetID(); + return type + "-" + presetClass + "-" + presetID; + } + } if (object instanceof CTTLTimeNodeParallel obj) { String result = getAniationInfo(obj.getCTn().getChildTnLst().getParOrSeqOrExcl(), objects, spId, parameter); if (!result.isEmpty()) { @@ -490,7 +550,16 @@ public class ShapePage { // 动画-方向 public static String getAnimateDirection(org.pptx4j.pml.Shape sp, CTSlideTiming timing) { - return "待开发"; + long spId = sp.getNvSpPr().getCNvPr().getId(); + CTTimeNodeList ctTimeNodeList = timing.getTnLst(); + if (ctTimeNodeList == null) return "无动画"; + // 第一层 + List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); + String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "direction"); + if (!value.isEmpty()) { + return value; + } + return ""; } // 动画 触发方式 @@ -502,7 +571,7 @@ public class ShapePage { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "function"); if (!value.isEmpty()) { - return value; + return Transition.toCn(value); } return ""; } @@ -516,7 +585,7 @@ public class ShapePage { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "dur"); if (!value.isEmpty()) { - return value; + return Integer.parseInt(value) / 1000 + "秒"; } return ""; } @@ -530,7 +599,7 @@ public class ShapePage { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "delay"); if (!value.isEmpty()) { - return value; + return Integer.parseInt(value) / 1000 + "秒"; } return ""; } @@ -1220,7 +1289,10 @@ public class ShapePage { // 文字效果 发光→绘制 public static String getTextBoxParagraphGlowDraw(org.pptx4j.pml.Shape sp, CTSlideTiming timing) { - return "待开发"; + if (sp == null || sp.getSpPr() == null) return null; + CTShapeProperties spPr = sp.getSpPr(); + CTEffectList eff = spPr.getEffectLst(); + return (eff != null) ? "是" : "否"; } // 文字效果 发光→效果 diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePic.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePic.java index 2b1621f1..fdcced5c 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePic.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/ShapePic.java @@ -3,6 +3,7 @@ package pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j; import jakarta.xml.bind.JAXBElement; import org.docx4j.dml.*; import org.pptx4j.pml.*; +import pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils.Transition; import java.math.BigInteger; import java.util.List; @@ -302,12 +303,12 @@ public class ShapePic { // 形状效果 阴影-效果 public static String getShapeShadowEffect(Pic sp, CTSlideTiming timing) { if (sp == null || sp.getSpPr() == null) { - return "无阴影"; + return "否"; } CTShapeProperties spPr = sp.getSpPr(); CTEffectList effList = spPr.getEffectLst(); if (effList == null) { - return "无阴影"; + return "否"; } if (effList.getOuterShdw() != null) { @@ -317,7 +318,7 @@ public class ShapePic { } else if (effList.getPrstShdw() != null) { return "预设阴影"; } - return "无阴影"; + return "否"; } // 形状效果 倒影-绘制 @@ -325,21 +326,21 @@ public class ShapePic { CTShapeProperties spPr = sp.getSpPr(); CTEffectList effList = spPr.getEffectLst(); if (effList == null) { - return "无倒影"; + return "否"; } CTReflectionEffect reflection = effList.getReflection(); if (reflection != null) { // 如果需要详细参数,这里可以读取 - return "有倒影"; + return "是"; } - return "无倒影"; + return "否"; } // 形状效果 倒影-效果 public static String getShapeReflectionEffect(Pic sp, CTSlideTiming timing) { CTReflectionEffect r = SlideUtils.getReflectionPic(sp); - if (r == null) return "无倒影"; + if (r == null) return "否"; // —— 1) 倒影覆盖程度:用 stPos/endPos(0..100000)估算 —— // double st = SlideUtils.to100k(BigInteger.valueOf(r.getStPos()), 0); @@ -367,7 +368,7 @@ public class ShapePic { if (sp == null || sp.getSpPr() == null) return null; CTShapeProperties spPr = sp.getSpPr(); CTEffectList eff = spPr.getEffectLst(); - return (eff != null) ? eff.getGlow().toString() : null; + return (eff != null) ? "是" : "否"; } // 形状效果 发光-效果 @@ -418,19 +419,47 @@ public class ShapePic { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "type"); if (!value.isEmpty()) { - return value; + String type = value.split("-")[0]; + // 动画类别 + String presetClass = value.split("-")[1]; + String presetClassCn = Transition.presetClass(presetClass); + // 动画效果 + String presetID = value.split("-")[2]; + return presetClassCn + "->" + presetID; } return ""; } public static String getAniationInfo(List objects, List upObjects, String spId, String parameter) { + boolean isDur = false; + boolean isDirection = false; for (Object object : objects) { + // 判断持续时间 + if (isDur) { + if (object instanceof CTTLAnimateEffectBehavior) { + return ((CTTLAnimateEffectBehavior) object).getCBhvr().getCTn().getDur(); + } + } + // 判断方向 + if (isDirection) { + if (object instanceof CTTLAnimateEffectBehavior) { + return ((CTTLAnimateEffectBehavior) object).getFilter(); + } + } if (object instanceof CTTLSetBehavior) { String spIds = ((CTTLSetBehavior) object).getCBhvr().getTgtEl().getSpTgt().getSpid(); // 判断ID是否一致 if (spIds.equals(spId)) { // 持续时间 if (parameter.equals("dur")) { - return ((CTTLSetBehavior) object).getCBhvr().getCTn().getDur(); + isDur = true; + String dur = ((CTTLSetBehavior) object).getCBhvr().getCTn().getDur(); + if (dur != null) { + return dur; + } + + } + if (parameter.equals("direction")) { + isDirection = true; } // 向上获取延迟 for (Object upObject : upObjects) { @@ -438,10 +467,13 @@ public class ShapePic { // 获取动画效果 if (parameter.equals("type")) { Integer type = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetSubtype(); - return String.valueOf(type); + String presetClass = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetClass().value(); + Integer presetID = ((CTTLTimeNodeParallel) upObject).getCTn().getPresetID(); + return type + "-" + presetClass + "-" + presetID; } // 触发方式 if (parameter.equals("function")) { + String CTTLTimeNodeParallelFunction = ((CTTLTimeNodeParallel) upObject).getCTn().getNodeType().value(); return ((CTTLTimeNodeParallel) upObject).getCTn().getNodeType().value(); } // 获取延迟方法 @@ -454,9 +486,28 @@ public class ShapePic { } } } + if (upObject instanceof CTTLCommonTimeNodeData) { + // 获取动画效果 + if (parameter.equals("type")) { + Integer type = ((CTTLCommonTimeNodeData) upObject).getPresetSubtype(); + String presetClass = ((CTTLCommonTimeNodeData) upObject).getPresetClass().value(); + Integer presetID = ((CTTLCommonTimeNodeData) upObject).getPresetID(); + return type + "-" + presetClass + "-" + presetID; + } + } } } } + // 特殊取值的情况 + if (object instanceof CTTLCommonTimeNodeData) { + // 获取动画效果 + if (parameter.equals("type")) { + Integer type = ((CTTLCommonTimeNodeData) object).getPresetSubtype(); + String presetClass = ((CTTLCommonTimeNodeData) object).getPresetClass().value(); + Integer presetID = ((CTTLCommonTimeNodeData) object).getPresetID(); + return type + "-" + presetClass + "-" + presetID; + } + } if (object instanceof CTTLTimeNodeParallel obj) { String result = getAniationInfo(obj.getCTn().getChildTnLst().getParOrSeqOrExcl(), objects, spId, parameter); if (!result.isEmpty()) { @@ -476,7 +527,16 @@ public class ShapePic { // 动画-方向 public static String getAnimateDirection(org.pptx4j.pml.Pic sp, CTSlideTiming timing) { - return "待开发"; + long spId = sp.getNvPicPr().getCNvPr().getId(); + CTTimeNodeList ctTimeNodeList = timing.getTnLst(); + if (ctTimeNodeList == null) return "无动画"; + // 第一层 + List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); + String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "direction"); + if (!value.isEmpty()) { + return value; + } + return ""; } // 动画 触发方式 @@ -488,7 +548,7 @@ public class ShapePic { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "function"); if (!value.isEmpty()) { - return value; + return Transition.toCn(value); } return ""; } @@ -502,7 +562,7 @@ public class ShapePic { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "dur"); if (!value.isEmpty()) { - return value; + return Integer.parseInt(value) / 1000 + "秒"; } return ""; } @@ -516,7 +576,7 @@ public class ShapePic { List parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl(); String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "delay"); if (!value.isEmpty()) { - return value; + return Integer.parseInt(value) / 1000 + "秒"; } return ""; } diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideConversion.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideConversion.java index a95ed991..7ec1d3f3 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideConversion.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideConversion.java @@ -33,27 +33,27 @@ public class SlideConversion { List slideParts = ppt.getMainPresentationPart().getSlideParts(); int slideIndexFoFile = 0; String firstId = getStringRandom(); - setSlideDataInfo(firstId, "", "幻灯片", "slide", "", false, dataInfoVOS); + setSlideDataInfo(firstId, "", "幻灯片", "slide", "", false, "", dataInfoVOS); for (SlidePart slidePart : slideParts) { slideIndexFoFile ++; String secondId = getStringRandom(); - setSlideDataInfo(secondId, firstId, "第"+slideIndexFoFile+"页", "sld", String.valueOf(slideIndexFoFile), false, dataInfoVOS); + setSlideDataInfo(secondId, firstId, "第"+slideIndexFoFile+"页", "sld", String.valueOf(slideIndexFoFile), false, "", dataInfoVOS); // 获取形状 GroupShape spTree = slidePart.getJaxbElement().getCSld().getSpTree(); List shapes = spTree.getSpOrGrpSpOrGraphicFrame(); int slideIndexFoShape = 0; // 第三层 String thirdId = getStringRandom(); - setSlideDataInfo(thirdId, secondId, "幻灯片设置", "slideSetting", String.valueOf(slideIndexFoFile) + "_0", true, dataInfoVOS); + setSlideDataInfo(thirdId, secondId, "幻灯片设置", "slideSetting", String.valueOf(slideIndexFoFile) + "_0", true, "第"+slideIndexFoFile+"页", dataInfoVOS); for (Object shapeObj : shapes) { slideIndexFoShape ++; // 形状 String fourId = getStringRandom(); if (shapeObj instanceof Shape) { - setSlideDataInfo(fourId, secondId, "形状"+slideIndexFoShape+"->"+((Shape) shapeObj).getNvSpPr().getCNvPr().getName(), "shape", String.valueOf(slideIndexFoFile) + "_" + String.valueOf(slideIndexFoShape), true, dataInfoVOS); + setSlideDataInfo(fourId, secondId, "形状"+slideIndexFoShape+"->"+((Shape) shapeObj).getNvSpPr().getCNvPr().getName(), "shape", String.valueOf(slideIndexFoFile) + "_" + String.valueOf(slideIndexFoShape), true, "第"+slideIndexFoFile+"页", dataInfoVOS); } if (shapeObj instanceof Pic) { - setSlideDataInfo(fourId, secondId, "形状"+slideIndexFoShape+"->"+((Pic) shapeObj).getNvPicPr().getCNvPr().getName(), "shape", String.valueOf(slideIndexFoFile) + "_" + String.valueOf(slideIndexFoShape), true, dataInfoVOS); + setSlideDataInfo(fourId, secondId, "形状"+slideIndexFoShape+"->"+((Pic) shapeObj).getNvPicPr().getCNvPr().getName(), "shape", String.valueOf(slideIndexFoFile) + "_" + String.valueOf(slideIndexFoShape), true, "第"+slideIndexFoFile+"页", dataInfoVOS); } @@ -81,7 +81,7 @@ public class SlideConversion { // 想数组中添加数据 public static void setSlideDataInfo(String id, String parentId, String text, - String type, String index, boolean isTrue, List dataInfoVOS) throws Exception { + String type, String index, boolean isTrue, String belongToName, List dataInfoVOS) throws Exception { SlideDataInfoVO dataInfo = new SlideDataInfoVO(); dataInfo.setId(id); dataInfo.setParentId(parentId); @@ -89,6 +89,7 @@ public class SlideConversion { dataInfo.setType(type); dataInfo.setIndex(index); dataInfo.setClick(isTrue); + dataInfo.setBelongTo(belongToName); dataInfoVOS.add(dataInfo); } } diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideSetting.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideSetting.java index ece02bcd..a3d64a97 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideSetting.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/SlideSetting.java @@ -12,6 +12,7 @@ import org.pptx4j.pml.CTBackgroundProperties; import org.pptx4j.pml.CTSlideTiming; import org.pptx4j.pml.*; import org.docx4j.dml.*; +import pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils.Transition; import java.lang.reflect.Method; import java.util.List; @@ -92,7 +93,8 @@ public class SlideSetting { CTSlideTransition ctSlideTransition = slide.getTransition(); CTTransitionSoundAction ctTransitionSoundAction = ctSlideTransition.getSndAc(); if (ctTransitionSoundAction != null) { - return ctTransitionSoundAction.getStSnd().getSnd().getName(); + // 将获取的声音文件,进行转换成中文 + return Transition.getCnName(ctTransitionSoundAction.getStSnd().getSnd().getName()); } return ""; } diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/PtToCmConverter.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/PtToCmConverter.java new file mode 100644 index 00000000..539359cb --- /dev/null +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/PtToCmConverter.java @@ -0,0 +1,42 @@ +package pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils; + +public class PtToCmConverter { + + // 基础转换常数 + public static final double POINTS_PER_INCH = 72.0; + public static final double CM_PER_INCH = 2.54; + public static final double PT_TO_CM = CM_PER_INCH / POINTS_PER_INCH; + + /** + * 将点(pt)转换为厘米(cm) + * @param points 点数 + * @return 厘米数 + */ + public static double pointsToCm(double points) { + return points * PT_TO_CM; + } + + /** + * 将厘米(cm)转换为点(pt) + * @param cm 厘米数 + * @return 点数 + */ + public static double cmToPoints(double cm) { + return cm / PT_TO_CM; + } + + public static void main(String[] args) { + // 示例转换 + double points = 10.0; + double cm = pointsToCm(points); + + System.out.println(points + " pt = " + cm + " cm"); + System.out.println("反向转换: " + cm + " cm = " + cmToPoints(cm) + " pt"); + + // 常见值的转换示例 + System.out.println("\n常见值转换:"); + System.out.println("8 pt = " + pointsToCm(8) + " cm"); + System.out.println("12 pt = " + pointsToCm(12) + " cm"); + System.out.println("72 pt = " + pointsToCm(72) + " cm (1 inch)"); + } +} \ No newline at end of file diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/Transition.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/Transition.java new file mode 100644 index 00000000..6e6998af --- /dev/null +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/utils/Transition.java @@ -0,0 +1,124 @@ +package pc.exam.pp.module.judgement.utils.wps_pptx.pptx4j.utils; + +public class Transition { + public static String getCnName(String fileName) { + if (fileName == null) return "未知"; + + switch (fileName.toLowerCase()) { + case "wind.wav": + return "风声 / 微风"; + case "applause.wav": + return "掌声"; + case "breeze.wav": + return "清风 / 微风拂过"; + case "whoosh.wav": + case "swoosh.wav": + return "呼啸 / 划过"; + case "chime.wav": + return "叮当 / 玲声"; + case "camera.wav": + return "相机快门"; + case "cashregister.wav": + return "收银机"; + case "typewriter.wav": + return "打字机"; + case "laser.wav": + return "激光"; + case "explosion.wav": + case "explode.wav": + return "爆炸"; + case "drumroll.wav": + return "擂鼓 / 滚奏"; + case "click.wav": + return "点击"; + case "coin.wav": + return "硬币"; + case "bomb.wav": + return "炸弹"; + case "scream.wav": + return "尖叫"; + case "arrow.wav": + return "箭矢"; + case "push.wav": + return "推入声"; + case "hammer.wav": + return "锤击"; + case "tada.wav": + return "哒哒 / 庆祝"; + case "horn.wav": + case "carhorn.wav": + return "喇叭 / 汽车喇叭"; + case "doorbell.wav": + return "门铃"; + case "ding.wav": + return "叮"; + case "gong.wav": + return "锣"; + case "beep.wav": + return "嘟声"; + case "notify.wav": + return "提示音"; + case "pop.wav": + return "啪嗒 / 弹出"; + case "zip.wav": + case "zipper.wav": + return "拉链 / 嗖"; + case "sparkle.wav": + return "闪光"; + case "rattle.wav": + return "哗啦"; + case "thunder.wav": + return "雷鸣"; + case "bell.wav": + return "铃声"; + case "ring.wav": + return "电话铃"; + case "whistle.wav": + return "口哨"; + default: + return "未知"; + } + } + + public static String toCn(String trigger) { + if (trigger == null) return ""; + switch (trigger == null ? "" : trigger.trim().toLowerCase()) { + case "onclick": + case "clickeffect": return "单击时"; + + case "witheffect": + case "onbegin": return "与上一动画同时"; + + case "aftereffect": + case "onend": return "上一动画之后"; + + case "onnext": return "下一次单击"; + case "onprev": return "上一次单击"; + case "onload": return "幻灯片载入时"; + case "onmouseover": return "鼠标移入时"; + case "onmouseout": return "鼠标移出时"; + case "ondblclick": return "双击时"; + case "onstopaudio": return "音频停止时"; + case "onbeginaudio": + case "onplay": return "音频开始时"; + case "onendaudio": return "音频结束时"; + case "onbookmark": return "书签到达时"; + case "onresume": return "恢复播放时"; + case "onpause": return "暂停时"; + case "onstop": return "停止时"; + default: return trigger; // 或者返回 "(未知触发)" + } + + } + + public static String presetClass(String trigger) { + if (trigger == null) return ""; + switch (trigger.trim().toLowerCase()) { + case "entr": return "进入"; + case "exit": return "退出"; + case "emph": return "强调"; + case "path": return "动作路径"; + default: return ""; + } + } +} diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/vo/SlideDataInfoVO.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/vo/SlideDataInfoVO.java index 97aa2678..436dc0cb 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/vo/SlideDataInfoVO.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_pptx/pptx4j/vo/SlideDataInfoVO.java @@ -15,5 +15,7 @@ public class SlideDataInfoVO { private String index; + private String belongTo; + private boolean isClick; }