【修改】 针对 动画 进行优化,使其兼容性提高
This commit is contained in:
@@ -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<Object> 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<Object> objects, List<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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) ? "是" : "否";
|
||||
}
|
||||
|
||||
// 文字效果 发光→效果
|
||||
|
@@ -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<Object> 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<Object> objects, List<Object> 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<Object> 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<Object> 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<Object> 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<Object> parOrSeqOrExcl = ctTimeNodeList.getParOrSeqOrExcl();
|
||||
String value = getAniationInfo(parOrSeqOrExcl, null, String.valueOf(spId), "delay");
|
||||
if (!value.isEmpty()) {
|
||||
return value;
|
||||
return Integer.parseInt(value) / 1000 + "秒";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
@@ -33,27 +33,27 @@ public class SlideConversion {
|
||||
List<SlidePart> 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<Object> 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<SlideDataInfoVO> dataInfoVOS) throws Exception {
|
||||
String type, String index, boolean isTrue, String belongToName, List<SlideDataInfoVO> 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);
|
||||
}
|
||||
}
|
||||
|
@@ -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 "";
|
||||
}
|
||||
|
@@ -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)");
|
||||
}
|
||||
}
|
@@ -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 "";
|
||||
}
|
||||
}
|
||||
}
|
@@ -15,5 +15,7 @@ public class SlideDataInfoVO {
|
||||
|
||||
private String index;
|
||||
|
||||
private String belongTo;
|
||||
|
||||
private boolean isClick;
|
||||
}
|
||||
|
Reference in New Issue
Block a user