From 933d0a0c34bc4e9394af7807563ea6203f6e7d61 Mon Sep 17 00:00:00 2001 From: dlaren Date: Mon, 4 Aug 2025 13:56:51 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91=20docx4j?= =?UTF-8?q?=20=E6=96=B9=E6=B3=95=E4=BF=AE=E6=94=B9BUG=EF=BC=9A=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/wps_word/docx4j/DocxMaster.java | 37 +++------- .../wps_word/docx4j/paragraph/Paragraphs.java | 70 +++++++++---------- 2 files changed, 43 insertions(+), 64 deletions(-) diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/DocxMaster.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/DocxMaster.java index 6856ecfb..8752d02e 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/DocxMaster.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/DocxMaster.java @@ -16,9 +16,7 @@ import org.docx4j.model.structure.SectionWrapper; import org.docx4j.dml.wordprocessingDrawing.Anchor; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; -import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart; -import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart; -import org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart; +import org.docx4j.openpackaging.parts.WordprocessingML.*; import org.docx4j.w14.CTWordContentPart; import org.docx4j.wml.*; import org.springframework.web.multipart.MultipartFile; @@ -77,6 +75,10 @@ public class DocxMaster { NumberingDefinitionsPart ndp = wordMLPackage.getMainDocumentPart().getNumberingDefinitionsPart(); // 2-3、节对象 List sections = wordMLPackage.getDocumentModel().getSections(); + // 2-3、Web 设置 + WebSettingsPart webSettingsPart = wordMLPackage.getMainDocumentPart().getWebSettingsPart(); + // 2-4、文档设置 + DocumentSettingsPart settingsPart = wordMLPackage.getMainDocumentPart().getDocumentSettingsPart(); wordMLPackage.getHeaderFooterPolicy().getDefaultFooter(); for (WpsDocxInfoVo wpsDocxInfoVo : wpsDocxInfoVos) { // 参数实例化 @@ -90,9 +92,7 @@ public class DocxMaster { String examName = wpsDocxInfoVo.getExamName(); // 考点代码 String examCode = wpsDocxInfoVo.getExamCode(); - // 方式方法 - String method = wpsDocxInfoVo.getMethod(); - String docxFunction = firstName + "#" + indexParm + "#" + function + "#" + examName + "#" + examCode + "#" + method; + String docxFunction = firstName + "@" + indexParm + "@" + function + "@" + examName + "@" + examCode; // 创建一个索引ID,跟参数中index进行匹配 int index = 0; for (Object obj : paragraphs) { @@ -108,32 +108,11 @@ public class DocxMaster { // 目标对象 Paragraphs paragraphsFunction = new Paragraphs(); // 获取参数中类型的定义 - String[] methods = method.split("@"); - List> classList = new ArrayList<>(); - for (String met : methods) { - if (met.equals("P")) { - classList.add(P.class); - } - if (met.equals("StyleDefinitionsPart")) { - classList.add(StyleDefinitionsPart.class); - } - if (met.equals("NumberingDefinitionsPart")) { - classList.add(NumberingDefinitionsPart.class); - } - if (met.equals("SectionWrapper")) { - classList.add(SectionWrapper.class); - } - if (met.equals("WordprocessingMLPackage")) { - classList.add(WordprocessingMLPackage.class); - } - } - // 参数类型列表(按方法声明顺序) -// Class[] paramTypes = classList.toArray(new Class[0]); - Class[] paramTypes = {P.class, WordprocessingMLPackage.class}; + Class[] paramTypes = {P.class, StyleDefinitionsPart.class, WordprocessingMLPackage.class, NumberingDefinitionsPart.class}; // 带参数的方法调用示例 Method methodWithArgs = paragraphsFunction.getClass().getMethod(function, paramTypes); // 实际参数值 - Object[] arguments = {paragraph, stylePart}; + Object[] arguments = {paragraph, stylePart, wordMLPackage, ndp}; String value = (String) methodWithArgs.invoke(obj, arguments); judgementWordsVOS = setJudgementWord(judgementWordsVOS, docxFunction + "@" + value, firstName + examName + value); } diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/paragraph/Paragraphs.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/paragraph/Paragraphs.java index eb19c01e..3e6eda13 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/paragraph/Paragraphs.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/utils/wps_word/docx4j/paragraph/Paragraphs.java @@ -19,7 +19,7 @@ public class Paragraphs { * @param stylePart * @return */ - public static String getParagraphAlignment(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphAlignment(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查段落自身 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getJc() != null && pPr.getJc().getVal() != null) { @@ -38,7 +38,7 @@ public class Paragraphs { } // 段落-大纲级别 - public static String getParagraphOutlineLvl(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphOutlineLvl(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getOutlineLvl() != null && pPr.getOutlineLvl().getVal() != null) { @@ -55,7 +55,7 @@ public class Paragraphs { return "正文"; } /// 段落格式(缩进) 左缩进 磅 - public static String getParagraphIndLeft(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphIndLeft(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); PPrBase.Ind ind = pPr.getInd(); if (ind != null) { @@ -76,7 +76,7 @@ public class Paragraphs { return ""; } /// 段落格式(缩进) 右缩进 磅 - public static String getParagraphIndRight(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphIndRight(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); PPrBase.Ind ind = pPr.getInd(); if (ind != null) { @@ -97,7 +97,7 @@ public class Paragraphs { return ""; } /// 段落格式(缩进) 首行缩进 磅 - public static String getParagraphIndFirstLine(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphIndFirstLine(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); PPrBase.Ind ind = pPr.getInd(); if (ind != null) { @@ -118,7 +118,7 @@ public class Paragraphs { return ""; } /// 段落格式(缩进) 悬挂缩进 磅 - public static String getParagraphIndHanging(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphIndHanging(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); PPrBase.Ind ind = pPr.getInd(); if (ind != null) { @@ -140,7 +140,7 @@ public class Paragraphs { } /// 段落格式(间距) 段前行 - public static String getParagraphSpacingBeforeLines(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingBeforeLines(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getBeforeLines().toString(); @@ -156,7 +156,7 @@ public class Paragraphs { return ""; } /// 段落格式(间距) 段前磅 - public static String getParagraphSpacingBefore(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingBefore(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getBefore().toString(); @@ -172,7 +172,7 @@ public class Paragraphs { return ""; } /// 段落格式(间距) 段后磅 - public static String getParagraphSpacingAfter(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingAfter(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getAfter().toString(); @@ -189,7 +189,7 @@ public class Paragraphs { } /// 段落格式(间距) 段后行 - public static String getParagraphSpacingAfterLines(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingAfterLines(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getAfterLines().toString(); @@ -206,7 +206,7 @@ public class Paragraphs { } /// 段落格式(间距) 间距 - public static String getParagraphSpacingLine(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingLine(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getLine().toString(); @@ -223,7 +223,7 @@ public class Paragraphs { } /// 段落格式(间距) 间距值 - public static String getParagraphSpacingLines(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphSpacingLines(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getSpacing() != null) { return pPr.getSpacing().getLine().toString(); @@ -240,7 +240,7 @@ public class Paragraphs { } /// 段落 编号列表 存在 - public static String getParagraphListIsTrue(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListIsTrue(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { return "存在"; @@ -249,7 +249,7 @@ public class Paragraphs { } } /// 段落 编号列表 列表级别 - public static String getParagraphListIlvl(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListIlvl(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { PPrBase.NumPr numPr = pPr.getNumPr(); @@ -260,7 +260,7 @@ public class Paragraphs { } } /// 段落 编号列表 编号样式 - public static String getParagraphListAbstractNumId(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListAbstractNumId(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { PPrBase.NumPr numPr = pPr.getNumPr(); @@ -290,7 +290,7 @@ public class Paragraphs { return "未知"; } /// 段落 编号列表 编号格式 - public static String getParagraphListLvlText(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListLvlText(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { PPrBase.NumPr numPr = pPr.getNumPr(); @@ -320,7 +320,7 @@ public class Paragraphs { return "未知"; } /// 段落 编号列表 项目符号 - public static String getParagraphListLvlFuHao(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListLvlFuHao(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { PPrBase.NumPr numPr = pPr.getNumPr(); @@ -349,7 +349,7 @@ public class Paragraphs { return "未知"; } /// 段落 编号列表 列表类型 - public static String getParagraphListLvlType(P paragraph, NumberingDefinitionsPart ndp) { + public static String getParagraphListLvlType(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getNumPr() != null && pPr.getNumPr().getNumId() != null) { PPrBase.NumPr numPr = pPr.getNumPr(); @@ -383,7 +383,7 @@ public class Paragraphs { } // 段落边框 样式 - public static String getParagraphBorderStyle(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphBorderStyle(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getPBdr() != null) { @@ -409,7 +409,7 @@ public class Paragraphs { } // 段落边框 - 颜色 - public static String getParagraphBorderColor(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphBorderColor(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getPBdr() != null) { @@ -435,7 +435,7 @@ public class Paragraphs { } // 段落边框 - 宽度 - public static String getParagraphBorderSize(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphBorderSize(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getPBdr() != null) { @@ -461,7 +461,7 @@ public class Paragraphs { } // 段落底纹 - 填充颜色 - public static String getParagraphShdFillColor(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphShdFillColor(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getShd() != null) { @@ -472,7 +472,7 @@ public class Paragraphs { } // 段落底纹 - 图案样式 - public static String getParagraphShdStyle(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphShdStyle(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getShd() != null) { @@ -483,7 +483,7 @@ public class Paragraphs { } // 段落底纹 - 图案颜色 - public static String getParagraphShdStyleColor(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphShdStyleColor(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 先查询自身段落数据 PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getShd() != null) { @@ -494,7 +494,7 @@ public class Paragraphs { } // 首字下沉 - 是否存在 - public static String getParagraphDropCapIsTrue(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphDropCapIsTrue(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getFramePr() != null) { return "是"; @@ -505,7 +505,7 @@ public class Paragraphs { // 首字下沉 - 首字位置 - public static String getParagraphDropCapLocation(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphDropCapLocation(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getFramePr() != null) { CTFramePr framePr = pPr.getFramePr(); @@ -517,7 +517,7 @@ public class Paragraphs { } // 首字下沉 - 行数 - public static String getParagraphDropCapLine(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphDropCapLine(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getFramePr() != null) { CTFramePr framePr = pPr.getFramePr(); @@ -529,7 +529,7 @@ public class Paragraphs { } // 首字下沉 - 距正文 - public static String getParagraphDropCapHSpace(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphDropCapHSpace(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getFramePr() != null) { CTFramePr framePr = pPr.getFramePr(); @@ -541,7 +541,7 @@ public class Paragraphs { } // 首字下沉 - 字体 - public static String getParagraphDropCapFont(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphDropCapFont(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr != null && pPr.getFramePr() != null) { // 获取首字字体 @@ -577,7 +577,7 @@ public class Paragraphs { // return "未知"; // } - public static String getParagraphCols(P paragraph, WordprocessingMLPackage wordMLPackage) { + public static String getParagraphCols(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { // 1. 首先检查段落自身的节属性 if (paragraph.getPPr() != null && paragraph.getPPr().getSectPr() != null) { CTColumns cols = paragraph.getPPr().getSectPr().getCols(); @@ -643,7 +643,7 @@ public class Paragraphs { } // 分栏 - 分隔线 - public static String getParagraphColIsSep(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphColIsSep(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); SectPr sectPr = null; sectPr = pPr.getSectPr(); @@ -668,7 +668,7 @@ public class Paragraphs { } // 分栏 - 各栏间距 - public static String getParagraphColSpace(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphColSpace(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); SectPr sectPr = null; sectPr = pPr.getSectPr(); @@ -700,7 +700,7 @@ public class Paragraphs { return "未知"; } // 分栏 - 各栏宽度 - public static String getParagraphColW(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphColW(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); SectPr sectPr = null; sectPr = pPr.getSectPr(); @@ -733,7 +733,7 @@ public class Paragraphs { } // 分栏 - 栏宽相等 - public static String getParagraphColEqualWidth(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphColEqualWidth(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); SectPr sectPr = null; sectPr = pPr.getSectPr(); @@ -756,7 +756,7 @@ public class Paragraphs { } // 中文版式 - 双行合一 - public static String getParagraphCNBidi(P paragraph, StyleDefinitionsPart stylePart) { + public static String getParagraphCNBidi(P paragraph, StyleDefinitionsPart stylePart, WordprocessingMLPackage wordMLPackage, NumberingDefinitionsPart ndp) { PPr pPr = paragraph.getPPr(); if (pPr.getTextAlignment() != null) { PPrBase.TextAlignment textAlignment = pPr.getTextAlignment();