【新增】 优化PPT形状考点
This commit is contained in:
@@ -16,6 +16,24 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
public class ShapePage {
|
public class ShapePage {
|
||||||
|
|
||||||
|
// 页眉页脚 文本
|
||||||
|
public static String getShapeHeaderFooterText(org.pptx4j.pml.Shape sp, CTSlideTiming timing) {
|
||||||
|
CTTextBody ctTextBody = sp.getTxBody();
|
||||||
|
String text = "";
|
||||||
|
if (ctTextBody != null) {
|
||||||
|
List<CTTextParagraph> pList = ctTextBody.getP();
|
||||||
|
for (CTTextParagraph p : pList) {
|
||||||
|
List<Object> objectList = p.getEGTextRun();
|
||||||
|
for (Object o : objectList) {
|
||||||
|
if (o instanceof CTRegularTextRun) {
|
||||||
|
text += ((CTRegularTextRun) o).getT() + " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
// 大小 - 高度
|
// 大小 - 高度
|
||||||
public static String getShapeSizeHeight(org.pptx4j.pml.Shape sp, CTSlideTiming timing) {
|
public static String getShapeSizeHeight(org.pptx4j.pml.Shape sp, CTSlideTiming timing) {
|
||||||
CTTransform2D xfrm = sp.getSpPr().getXfrm();
|
CTTransform2D xfrm = sp.getSpPr().getXfrm();
|
||||||
@@ -161,7 +179,12 @@ public class ShapePage {
|
|||||||
|
|
||||||
// 形状填充 填充透明度
|
// 形状填充 填充透明度
|
||||||
public static String getShapeFillOpacity(org.pptx4j.pml.Shape sp, CTSlideTiming timing) {
|
public static String getShapeFillOpacity(org.pptx4j.pml.Shape sp, CTSlideTiming timing) {
|
||||||
return "待开发";
|
CTShapeProperties ctShapeProperties = sp.getSpPr();
|
||||||
|
if (ctShapeProperties.getSolidFill() != null) {
|
||||||
|
CTPositiveFixedPercentage ctPositiveFixedPercentage = (CTPositiveFixedPercentage) ctShapeProperties.getSolidFill().getPrstClr().getEGColorTransform().get(0).getValue();
|
||||||
|
return (100 - (ctPositiveFixedPercentage.getVal() / 1000)) + "%";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// 形状线条 绘制
|
// 形状线条 绘制
|
||||||
@@ -174,7 +197,7 @@ public class ShapePage {
|
|||||||
// 宽度(EMU -> pt)
|
// 宽度(EMU -> pt)
|
||||||
double widthPt = ln.getW() / 12700.0;
|
double widthPt = ln.getW() / 12700.0;
|
||||||
System.out.println("形状: " + sp.getNvSpPr().getCNvPr().getName());
|
System.out.println("形状: " + sp.getNvSpPr().getCNvPr().getName());
|
||||||
System.out.println("线宽: " + widthPt + " pt");
|
System.out.println("线宽: " + widthPt + "磅");
|
||||||
|
|
||||||
// 颜色
|
// 颜色
|
||||||
if (ln.getSolidFill() != null && ln.getSolidFill().getSrgbClr() != null) {
|
if (ln.getSolidFill() != null && ln.getSolidFill().getSrgbClr() != null) {
|
||||||
@@ -203,9 +226,19 @@ public class ShapePage {
|
|||||||
if (spPr != null && spPr.getLn() != null) {
|
if (spPr != null && spPr.getLn() != null) {
|
||||||
CTLineProperties ln = spPr.getLn();
|
CTLineProperties ln = spPr.getLn();
|
||||||
// 颜色
|
// 颜色
|
||||||
if (ln.getSolidFill() != null && ln.getSolidFill().getSrgbClr() != null) {
|
if (ln.getSolidFill() != null) {
|
||||||
CTSRgbColor rgb = ln.getSolidFill().getSrgbClr();
|
CTSRgbColor rgb = ln.getSolidFill().getSrgbClr();
|
||||||
return rgb.getVal();
|
if (rgb != null) {
|
||||||
|
return rgb.getVal();
|
||||||
|
}
|
||||||
|
CTScRgbColor scrgb = ln.getSolidFill().getScrgbClr();
|
||||||
|
if (scrgb != null) {
|
||||||
|
return "RGB(" + scrgb.getR() + "," + scrgb.getG() + "," + scrgb.getB() + ")";
|
||||||
|
}
|
||||||
|
CTSchemeColor ctSchemeColor = ln.getSolidFill().getSchemeClr();
|
||||||
|
if (ctSchemeColor != null) {
|
||||||
|
return ctSchemeColor.getVal().value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
@@ -381,7 +414,7 @@ public class ShapePage {
|
|||||||
|
|
||||||
// —— 2) 偏移描述:dist EMU -> pt;<1pt 视作“接触”,否则 "Xpt 偏移" —— //
|
// —— 2) 偏移描述:dist EMU -> pt;<1pt 视作“接触”,否则 "Xpt 偏移" —— //
|
||||||
double distPt = emuToPt(r.getDist()); // 可能为 0
|
double distPt = emuToPt(r.getDist()); // 可能为 0
|
||||||
String offsetLabel = distPt < 1.0 ? "接触" : (SlideUtils.fmt1(distPt) + "pt 偏移");
|
String offsetLabel = distPt < 1.0 ? "接触" : (SlideUtils.fmt1(distPt) + "磅 偏移");
|
||||||
|
|
||||||
return coverageLabel + " " + offsetLabel;
|
return coverageLabel + " " + offsetLabel;
|
||||||
}
|
}
|
||||||
@@ -1007,7 +1040,9 @@ public class ShapePage {
|
|||||||
// 遍历所有段落
|
// 遍历所有段落
|
||||||
for (CTTextParagraph paragraph : textBody.getP()) {
|
for (CTTextParagraph paragraph : textBody.getP()) {
|
||||||
if (paragraph.getPPr().getIndent() != null) {
|
if (paragraph.getPPr().getIndent() != null) {
|
||||||
return paragraph.getPPr().getIndent() / 12700.0 + " pt"; // EMU 转 pt
|
// 结果保留1位小数点
|
||||||
|
String formattedNumber = String.format("%.1f", (double) paragraph.getPPr().getIndent() / 360000);
|
||||||
|
return formattedNumber + "厘米"; // EMU 转 pt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1021,7 +1056,7 @@ public class ShapePage {
|
|||||||
// 遍历所有段落
|
// 遍历所有段落
|
||||||
for (CTTextParagraph paragraph : textBody.getP()) {
|
for (CTTextParagraph paragraph : textBody.getP()) {
|
||||||
if (paragraph.getPPr().getSpcBef() != null) {
|
if (paragraph.getPPr().getSpcBef() != null) {
|
||||||
return paragraph.getPPr().getSpcBef().getSpcPts().getVal() / 100 + " pt"; // EMU 转 pt
|
return paragraph.getPPr().getSpcBef().getSpcPts().getVal() / 100 + "磅"; // EMU 转 pt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1035,7 +1070,7 @@ public class ShapePage {
|
|||||||
// 遍历所有段落
|
// 遍历所有段落
|
||||||
for (CTTextParagraph paragraph : textBody.getP()) {
|
for (CTTextParagraph paragraph : textBody.getP()) {
|
||||||
if (paragraph.getPPr().getSpcBef() != null) {
|
if (paragraph.getPPr().getSpcBef() != null) {
|
||||||
return paragraph.getPPr().getSpcAft().getSpcPts().getVal() / 100 + " pt"; // EMU 转 pt
|
return paragraph.getPPr().getSpcAft().getSpcPts().getVal() / 100 + "磅"; // EMU 转 pt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1067,7 +1102,7 @@ public class ShapePage {
|
|||||||
if (paragraph.getPPr().getLnSpc().getSpcPct() != null) {
|
if (paragraph.getPPr().getLnSpc().getSpcPct() != null) {
|
||||||
return (double) paragraph.getPPr().getLnSpc().getSpcPct().getVal() / 100000 + "倍行距"; // EMU 转 pt
|
return (double) paragraph.getPPr().getLnSpc().getSpcPct().getVal() / 100000 + "倍行距"; // EMU 转 pt
|
||||||
} else if (paragraph.getPPr().getLnSpc().getSpcPts() != null) {
|
} else if (paragraph.getPPr().getLnSpc().getSpcPts() != null) {
|
||||||
return (double) paragraph.getPPr().getLnSpc().getSpcPts().getVal() / 10 + "磅固定行距"; // EMU 转 pt
|
return (double) paragraph.getPPr().getLnSpc().getSpcPts().getVal() / 100 + "磅"; // EMU 转 pt
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1231,7 +1266,7 @@ public class ShapePage {
|
|||||||
long widthEmu = ctLineProperties.getW();
|
long widthEmu = ctLineProperties.getW();
|
||||||
// 转换为磅(1磅≈12700EMU)
|
// 转换为磅(1磅≈12700EMU)
|
||||||
double widthPt = widthEmu / 12700.0;
|
double widthPt = widthEmu / 12700.0;
|
||||||
return widthPt + "pt";
|
return widthPt + "磅";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1251,7 +1286,7 @@ public class ShapePage {
|
|||||||
double fontSizePt = fontSize / 100.0;
|
double fontSizePt = fontSize / 100.0;
|
||||||
// 估算轮廓高度(通常为字体高度的10-15%)
|
// 估算轮廓高度(通常为字体高度的10-15%)
|
||||||
double outlineHeightPt = fontSizePt * 0.12; // 12%估算
|
double outlineHeightPt = fontSizePt * 0.12; // 12%估算
|
||||||
return outlineHeightPt + "pt";
|
return outlineHeightPt + "磅";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,17 +23,28 @@ public class ShapePic {
|
|||||||
if (prst != null && prst.getPrst() != null) {
|
if (prst != null && prst.getPrst() != null) {
|
||||||
STShapeType t = prst.getPrst();
|
STShapeType t = prst.getPrst();
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case HEXAGON: return "六边形";
|
case HEXAGON:
|
||||||
case RECT: return "矩形";
|
return "六边形";
|
||||||
case ROUND_RECT: return "圆角矩形";
|
case RECT:
|
||||||
case ELLIPSE: return "椭圆";
|
return "矩形";
|
||||||
case TRIANGLE: return "三角形";
|
case ROUND_RECT:
|
||||||
case DIAMOND: return "菱形";
|
return "圆角矩形";
|
||||||
case PARALLELOGRAM: return "平行四边形";
|
case ELLIPSE:
|
||||||
case TRAPEZOID: return "梯形";
|
return "椭圆";
|
||||||
case OCTAGON: return "八边形";
|
case TRIANGLE:
|
||||||
case PENTAGON: return "五边形";
|
return "三角形";
|
||||||
default: return "预设形状:" + t.value();
|
case DIAMOND:
|
||||||
|
return "菱形";
|
||||||
|
case PARALLELOGRAM:
|
||||||
|
return "平行四边形";
|
||||||
|
case TRAPEZOID:
|
||||||
|
return "梯形";
|
||||||
|
case OCTAGON:
|
||||||
|
return "八边形";
|
||||||
|
case PENTAGON:
|
||||||
|
return "五边形";
|
||||||
|
default:
|
||||||
|
return "预设形状:" + t.value();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ctShapeProperties.getCustGeom() != null) {
|
if (ctShapeProperties.getCustGeom() != null) {
|
||||||
@@ -211,9 +222,19 @@ public class ShapePic {
|
|||||||
if (spPr != null && spPr.getLn() != null) {
|
if (spPr != null && spPr.getLn() != null) {
|
||||||
CTLineProperties ln = spPr.getLn();
|
CTLineProperties ln = spPr.getLn();
|
||||||
// 颜色
|
// 颜色
|
||||||
if (ln.getSolidFill() != null && ln.getSolidFill().getSrgbClr() != null) {
|
if (ln.getSolidFill() != null) {
|
||||||
CTSRgbColor rgb = ln.getSolidFill().getSrgbClr();
|
CTSRgbColor rgb = ln.getSolidFill().getSrgbClr();
|
||||||
return rgb.getVal();
|
if (rgb != null) {
|
||||||
|
return rgb.getVal();
|
||||||
|
}
|
||||||
|
CTScRgbColor scrgb = ln.getSolidFill().getScrgbClr();
|
||||||
|
if (scrgb != null) {
|
||||||
|
return "RGB(" + scrgb.getR() + "," + scrgb.getG() + "," + scrgb.getB() + ")";
|
||||||
|
}
|
||||||
|
CTSchemeColor ctSchemeColor = ln.getSolidFill().getSchemeClr();
|
||||||
|
if (ctSchemeColor != null) {
|
||||||
|
return ctSchemeColor.getVal().value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
Reference in New Issue
Block a user