【修改】 删除无用代码,新增docx4j代码读取docx文档

This commit is contained in:
dlaren
2025-07-30 10:39:44 +08:00
parent f96250f868
commit f4c54bd012
34 changed files with 4161 additions and 4253 deletions

View File

@@ -3,7 +3,7 @@ package pc.exam.pp.module.exam.controller.admin.wps.vo.docx;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "考试模块 - PPT考点列表 Request VO")
@Schema(description = "考试模块 - Word考点列表 Request VO")
@Data
public class DocxListReqVO {

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "考试模块 - PPT考点信息 Response VO")
@Schema(description = "考试模块 - Word考点信息 Response VO")
@Data
public class DocxRespVO {
@@ -23,17 +23,9 @@ public class DocxRespVO {
private String chineseName;
private String dataType;
private String functions;
private Integer isText;
private String valueList;
private Integer isTrue;
private Integer titleType;
private Integer isParameter;
private String parameter;
private LocalDateTime createTime;

View File

@@ -3,7 +3,7 @@ package pc.exam.pp.module.exam.controller.admin.wps.vo.docx;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "考试模块 - PPT考点创建/修改 Request VO")
@Schema(description = "考试模块 - Word考点创建/修改 Request VO")
@Data
public class DocxSaveReqVO {
@@ -21,16 +21,8 @@ public class DocxSaveReqVO {
private String chineseName;
private String dataType;
private String parameter;
private Integer isText;
private String valueList;
private Integer isTrue;
private Integer titleType;
private Integer isParameter;
private String functions;
}

View File

@@ -29,13 +29,9 @@ public class ExamWpsDocx extends TenantBaseDO {
private String title;
private Integer sort;
private String chineseName;
private String dataType;
private String functions;
private String parameter;
private Integer status;
private String valueList;
private Integer isTrue;
private Integer isText;
private Integer titleType;
private Integer isParameter;
@TableField(exist = false)
private List<ExamWpsDocx> children = new ArrayList<>();
}

View File

@@ -1,24 +1,24 @@
package pc.exam.pp.module.judgement.controller.admin.AutoWps;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.infra.controller.admin.file.vo.file.FileUploadReqVO;
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsDocxInfoVo;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsPptxJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordReqDto;
import pc.exam.pp.module.judgement.service.wps_excel.JudgementWpsExcelService;
import pc.exam.pp.module.judgement.service.wps_pptx.JudgementWpsPptxService;
import pc.exam.pp.module.judgement.service.wps_word.JudgementWpsWordService;
import pc.exam.pp.module.judgement.utils.wps_pptx.judgementVO.JudgementReqVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.DocxDataInfoVO;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import java.util.List;
@@ -44,13 +44,18 @@ public class AutoWpsController {
/**
* 获取指定考点的数据
* @param wpsDocxInfoVos
* @return
* @throws Exception
*/
@PostMapping("/docxMaster")
public CommonResult<List<JudgementWordsVO>> docxMaster(@RequestBody List<WpsDocxInfoVo> wpsDocxInfoVos) throws Exception {
return CommonResult.success(judgementWpsWordService.docxMaster(wpsDocxInfoVos));
@PostMapping(value = "/docxMaster", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResult<List<JudgementWordsVO>> docxMaster(@RequestPart("data") String jsonData, @RequestPart("file") MultipartFile file) throws Exception {
// 手动解析JSON数组
ObjectMapper objectMapper = new ObjectMapper();
List<WpsDocxInfoVo> wpsDocxInfoVos = objectMapper.readValue(
jsonData,
new TypeReference<List<WpsDocxInfoVo>>() {}
);
return CommonResult.success(judgementWpsWordService.docxMaster(wpsDocxInfoVos, file));
}
/**

View File

@@ -1,6 +1,7 @@
package pc.exam.pp.module.judgement.controller.admin.AutoWps.vo;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
@Data
public class WpsDocxInfoVo {
@@ -20,6 +21,6 @@ public class WpsDocxInfoVo {
// 考点代码
private String examCode;
// 文件路径 理论上都是一样的
private String filePath;
// 方式方法
private String method;
}

View File

@@ -1,25 +1,25 @@
package pc.exam.pp.module.judgement.controller.admin.Browser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pc.exam.pp.module.judgement.controller.service.browser.IBrowserServerice;
@RestController
@RequestMapping("/tool/Browser")
public class BrowserController {
@Autowired
private IBrowserServerice browserServerice;
/**
* 浏览器判分
* @return 得分
*/
// @PostMapping("/run_judgement")
// public CommonResult run_C_code() throws IOException {
// return CommonResult.success(browserServerice.Judgement());
// }
}
//package pc.exam.pp.module.judgement.controller.admin.Browser;
//
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import pc.exam.pp.module.judgement.controller.service.browser.IBrowserServerice;
//
//@RestController
//@RequestMapping("/tool/Browser")
//
//public class BrowserController {
//
// @Autowired
// private IBrowserServerice browserServerice;
// /**
// * 浏览器判分
// * @return 得分
// */
//// @PostMapping("/run_judgement")
//// public CommonResult run_C_code() throws IOException {
//// return CommonResult.success(browserServerice.Judgement());
//// }
//
//}

View File

@@ -1,45 +1,45 @@
package pc.exam.pp.module.judgement.controller.admin.Mysql;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperReqVo;
import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlLocalService;
import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlServerice;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.SQLException;
@RestController
@RequestMapping("/tool/Mysql")
public class MysqlController {
@Autowired
private IMysqlServerice mysqlServerice;
@Autowired
private IMysqlLocalService mysqlLocalService;
/**
* 删除 本地学生的连接和库
* @param tName
* @throws Exception
*/
@GetMapping("/delMysqlConnect")
public void get(@RequestParam("tName") String tName) throws Exception {
mysqlLocalService.delMysqlConnect(tName);
}
/**
* Mysql判分
* @return 得分
*/
// @PostMapping("/run_judgement")
// public CommonResult run_C_code() throws SQLException, IOException {
// return CommonResult.success(mysqlServerice.Judgement( ));
//package pc.exam.pp.module.judgement.controller.admin.Mysql;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//import pc.exam.pp.framework.common.pojo.CommonResult;
//import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperReqVo;
//import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlLocalService;
//import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlServerice;
//
//import java.io.IOException;
//import java.math.BigDecimal;
//import java.sql.SQLException;
//
//@RestController
//@RequestMapping("/tool/Mysql")
//public class MysqlController {
//
//
//
// @Autowired
// private IMysqlServerice mysqlServerice;
// @Autowired
// private IMysqlLocalService mysqlLocalService;
//
// /**
// * 删除 本地学生的连接和库
// * @param tName
// * @throws Exception
// */
// @GetMapping("/delMysqlConnect")
// public void get(@RequestParam("tName") String tName) throws Exception {
// mysqlLocalService.delMysqlConnect(tName);
// }
}
//
// /**
// * Mysql判分
// * @return 得分
// */
//// @PostMapping("/run_judgement")
//// public CommonResult run_C_code() throws SQLException, IOException {
//// return CommonResult.success(mysqlServerice.Judgement( ));
//// }
//
//
//}

View File

@@ -1,27 +1,27 @@
package pc.exam.pp.module.judgement.controller.admin.Mysql;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlServerice;
import pc.exam.pp.module.judgement.controller.service.mysql.testservice;
import java.io.IOException;
import java.sql.SQLException;
@RestController
@RequestMapping("/tool/Test")
public class TestControler {
@Autowired
private testservice testservice;
@PostMapping("/test")
public CommonResult run_C_code() {
return CommonResult.success(testservice.test());
}
}
//package pc.exam.pp.module.judgement.controller.admin.Mysql;
//
//import jakarta.annotation.Resource;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import pc.exam.pp.framework.common.pojo.CommonResult;
//import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlServerice;
//import pc.exam.pp.module.judgement.controller.service.mysql.testservice;
//
//import java.io.IOException;
//import java.sql.SQLException;
//
//@RestController
//@RequestMapping("/tool/Test")
//public class TestControler {
//
// @Autowired
// private testservice testservice;
//
// @PostMapping("/test")
// public CommonResult run_C_code() {
// return CommonResult.success(testservice.test());
// }
//
//}

View File

@@ -3,7 +3,6 @@ package pc.exam.pp.module.judgement.controller.admin.Ps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pc.exam.pp.module.judgement.controller.service.mysql.IMysqlServerice;
import pc.exam.pp.module.judgement.controller.service.ps.IPsService;
@RestController

View File

@@ -1,37 +1,37 @@
package pc.exam.pp.module.judgement.controller.admin.WindowFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.judgement.controller.service.file.IFileServerice;
import pc.exam.pp.module.judgement.utils.EndStuMonitorUtils;
import java.io.IOException;
/**
* 文件操作题判分
* rwb
*/
@RestController
@RequestMapping("/tool/File")
public class WindowsFileController {
@Autowired
private IFileServerice fileServerice;
/**
* 文件操作题判分
* @return 判分
*/
// @PostMapping("/run_judgement")
// public CommonResult run_file_point() throws IOException {
// //"权值得分比重"
// return CommonResult.success(fileServerice.run_file_point());
// }
}
//package pc.exam.pp.module.judgement.controller.admin.WindowFile;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import pc.exam.pp.framework.common.pojo.CommonResult;
//import pc.exam.pp.module.judgement.controller.service.file.IFileServerice;
//import pc.exam.pp.module.judgement.utils.EndStuMonitorUtils;
//
//import java.io.IOException;
//
///**
// * 文件操作题判分
// * rwb
// */
//
//@RestController
//@RequestMapping("/tool/File")
//public class WindowsFileController {
//
// @Autowired
// private IFileServerice fileServerice;
//
//
//
// /**
// * 文件操作题判分
// * @return 判分
// */
//// @PostMapping("/run_judgement")
//// public CommonResult run_file_point() throws IOException {
//// //"权值得分比重"
//// return CommonResult.success(fileServerice.run_file_point());
//// }
//
//}

View File

@@ -2,30 +2,15 @@ package pc.exam.pp.module.judgement.controller.admin.Wps;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsDocxInfoVo;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsPptxJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordReqDto;
import pc.exam.pp.module.judgement.service.wps_excel.JudgementWpsExcelService;
import pc.exam.pp.module.judgement.service.wps_pptx.JudgementWpsPptxService;
import pc.exam.pp.module.judgement.service.wps_word.JudgementWpsWordService;
//import pc.exam.pp.module.judgement.utils.wps_excel.vo.ExcelInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.ExcelInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.XlsxVO;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_all.XlsxAllDataReqVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_drawing.XlsxInfoVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_style.XlsxStyleVO;
import pc.exam.pp.module.judgement.utils.wps_pptx.judgementVO.JudgementReqVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoPointsVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxVO;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordVO;
import java.util.List;
@@ -49,10 +34,10 @@ public class WpsController {
JudgementWpsExcelService judgementWpsExcelService;
@PostMapping("/docxMaster")
public CommonResult<List<JudgementWordsVO>> docxMaster(@RequestBody List<WpsDocxInfoVo> wpsDocxInfoVos) throws Exception {
return CommonResult.success(judgementWpsWordService.docxMaster(wpsDocxInfoVos));
}
// @PostMapping("/docxMaster")
// public CommonResult<List<JudgementWordsVO>> docxMaster(@RequestBody List<WpsDocxInfoVo> wpsDocxInfoVos) throws Exception {
// return CommonResult.success(judgementWpsWordService.docxMaster(wpsDocxInfoVos));
// }
// /**
// * wps word
// * @return 判分

View File

@@ -10,26 +10,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperFileDO;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperInfoDO;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperScoreDO;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperQuMapper;
import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionMapper;
import pc.exam.pp.module.exam.dal.mysql.student.StuScoreVo;
import pc.exam.pp.module.exam.service.question.IExamQuestionService;
import pc.exam.pp.module.exam.service.stuPaperInfo.StuPaperInfoService;
import pc.exam.pp.module.exam.service.stuPaperScore.StuPaperScoreService;
import pc.exam.pp.module.exam.service.stu_paper_file.StuPaperFileService;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperReqVo;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperScoreInfoVo;
//import pc.exam.pp.module.judgement.service.auto_tools.AutoToolsService;
import pc.exam.pp.module.judgement.service.c_programming.JudgementService;
import pc.exam.pp.module.judgement.service.wps_excel.JudgementWpsExcelService;
import pc.exam.pp.module.judgement.service.wps_pptx.JudgementWpsPptxService;
import pc.exam.pp.module.judgement.service.wps_word.JudgementWpsWordService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -51,11 +39,6 @@ public class AutoToolsController {
@Resource
ExamQuestionMapper examQuestionMapper;
// @GetMapping("/get")
// public CommonResult<BigDecimal> get(StuPaperReqVo stuPaperReqVo) throws Exception {
// return autoToolsService.judgementScore(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId());
// }
@GetMapping("/getStuScoreInfo")
@Operation(summary = "通过学生ID、试卷ID获取")
public CommonResult<StuPaperScoreInfoVo> getStuScore(StuPaperReqVo stuPaperReqVo){
@@ -76,9 +59,6 @@ public class AutoToolsController {
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 一条一条进行查询试题,防止顺序错乱
// for (String quId : quIds) {
// examQuestionList.add(examQuestionMapper.selectExamQuestionByQuId(quId));
// }
stuPaperScoreInfoVos.setExamQuestionList(examQuestionList);
// 5、查询学生试卷分析
List<StuPaperScoreDO> scoreDOS = stuPaperScoreService.findByStuIDAndPaperId(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId());

View File

@@ -1,176 +1,40 @@
package pc.exam.pp.module.judgement.controller.service.browser;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionAnswerMapper;
import pc.exam.pp.module.judgement.controller.utils.brower.BookmarkChecker;
import pc.exam.pp.module.judgement.controller.utils.brower.BookmarkDeleter;
import pc.exam.pp.module.exam.utils.file.GetDifferencesBetweenFolders;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.HtmlAppender;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class BrowserServericeImpl implements IBrowserServerice {
static String answerLogPath ; // 文件路径
@Resource
private ExamQuestionAnswerMapper examQuestionAnswerMapper;
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//考生试题文件夹
// static final String BASE_DIR = "D:/exam/4/";
//谷歌浏览器
String chromeBookmarkPath = System.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Bookmarks";
@Override
public SourceAndText Judgement(double score, File file, ExamQuestion question, String judgementStr) throws IOException {
//根据题目,查找考点
//得到该试题的得分点
//Net得分点 文件类型 文件名 考点权值
// 添加到文件夹 1
// 添加到收藏夹 2
// List<ExamQuestionAnswer> answerList=new ArrayList<>();
// answerList.add(new ExamQuestionAnswer("","","","","人民大学", "添加到文件夹 ", "1", "1"));
// answerList.add(new ExamQuestionAnswer("","","","","校情", "添加到文件夹", "1", "2"));
// answerList.add(new ExamQuestionAnswer("","","","","机构", "添加到文件夹", "1", "3"));
SourceAndText sourceAndText = new SourceAndText();
List<ExamQuestionAnswer> answerList = examQuestionAnswerMapper.selectExamQuestionAnswerByQuId(question.getQuId());
//判断如果类型为1为添加到文件夹的html后缀加 .html
// for (ExamQuestionAnswer answer : answerList) {
// if ("添加到文件夹".equals(answer.getContentIn())) {
// String fileName = answer.getContent();
// if (!fileName.endsWith(".html")) {
// answer.setContent(fileName + ".html");
// }
//package pc.exam.pp.module.judgement.controller.service.browser;
//
//import jakarta.annotation.Resource;
//import org.springframework.stereotype.Service;
//import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionAnswerMapper;
//
//import java.io.BufferedWriter;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//
//@Service
//public class BrowserServericeImpl implements IBrowserServerice {
// static String answerLogPath ; // 文件路径
// @Resource
// private ExamQuestionAnswerMapper examQuestionAnswerMapper;
// private static final DateTimeFormatter formatter =
// DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// //考生试题文件夹
//// static final String BASE_DIR = "D:/exam/4/";
// //谷歌浏览器
// String chromeBookmarkPath = System.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Bookmarks";
// /**
// * 将指定内容追加写入到指定文件中。
// *
// * @param filePath 文件路径
// * @param content 要写入的内容
// */
// public static void appendToFile(String filePath, String content) {
// try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
// String timestamp = LocalDateTime.now().format(formatter);
// String logLine = String.format("[%s] %s", timestamp, content);
// writer.write(logLine);
// writer.newLine(); // 可选:添加换行符
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//分为两点1文件夹-- 去考生文件夹去找 文件名
// 2收藏夹--去浏览器去找 根据值 文件名 查找
// 找到后 —————— +权值 ,根据文件名删除
answerLogPath = file.getParent() + File.separator + "log.txt";
//根据路径,得到考生答题文件集合
Map<String, String> stuFiles = GetDifferencesBetweenFolders.listFilesAndFoldersWithAttributes(file.toPath());
// 输出学生提交的内容
// appendToFile(answerLogPath,"=== 学生提交内容stu 目录) ===");
//
// stuFiles.forEach((key, value) -> appendToFile(answerLogPath,key + " -> " + value));
appendToFile(answerLogPath,"=== 学生提交内容得分点 ===");
judgementStr = HtmlAppender.appendHtmlLine(judgementStr,"=== 学生提交内容得分点 ===");
// 计算试题总分
int totalScore = answerList.stream()
.mapToInt(a -> Integer.parseInt(a.getScoreRate()))
.sum();
//这里指挥判断存在文件夹的得分点
SourceAndText studentScorePojo = compareStuAndTestFiles(answerList, stuFiles,score,totalScore,judgementStr);
double studentScore = studentScorePojo.getScore();
judgementStr = studentScorePojo.getText();
//判断收藏夹得分点
for (ExamQuestionAnswer examQuestionAnswer : answerList) {
int currentScore = Integer.parseInt(examQuestionAnswer.getScoreRate()); // 当前得分
if ( "添加到收藏夹".equals(examQuestionAnswer.getContentIn())){
String bookmarkNameToDelete = examQuestionAnswer.getContent();
//检查收藏夹是否有书签
boolean isCorrect = BookmarkChecker.bookmarkExists(chromeBookmarkPath, bookmarkNameToDelete);
if (isCorrect) {
//如果有 +权值
studentScore += currentScore;
// 计算该考点的权重得分并保留一位小数
double weightScore = ((double) currentScore / totalScore) * score;
String formattedWeightScore = String.format("%.1f", weightScore);
appendToFile(answerLogPath,"✅考点"+bookmarkNameToDelete + " -> 得分权值:" + currentScore+"-> 得分:"+formattedWeightScore);
judgementStr = HtmlAppender.appendHtmlLine(judgementStr,"✅考点"+bookmarkNameToDelete + " -> 得分权值:" + currentScore+"-> 得分:"+formattedWeightScore);
//删除此书签
BookmarkDeleter.deleteBookmarkByName(chromeBookmarkPath, bookmarkNameToDelete);
}
else {
appendToFile(answerLogPath,"❌考点"+bookmarkNameToDelete + " -> 得分权值:" + currentScore+"-> 得分0");
judgementStr = HtmlAppender.appendHtmlLine(judgementStr,"❌考点"+bookmarkNameToDelete + " -> 得分权值:" + currentScore+"-> 得分0");
}
}
}
// 计算最终得分比例(保留两位小数)
double scoreRatio = totalScore == 0 ? 0 : (double) studentScore / totalScore;
double roundedScoreRatio = Math.round(scoreRatio * 100.0) / 100.0; // 四舍五入到2位小数
appendToFile(answerLogPath," 得分:"+roundedScoreRatio*score);
sourceAndText.setScore(roundedScoreRatio*score);
sourceAndText.setText(judgementStr);
return sourceAndText;
}
// 对比学生提交内容与试题得分点
static SourceAndText compareStuAndTestFiles(List<ExamQuestionAnswer> answerList, Map<String, String> stuFiles,double score,int total, String judgementStr) {
int totalScore = 0; // 记录总得分
SourceAndText sourceAndText = new SourceAndText();
for (ExamQuestionAnswer answer : answerList) {
if ("添加到文件夹".equals(answer.getContentIn())) {
String filePath = answer.getContent(); // 试题文件路径
int currentScore = Integer.parseInt(answer.getScoreRate()); // 当前得分
boolean isCorrect = false;
// 如果学生提交中存在该文件,则得分
isCorrect = stuFiles.containsKey(filePath);
// 如果正确,则累加总分
if (isCorrect) {
totalScore += currentScore;
// 计算该考点的权重得分并保留一位小数
double weightScore = ((double) currentScore / total) * score;
String formattedWeightScore = String.format("%.1f", weightScore);
appendToFile(answerLogPath,"✅考点"+answer.getContent() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分:"+formattedWeightScore);
judgementStr = HtmlAppender.appendHtmlLine(judgementStr,"✅考点"+answer.getContent() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分:"+formattedWeightScore);
}else {
appendToFile(answerLogPath,"❌考点"+answer.getContent() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分0");
judgementStr = HtmlAppender.appendHtmlLine(judgementStr,"❌考点"+answer.getContent() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分0");
}
}
}
//返回累加的得分点
sourceAndText.setScore(totalScore);
sourceAndText.setText(judgementStr);
return sourceAndText;
}
/**
* 将指定内容追加写入到指定文件中。
*
* @param filePath 文件路径
* @param content 要写入的内容
*/
public static void appendToFile(String filePath, String content) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
String timestamp = LocalDateTime.now().format(formatter);
String logLine = String.format("[%s] %s", timestamp, content);
writer.write(logLine);
writer.newLine(); // 可选:添加换行符
} catch (IOException e) {
e.printStackTrace();
}
}
}
//}

View File

@@ -1,13 +1,10 @@
package pc.exam.pp.module.judgement.controller.service.browser;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import java.io.File;
import java.io.IOException;
public interface IBrowserServerice {
SourceAndText Judgement(double score, File file, ExamQuestion question, String judgementStr) throws IOException;
}
//package pc.exam.pp.module.judgement.controller.service.browser;
//
//import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
//import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
//
//import java.io.File;
//import java.io.IOException;
//
//public interface IBrowserServerice {
//}

View File

@@ -1,142 +1,18 @@
package pc.exam.pp.module.judgement.controller.service.file;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionAnswerMapper;
import pc.exam.pp.module.exam.utils.file.GetDifferencesBetweenFolders;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.HtmlAppender;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@Service
public class FileServericeImpl implements IFileServerice {
static String answerLogPath ; // 文件路径
@Resource
private ExamQuestionAnswerMapper examQuestionAnswerMapper;
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public SourceAndText run_file_point(double score, File file, ExamQuestion question, String judgementStr) throws IOException {
SourceAndText sourceAndText = new SourceAndText();
List<ExamQuestionAnswer> answerList = examQuestionAnswerMapper.selectExamQuestionAnswerByQuId(question.getQuId());
//todo 得到学生的考题答案
// List<ExamQuestionAnswer> answerList=new ArrayList<>();
// answerList.add(new ExamQuestionAnswer("","","","","HGACYL\\RLQM.MEM", "考察删除", "1", "1"));
// answerList.add(new ExamQuestionAnswer("","","","","TING\\XYU\\AUTOE.BAT", "考察删除", "1", "2"));
// answerList.add(new ExamQuestionAnswer("","","","","AHEWL\\KMENS", "考察名称", "1", "3"));
// answerList.add(new ExamQuestionAnswer("","","","","EDZK\\RONGHE.COM", "考察名称", "1", "4"));
// answerList.add(new ExamQuestionAnswer("","","","","HGACYL\\PLAY.MEM", "考察名称", "1", "5"));
// answerList.add(new ExamQuestionAnswer("","","","","WUE\\PB6.txt", "考察名称", "1", "6"));
File stuPath = file;
// 设置日志文件路径为file所在目录下的answerLogFile.txt
answerLogPath = file.getParent() + File.separator + "log.txt";
System.out.println(answerLogPath);
// 获取 stu 文件夹的内容
Map<String, String> stuFiles = GetDifferencesBetweenFolders.listFilesAndFoldersWithAttributes(stuPath.toPath());
// 输出学生提交的内容
// appendToFile(answerLogPath,"=== 学生提交内容stu 目录) ===");
//package pc.exam.pp.module.judgement.controller.service.file;
//
// stuFiles.forEach((key, value) -> appendToFile(answerLogPath,key + " -> " + value));
// 计算试题总分
int totalScore = answerList.stream()
.mapToInt(a -> Integer.parseInt(a.getScoreRate()))
.sum();
appendToFile(answerLogPath,"=== 学生提交内容得分点 ===");
judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "=== 学生提交内容得分点 ===");
// 对比学生提交内容与试题得分点
SourceAndText studentScorePojo = compareStuAndTestFiles(answerList, stuFiles,score,totalScore,judgementStr);
double studentScore = studentScorePojo.getScore();
judgementStr = studentScorePojo.getText();
//获取answerList里的所有sorcerate,和integer相除得到一个小于等于1的数
// 计算最终得分比例(保留两位小数)
double scoreRatio = totalScore == 0 ? 0 : (double) studentScore / totalScore;
double roundedScoreRatio = Math.round(scoreRatio * 100.0) / 100.0; // 四舍五入到2位小数
appendToFile(answerLogPath,"得分:"+roundedScoreRatio*score);
judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "得分:"+roundedScoreRatio*score);
sourceAndText.setScore(roundedScoreRatio*score);
sourceAndText.setText(judgementStr);
return sourceAndText;
}
// 对比学生提交内容与试题得分点
static SourceAndText compareStuAndTestFiles(List<ExamQuestionAnswer> answerList, Map<String, String> stuFiles,double score,int total, String judgementStr) {
SourceAndText sourceAndText = new SourceAndText();
int totalScore = 0; // 记录总得分
for (ExamQuestionAnswer answer : answerList) {
String filePath = answer.getContent(); // 试题文件路径
String checkType = answer.getContentIn(); // 考察类型(考察删除 / 考察名称 / 考察属性)
int currentScore = Integer.parseInt(answer.getScoreRate()); // 当前得分
boolean isCorrect = false;
if ("考察删除".equals(checkType)) {
// 如果学生提交中不存在该文件,则得分
isCorrect = !stuFiles.containsKey(filePath);
} else if ("考察名称".equals(checkType)) {
// 如果学生提交中存在该文件,则得分
isCorrect = stuFiles.containsKey(filePath);
} else if ("考察属性".equals(checkType)) {
// 如果学生提交中存在该文件,且属性匹配,则得分
if (stuFiles.containsKey(filePath)) {
String studentAttrs = stuFiles.get(filePath); // 学生提交的属性
String expectedAttrs = answer.getAttribute(); // 试题中期望的属性
isCorrect = studentAttrs.equals(expectedAttrs);
}
}
// 如果正确,则累加总分
if (isCorrect) {
totalScore += currentScore;
// 计算该考点的权重得分并保留一位小数
double weightScore = ((double) currentScore / total) * score;
String formattedWeightScore = String.format("%.1f", weightScore);
appendToFile(answerLogPath,""+answer.getContent() + " -> " + answer.getContentIn() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分:"+formattedWeightScore);
judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "" + answer.getContent() + " -> " + answer.getContentIn() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分:"+formattedWeightScore);
}else {
appendToFile(answerLogPath,""+answer.getContent() + " -> " + answer.getContentIn() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分0");
judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "" + answer.getContent() + " -> " + answer.getContentIn() + " -> 得分权值:" + answer.getScoreRate()+"-> 得分0");
}
}
sourceAndText.setText(judgementStr);
sourceAndText.setScore(totalScore);
//返回累加的总分
return sourceAndText;
}
/**
* 将指定内容追加写入到指定文件中。
*
* @param filePath 文件路径
* @param content 要写入的内容
*/
public static void appendToFile(String filePath, String content) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
String timestamp = LocalDateTime.now().format(formatter);
String logLine = String.format("[%s] %s", timestamp, content);
writer.write(logLine);
writer.newLine(); // 可选:添加换行符
} catch (IOException e) {
e.printStackTrace();
}
}
}
//import jakarta.annotation.Resource;
//import org.springframework.stereotype.Service;
//import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionAnswerMapper;
//
//import java.time.format.DateTimeFormatter;
//
//
//@Service
//public class FileServericeImpl implements IFileServerice {
// static String answerLogPath ; // 文件路径
// @Resource
// private ExamQuestionAnswerMapper examQuestionAnswerMapper;
// private static final DateTimeFormatter formatter =
// DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//
//}

View File

@@ -1,20 +1,7 @@
package pc.exam.pp.module.judgement.controller.service.file;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import java.io.File;
import java.io.IOException;
import java.util.List;
public interface IFileServerice {
SourceAndText run_file_point(double score, File file, ExamQuestion question, String judgementStr) throws IOException;
}
//package pc.exam.pp.module.judgement.controller.service.file;
//
//
//public interface IFileServerice {
//
//
//}

View File

@@ -1,16 +1,16 @@
package pc.exam.pp.module.judgement.controller.service.mysql;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
public interface IMysqlLocalService {
SourceAndText Judgement(double sorce, File file, ExamQuestion examQuestion, String judgementStr) throws IOException, SQLException;
void delMysqlConnect(String tName);
}
//package pc.exam.pp.module.judgement.controller.service.mysql;
//
//import pc.exam.pp.framework.common.pojo.CommonResult;
//import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
//import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
//
//import java.io.File;
//import java.io.IOException;
//import java.sql.SQLException;
//
//public interface IMysqlLocalService {
// SourceAndText Judgement(double sorce, File file, ExamQuestion examQuestion, String judgementStr) throws IOException, SQLException;
//
// void delMysqlConnect(String tName);
//
//}

View File

@@ -1,20 +1,20 @@
package pc.exam.pp.module.judgement.controller.service.mysql;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public interface IMysqlServerice {
SourceAndText Judgement(double sorce, File file, ExamQuestion examQuestion, String judgementStr) throws IOException, SQLException;
}
//package pc.exam.pp.module.judgement.controller.service.mysql;
//
//
//import pc.exam.pp.framework.common.pojo.CommonResult;
//import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
//import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
//import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
//
//import java.io.File;
//import java.io.IOException;
//import java.sql.SQLException;
//import java.util.List;
//import java.util.concurrent.atomic.AtomicInteger;
//
//public interface IMysqlServerice {
// SourceAndText Judgement(double sorce, File file, ExamQuestion examQuestion, String judgementStr) throws IOException, SQLException;
//
//
//
////}

View File

@@ -1,23 +1,23 @@
package pc.exam.pp.module.judgement.controller.service.mysql;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperMapper;
import pc.exam.pp.module.judgement.utils.EndStuMonitorUtils;
@Service
public class testServiceImpl implements testservice {
@Autowired
private EndStuMonitorUtils endStuMonitorUtils;
@Override
public boolean test() {
// String s = endStuMonitorUtils.endStuMonitor("160", "2bf4510550e34d85a852394cea61b455");
//package pc.exam.pp.module.judgement.controller.service.mysql;
//
// endStuMonitorUtils.endStuMonitor("160","2bf4510550e34d85a852394cea61b455",20.0);
return true;
}
}
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperMapper;
//import pc.exam.pp.module.judgement.utils.EndStuMonitorUtils;
//
//@Service
//public class testServiceImpl implements testservice {
//
// @Autowired
// private EndStuMonitorUtils endStuMonitorUtils;
// @Override
// public boolean test() {
//
//
//// String s = endStuMonitorUtils.endStuMonitor("160", "2bf4510550e34d85a852394cea61b455");
////
//// endStuMonitorUtils.endStuMonitor("160","2bf4510550e34d85a852394cea61b455",20.0);
// return true;
// }
//
//}

View File

@@ -1,7 +1,7 @@
package pc.exam.pp.module.judgement.controller.service.mysql;
public interface testservice {
boolean test();
}
//package pc.exam.pp.module.judgement.controller.service.mysql;
//
//public interface testservice {
// boolean test();
//
//
//}

View File

@@ -2,16 +2,7 @@ package pc.exam.pp.module.judgement.service.wps_excel;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsPptxJudgementDto;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.XlsxVO;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_all.XlsxAllDataReqVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_drawing.XlsxInfoVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_style.XlsxStyleVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordVO;
import java.io.FileNotFoundException;
import java.util.List;
/**

View File

@@ -4,18 +4,10 @@ package pc.exam.pp.module.judgement.service.wps_excel;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.exam.utils.file.LogFileUtils;
import pc.exam.pp.module.infra.dal.dataobject.config.ConfigDO;
import pc.exam.pp.module.infra.service.config.ConfigService;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsPptxJudgementDto;
import pc.exam.pp.module.judgement.dal.mysql.wpsxlsx.WpsXlsxLinkMapper;
//import pc.exam.pp.module.judgement.service.auto_tools.AutoToolsService;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.HtmlAppender;
import pc.exam.pp.module.judgement.utils.wps_excel.WpsExcelUtils;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_drawing.XlsxInfoVo;
import java.io.*;
import java.net.URL;
@@ -25,9 +17,6 @@ import java.util.List;
@Service
public class JudgementWpsExcelServiceImpl implements JudgementWpsExcelService {
@Resource
WpsXlsxLinkMapper wpsXlsxLinkMapper;
// @Resource
// AutoToolsService autoToolsService;

View File

@@ -2,18 +2,12 @@ package pc.exam.pp.module.judgement.service.wps_pptx;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.exam.utils.file.LogFileUtils;
import pc.exam.pp.module.infra.dal.dataobject.config.ConfigDO;
import pc.exam.pp.module.infra.service.config.ConfigService;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsPptxJudgementDto;
//import pc.exam.pp.module.judgement.service.auto_tools.AutoToolsService;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.HtmlAppender;
import pc.exam.pp.module.judgement.utils.wps_pptx.JudgementWpsPPT;
import pc.exam.pp.module.judgement.utils.wps_pptx.judgementVO.JudgementReqVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoPointsVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoReqVo;
import pc.exam.pp.module.system.dal.dataobject.user.AdminUserDO;
import pc.exam.pp.module.system.service.user.AdminUserService;
@@ -21,7 +15,6 @@ import pc.exam.pp.module.system.service.user.AdminUserService;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import static pc.exam.pp.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;

View File

@@ -1,19 +1,11 @@
package pc.exam.pp.module.judgement.service.wps_word;
import org.springframework.web.multipart.MultipartFile;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsDocxInfoVo;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordReqDto;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.DocxDataInfoVO;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordVO;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -23,20 +15,7 @@ import java.util.List;
*/
public interface JudgementWpsWordService {
List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos) throws Exception;
List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos, MultipartFile file) throws Exception;
List<DocxDataInfoVO> docxDataInfo(MultipartFile file) throws Exception;
// /**
// * 获取word文件内得考点及描述
// * @param path minio文件路径
// * @return 文件内得考点及描述
// * @throws Exception 异常
// */
// List<WordInfoReqVo> programmingWpsWord(String path) throws Exception;
//
// List<WpsWordJudgementDto> programmingInfo(List<WpsWordReqDto> wpsWordReqDtos) throws Exception;
//
}

View File

@@ -3,36 +3,16 @@ package pc.exam.pp.module.judgement.service.wps_word;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion;
import pc.exam.pp.module.exam.dal.dataobject.ExamQuestionAnswer;
import pc.exam.pp.module.exam.utils.file.LogFileUtils;
import pc.exam.pp.module.infra.dal.dataobject.config.ConfigDO;
import pc.exam.pp.module.infra.service.config.ConfigService;
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsDocxInfoVo;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordChineseFunctionDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordJudgementDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.dto.WpsWordReqDto;
import pc.exam.pp.module.judgement.controller.admin.Wps.vo.WordListReqVO;
import pc.exam.pp.module.judgement.service.auto_tools.vo.SourceAndText;
import pc.exam.pp.module.judgement.utils.HtmlAppender;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.DocxConversion;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.DocxMaster;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.DocxDataInfoVO;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordVO;
import pc.exam.pp.module.system.dal.dataobject.user.AdminUserDO;
import pc.exam.pp.module.system.service.user.AdminUserService;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import static pc.exam.pp.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Service
public class JudgementWpsWordServiceImpl implements JudgementWpsWordService {
@@ -42,50 +22,27 @@ public class JudgementWpsWordServiceImpl implements JudgementWpsWordService {
@Resource
private AdminUserService userService;
/**
* 指定考点查询
* @param wpsDocxInfoVos 查询考点参数数组
* @param file 文件流
* @return 考点信息
* @throws Exception 异常
*/
@Override
public List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos) throws Exception {
return DocxMaster.docxMaster(wpsDocxInfoVos);
public List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos, MultipartFile file) throws Exception {
return DocxMaster.docxMaster(wpsDocxInfoVos, file);
}
/**
* 查询docx所有考点
* @param file 文件流
* @return 所有考点
* @throws Exception 异常
*/
@Override
public List<DocxDataInfoVO> docxDataInfo(MultipartFile file) throws Exception {
return DocxConversion.DocxDataInfos(file);
}
// @Override
// public List<WordInfoReqVo> programmingWpsWord(String path) throws Exception {
// String pathName = "";
// String[] strPaht = path.split("/");
// // 1、获取文件临时下载路径
// ConfigDO config = configService.getConfigByKey("file_down_wps_word_path");
// AdminUserDO user = userService.getUser(getLoginUserId());
//// Path paths = Paths.get(config.getValue() + "\\" + user.getId());
//// if (Files.exists(paths)) {
//// pathName = config.getValue() + "\\" + user.getId() + "\\" + strPaht[strPaht.length - 1];
//// } else {
// // 2、下载文件并返回文件完整路径
// pathName = autoToolsService.downloadStudentFile(path, config.getValue() + "\\" + user.getId());
//// }
// // 4、docx文件读取并返回考点及说明信息
// List<WordInfoReqVo> margins = WpsWordUtils.wpWord(pathName);
// // 5、已经读取完得考点删除源文件
//// File file = new File(pathName);
//// file.delete();
// return margins;
// }
//
// @Override
// public List<WpsWordJudgementDto> programmingInfo(List<WpsWordReqDto> wordReqDto) throws Exception {
//// List<WpsWordChineseFunctionDto> functionList = new ArrayList<>();
//// for (String function : wordReqDto.getFunction()) {
//// WpsWordChineseFunctionDto functionDto = new WpsWordChineseFunctionDto();
//// functionDto.setFunction(function);
//// WpsWordLinkDO wpsWordLinkDO = wpsWordLinkMapper.selectByNodeFunction(function);
//// functionDto.setChineseName(wpsWordLinkDO.getToChinese());
//// functionList.add(functionDto);
//// }
// List<WpsWordJudgementDto> judgementDtos = WpsWordUtils.getWordInfo(wordReqDto);
// return judgementDtos;
// }
}

View File

@@ -15,8 +15,6 @@ import pc.exam.pp.module.judgement.utils.wps_excel.vo.*;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_chart.ChartTypeEntry;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_drawing.XlsxInfoVo;
import pc.exam.pp.module.judgement.utils.wps_excel.vo.xlsx_drawing.XlsxDrawingSheetVo;
import pc.exam.pp.module.judgement.utils.wps_pptx.vo.PptxInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import javax.xml.namespace.QName;
import java.io.FileInputStream;

View File

@@ -4,13 +4,10 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.springframework.web.multipart.MultipartFile;
import pc.exam.pp.module.judgement.utils.wps_word.WpsWordNameSpaces;
import pc.exam.pp.module.judgement.utils.wps_word.XmlUtil;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.DocxDataInfoVO;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordInfoReqVo;
import pc.exam.pp.module.judgement.utils.wps_word.vo.WordSecondInfoVo;
import pc.exam.pp.module.judgement.utils.wps_word.utils.WpsWordNameSpaces;
import pc.exam.pp.module.judgement.utils.wps_word.utils.XmlUtil;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@@ -32,6 +29,7 @@ public class DocxConversion {
String xmlString = XmlUtil.getDocumentXml(document);
String namespace = WpsWordNameSpaces.getNameSpace(xmlString);
XmlObject docXml = document.getDocument();
// 1、获取文档段落W:P标签得数量判断出一个有多少段
XmlCursor wpCursor = docXml.newCursor();
@@ -41,7 +39,6 @@ public class DocxConversion {
// 段落
String firstIdWp = getStringRandom();
setWordDataInfo(firstIdWp, "", "段落", "w:p", "", false, dataInfoVOS);
List<WordSecondInfoVo> wordSecondWp = new ArrayList<>();
while (wpCursor.toNextSelection()) {
wpIndex ++;
// 段落属性
@@ -73,7 +70,6 @@ public class DocxConversion {
int wSectPrIndex = 0;
String firstIdSectPr = getStringRandom();
setWordDataInfo(firstIdSectPr, "", "页面", "w:sectPr", "", false, dataInfoVOS);
List<WordSecondInfoVo> wordSecondWSectPr = new ArrayList<>();
while (wSectPrCursor.toNextSelection()) {
wSectPrIndex ++;
String secondIdSectPr = getStringRandom();

View File

@@ -21,6 +21,7 @@ import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart;
import org.docx4j.w14.CTWordContentPart;
import org.docx4j.wml.*;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Node;
import pc.exam.pp.module.judgement.controller.admin.AutoWps.vo.WpsDocxInfoVo;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.paragraph.Convert;
@@ -32,6 +33,7 @@ import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigInteger;
@@ -43,18 +45,31 @@ import java.util.List;
*/
public class DocxMaster {
public static List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos) throws Docx4JException, InvalidFormatException, IOException, JAXBException, XmlException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
/**
*
* @param wpsDocxInfoVos 考点参数
* @param file 文件流
* @return
* @throws Docx4JException
* @throws InvalidFormatException
* @throws IOException
* @throws JAXBException
* @throws XmlException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static List<JudgementWordsVO> docxMaster(List<WpsDocxInfoVo> wpsDocxInfoVos, MultipartFile file) throws Docx4JException, InvalidFormatException, IOException, JAXBException, XmlException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// 一共分为 段落, 页面,图形
String firstDuanLuoId = Convert.getStringRandom();
String firstYeMianId = Convert.getStringRandom();
String firstTuXingId = Convert.getStringRandom();
List<JudgementWordsVO> judgementWordsVOS = new ArrayList<>();
// 1、获取想要判断的文件地址
String path = wpsDocxInfoVos.get(0).getFilePath();
// 1、获取想要判断的文件地址(文件流)
InputStream inputStream = file.getInputStream();
// 2、Docx转换对象
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(path));
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream);
List<Object> paragraphs = wordMLPackage.getMainDocumentPart().getContent();
// 2-1、样式对象
StyleDefinitionsPart stylePart = wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart();
@@ -62,6 +77,7 @@ public class DocxMaster {
NumberingDefinitionsPart ndp = wordMLPackage.getMainDocumentPart().getNumberingDefinitionsPart();
// 2-3、节对象
List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();
wordMLPackage.getHeaderFooterPolicy().getDefaultFooter();
for (WpsDocxInfoVo wpsDocxInfoVo : wpsDocxInfoVos) {
// 参数实例化
// 大类名称
@@ -74,7 +90,9 @@ public class DocxMaster {
String examName = wpsDocxInfoVo.getExamName();
// 考点代码
String examCode = wpsDocxInfoVo.getExamCode();
// 方式方法
String method = wpsDocxInfoVo.getMethod();
String docxFunction = firstName + "#" + indexParm + "#" + function + "#" + examName + "#" + examCode + "#" + method;
// 创建一个索引ID跟参数中index进行匹配
int index = 0;
for (Object obj : paragraphs) {
@@ -89,14 +107,35 @@ public class DocxMaster {
// 查询出具体想要查询哪个段落的数据
// 目标对象
Paragraphs paragraphsFunction = new Paragraphs();
// 获取参数中类型的定义
String[] methods = method.split("@");
List<Class<?>> 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 = {P.class, StyleDefinitionsPart.class};
// Class<?>[] paramTypes = classList.toArray(new Class<?>[0]);
Class<?>[] paramTypes = {P.class, WordprocessingMLPackage.class};
// 带参数的方法调用示例
Method methodWithArgs = paragraphsFunction.getClass().getMethod(function, paramTypes);
// 实际参数值
Object[] arguments = {paragraph, stylePart};
String value = (String) methodWithArgs.invoke(obj, arguments);
judgementWordsVOS = setJudgementWord(judgementWordsVOS, examCode + "@" + value, firstName + examName + value);
judgementWordsVOS = setJudgementWord(judgementWordsVOS, docxFunction + "@" + value, firstName + examName + value);
}
}
}

View File

@@ -1,14 +1,13 @@
package pc.exam.pp.module.judgement.utils.wps_word.docx4j.paragraph;
import jakarta.xml.bind.JAXBElement;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart;
import org.docx4j.wml.*;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.DocxSetInfo;
import pc.exam.pp.module.judgement.utils.wps_word.docx4j.vo.JudgementWordsVO;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment;
import java.math.BigInteger;
import java.util.List;
/**
* @author REN
@@ -53,7 +52,7 @@ public class Paragraphs {
return Convert.convertJc(style.getPPr().getOutlineLvl().getVal().toString());
}
}
return "";
return "正文";
}
/// 段落格式(缩进) 左缩进 磅
public static String getParagraphIndLeft(P paragraph, StyleDefinitionsPart stylePart) {
@@ -140,7 +139,23 @@ public class Paragraphs {
return "";
}
/// 段落格式(间距) 段前
/// 段落格式(间距) 段前
public static String getParagraphSpacingBeforeLines(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getSpacing() != null) {
return pPr.getSpacing().getBeforeLines().toString();
}
if (pPr != null && pPr.getPStyle() != null && stylePart != null) {
String styleId = pPr.getPStyle().getVal();
Style style = stylePart.getStyleById(styleId);
if (style != null && style.getPPr() != null && style.getPPr().getSpacing() != null) {
PPrBase.Spacing spacing = style.getPPr().getSpacing();
return spacing.getBeforeLines().toString();
}
}
return "";
}
/// 段落格式(间距) 段前磅
public static String getParagraphSpacingBefore(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getSpacing() != null) {
@@ -156,7 +171,7 @@ public class Paragraphs {
}
return "";
}
/// 段落格式(间距) 段后
/// 段落格式(间距) 段后
public static String getParagraphSpacingAfter(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getSpacing() != null) {
@@ -172,6 +187,24 @@ public class Paragraphs {
}
return "";
}
/// 段落格式(间距) 段后行
public static String getParagraphSpacingAfterLines(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getSpacing() != null) {
return pPr.getSpacing().getAfterLines().toString();
}
if (pPr != null && pPr.getPStyle() != null && stylePart != null) {
String styleId = pPr.getPStyle().getVal();
Style style = stylePart.getStyleById(styleId);
if (style != null && style.getPPr() != null && style.getPPr().getSpacing() != null) {
PPrBase.Spacing spacing = style.getPPr().getSpacing();
return spacing.getAfterLines().toString();
}
}
return "";
}
/// 段落格式(间距) 间距
public static String getParagraphSpacingLine(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
@@ -349,78 +382,268 @@ public class Paragraphs {
return "未知";
}
// 段落-边框
// public static List<JudgementWordsVO> getParagraphBorder(P paragraph, StyleDefinitionsPart stylePart, List<JudgementWordsVO> judgementWordsVOS, int betoLong, String firstId) {
// if (paragraph == null) {
// return judgementWordsVOS;
// }
// String name = "【第" + betoLong + "段】";
// String parentId = Convert.getStringRandom();
// // 先查询自身段落数据
// PPr pPr = paragraph.getPPr();
// if (pPr != null && pPr.getPBdr() != null) {
// PPrBase.PBdr border = pPr.getPBdr();
// String topName = "【】【】";
// Convert.printBorder("上边框", border.getTop());
// Convert.printBorder("下边框", border.getBottom());
// Convert.printBorder("左边框", border.getLeft());
// Convert.printBorder("右边框", border.getRight());
// Convert.printBorder("内横线", border.getBetween());
// Convert.printBorder("内竖线", border.getBar());
// }
// }
// 段落-底纹
public static void getParagraphShd(P paragraph, StyleDefinitionsPart stylePart) {
if (paragraph == null) {
return ;
// 段落边框 样式
public static String getParagraphBorderStyle(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getPBdr() != null) {
PPrBase.PBdr border = pPr.getPBdr();
// 上边框
CTBorder top = border.getTop();
// 下边框
CTBorder bottom = border.getBottom();
// 左边框
CTBorder left = border.getLeft();
// 右边框
CTBorder right = border.getRight();
// 判断上下左右边框是否一致
if (top.getVal().value().equals(bottom.getVal().value()) && top.getVal().value().equals(left.getVal().value()) && top.getVal().value().equals(right.getVal().value())) {
// 说明样式一样
return top.getVal().value();
} else {
// 说明样式不一样
return top.getVal().value() + "-" + bottom.getVal().value() + "-" + left.getVal().value() + "-" + right.getVal().value();
}
}
return "未知";
}
// 段落边框 - 颜色
public static String getParagraphBorderColor(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getPBdr() != null) {
PPrBase.PBdr border = pPr.getPBdr();
// 上边框
CTBorder top = border.getTop();
// 下边框
CTBorder bottom = border.getBottom();
// 左边框
CTBorder left = border.getLeft();
// 右边框
CTBorder right = border.getRight();
// 判断上下左右边框是否一致
if (top.getColor().equals(bottom.getColor()) && top.getColor().equals(left.getColor()) && top.getColor().equals(right.getColor())) {
// 说明样式一样
return top.getColor();
} else {
// 说明样式不一样
return top.getColor() + "-" + bottom.getColor() + "-" + left.getColor() + "-" + right.getColor();
}
}
return "未知";
}
// 段落边框 - 宽度
public static String getParagraphBorderSize(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getPBdr() != null) {
PPrBase.PBdr border = pPr.getPBdr();
// 上边框
CTBorder top = border.getTop();
// 下边框
CTBorder bottom = border.getBottom();
// 左边框
CTBorder left = border.getLeft();
// 右边框
CTBorder right = border.getRight();
// 判断上下左右边框是否一致
if (top.getSz().toString().equals(bottom.getSz().toString()) && top.getSz().toString().equals(left.getSz().toString()) && top.getSz().toString().equals(right.getSz().toString())) {
// 说明样式一样
return top.getSz().toString();
} else {
// 说明样式不一样
return top.getSz().toString() + "-" + bottom.getSz().toString() + "-" + left.getSz().toString() + "-" + right.getSz().toString();
}
}
return "未知";
}
// 段落底纹 - 填充颜色
public static String getParagraphShdFillColor(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getShd() != null) {
CTShd shd = pPr.getShd();
System.out.println("图案样式 (val): " + shd.getVal()); // 如 clear, solid, nil
System.out.println("图案颜色 (color): " + shd.getColor()); // 图案颜色(文字上的线)
System.out.println("填充颜色 (fill): " + shd.getFill()); // 背景色(段落底色)
return shd.getFill();
}
return "未知";
}
// 段落底纹 - 图案样式
public static String getParagraphShdStyle(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getShd() != null) {
CTShd shd = pPr.getShd();
return shd.getVal().value();
}
return "未知";
}
// 段落底纹 - 图案颜色
public static String getParagraphShdStyleColor(P paragraph, StyleDefinitionsPart stylePart) {
// 先查询自身段落数据
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getShd() != null) {
CTShd shd = pPr.getShd();
return shd.getColor();
}
return "未知";
}
// 首字下沉 - 是否存在
public static String getParagraphDropCapIsTrue(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getFramePr() != null) {
return "";
} else {
return "";
}
}
// 段落-首字下沉
public static void getParagraphDropCap(P paragraph, StyleDefinitionsPart stylePart) {
if (paragraph == null) {
return ;
}
// 首字下沉 - 首字位置
public static String getParagraphDropCapLocation(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getFramePr() != null) {
CTFramePr framePr = pPr.getFramePr();
System.out.println("---- 首字下沉 ----");
System.out.println("存在首字下沉: 是");
if (framePr.getDropCap() != null) {
System.out.println("首字位置 (dropCap): " + framePr.getDropCap().value()); // drop | none | margin
return framePr.getDropCap().value(); // drop | none | margin
}
}
return "未知";
}
// 首字下沉 - 行数
public static String getParagraphDropCapLine(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getFramePr() != null) {
CTFramePr framePr = pPr.getFramePr();
if (framePr.getLines() != null) {
System.out.println("下沉行数 (lines): " + framePr.getLines().intValue());
return String.valueOf(framePr.getLines().intValue()); // twips
}
}
return "未知";
}
// 首字下沉 - 距正文
public static String getParagraphDropCapHSpace(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getFramePr() != null) {
CTFramePr framePr = pPr.getFramePr();
if (framePr.getHSpace() != null) {
System.out.println("距正文 (hSpace): " + framePr.getHSpace().intValue()); // twips
return String.valueOf(framePr.getHSpace().intValue()); // twips
}
}
return "未知";
}
// 首字下沉 - 字体
public static String getParagraphDropCapFont(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr != null && pPr.getFramePr() != null) {
// 获取首字字体
String fontName = Convert.getFirstRunFont(paragraph);
if (fontName != null) {
System.out.println("字体: " + fontName);
return fontName;
}
} else {
System.out.println("不存在首字下沉");
}
return "未知";
}
// 段落-分栏
public static void getParagraphCols(P paragraph, StyleDefinitionsPart stylePart) {
if (paragraph == null) {
return ;
// 分栏 - 栏数
// public static String getParagraphCols(P paragraph, StyleDefinitionsPart stylePart) {
// PPr pPr = paragraph.getPPr();
// SectPr sectPr = null;
// sectPr = pPr.getSectPr();
// // 优先取段落自身的节属性
// if (pPr != null && pPr.getSectPr() != null) {
// sectPr = pPr.getSectPr();
// }
// // 或最后一个段落中会有一个节结束的SectPr
// if (sectPr == null && paragraph.getContent().size() > 0) {
// Object lastObj = paragraph.getContent().get(paragraph.getContent().size() - 1);
// if (lastObj instanceof JAXBElement && ((JAXBElement<?>) lastObj).getValue() instanceof SectPr) {
// sectPr = (SectPr) ((JAXBElement<?>) lastObj).getValue();
// }
// }
// if (sectPr != null && sectPr.getCols() != null) {
// CTColumns cols = sectPr.getCols();
// return String.valueOf(cols.getNum().intValue());
// }
//
// return "未知";
// }
public static String getParagraphCols(P paragraph, WordprocessingMLPackage wordMLPackage) {
// 1. 首先检查段落自身的节属性
if (paragraph.getPPr() != null && paragraph.getPPr().getSectPr() != null) {
CTColumns cols = paragraph.getPPr().getSectPr().getCols();
if (cols != null && cols.getNum() != null) {
return String.valueOf(cols.getNum().intValue());
}
}
// 2. 检查段落内容中是否有节属性
for (Object content : paragraph.getContent()) {
if (content instanceof JAXBElement) {
Object value = ((JAXBElement<?>) content).getValue();
if (value instanceof SectPr) {
CTColumns cols = ((SectPr) value).getCols();
if (cols != null && cols.getNum() != null) {
return String.valueOf(cols.getNum().intValue());
}
}
}
}
// 3. 向后查找后续段落中的节属性
Body body = wordMLPackage.getMainDocumentPart().getJaxbElement().getBody();
boolean foundCurrent = false;
for (Object obj : body.getContent()) {
if (obj instanceof P) {
P p = (P) obj;
// 找到当前段落后才开始查找
if (p == paragraph) {
foundCurrent = true;
continue;
}
if (foundCurrent) {
// 检查后续段落的节属性
if (p.getPPr() != null && p.getPPr().getSectPr() != null) {
CTColumns cols = p.getPPr().getSectPr().getCols();
if (cols != null && cols.getNum() != null) {
return String.valueOf(cols.getNum().intValue());
}
}
// 检查后续段落内容中的节属性
for (Object content : p.getContent()) {
if (content instanceof JAXBElement) {
Object value = ((JAXBElement<?>) content).getValue();
if (value instanceof SectPr) {
CTColumns cols = ((SectPr) value).getCols();
if (cols != null && cols.getNum() != null) {
return String.valueOf(cols.getNum().intValue());
}
}
}
}
}
}
}
// 4. 如果都没找到,返回默认值(如"1"表示单栏)
return "1";
}
// 分栏 - 分隔线
public static String getParagraphColIsSep(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
SectPr sectPr = null;
sectPr = pPr.getSectPr();
@@ -439,21 +662,110 @@ public class Paragraphs {
if (sectPr != null && sectPr.getCols() != null) {
CTColumns cols = sectPr.getCols();
return cols.isSep() ? "" : "";
}
return "未知";
}
// 分栏 - 各栏间距
public static String getParagraphColSpace(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
SectPr sectPr = null;
sectPr = pPr.getSectPr();
// 优先取段落自身的节属性
if (pPr != null && pPr.getSectPr() != null) {
sectPr = pPr.getSectPr();
}
System.out.println("---- 分栏信息 ----");
System.out.println("栏数: " + (cols.getNum() != null ? cols.getNum().intValue() : "未设置"));
System.out.println("是否栏宽相等 (equalWidth): " + (cols.isEqualWidth() ? "" : ""));
System.out.println("是否有分隔线 (sep): " + (cols.isSep() ? "" : ""));
if (cols.getCol() != null && !cols.getCol().isEmpty()) {
int index = 1;
for (CTColumn col : cols.getCol()) {
System.out.println("" + index + " 栏宽度 (twips): " + col.getW());
System.out.println("" + index + " 栏间距 (twips): " + col.getSpace());
index++;
}
// 或最后一个段落中会有一个节结束的SectPr
if (sectPr == null && paragraph.getContent().size() > 0) {
Object lastObj = paragraph.getContent().get(paragraph.getContent().size() - 1);
if (lastObj instanceof JAXBElement && ((JAXBElement<?>) lastObj).getValue() instanceof SectPr) {
sectPr = (SectPr) ((JAXBElement<?>) lastObj).getValue();
}
}
if (sectPr != null && sectPr.getCols() != null) {
CTColumns cols = sectPr.getCols();
if (cols.getCol() != null && !cols.getCol().isEmpty()) {
int index = 1;
String value = "";
for (CTColumn col : cols.getCol()) {
value += "" + index + " 栏间距 (twips): " + col.getSpace() + " ";
index++;
}
return value;
}
}
return "未知";
}
// 分栏 - 各栏宽度
public static String getParagraphColW(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
SectPr sectPr = null;
sectPr = pPr.getSectPr();
// 优先取段落自身的节属性
if (pPr != null && pPr.getSectPr() != null) {
sectPr = pPr.getSectPr();
}
// 或最后一个段落中会有一个节结束的SectPr
if (sectPr == null && paragraph.getContent().size() > 0) {
Object lastObj = paragraph.getContent().get(paragraph.getContent().size() - 1);
if (lastObj instanceof JAXBElement && ((JAXBElement<?>) lastObj).getValue() instanceof SectPr) {
sectPr = (SectPr) ((JAXBElement<?>) lastObj).getValue();
}
}
if (sectPr != null && sectPr.getCols() != null) {
CTColumns cols = sectPr.getCols();
if (cols.getCol() != null && !cols.getCol().isEmpty()) {
int index = 1;
String value = "";
for (CTColumn col : cols.getCol()) {
value += "" + index + " 栏宽度 (twips): " + col.getW() + " ";
index++;
}
return value;
}
}
return "未知";
}
// 分栏 - 栏宽相等
public static String getParagraphColEqualWidth(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
SectPr sectPr = null;
sectPr = pPr.getSectPr();
// 优先取段落自身的节属性
if (pPr != null && pPr.getSectPr() != null) {
sectPr = pPr.getSectPr();
}
// 或最后一个段落中会有一个节结束的SectPr
if (sectPr == null && paragraph.getContent().size() > 0) {
Object lastObj = paragraph.getContent().get(paragraph.getContent().size() - 1);
if (lastObj instanceof JAXBElement && ((JAXBElement<?>) lastObj).getValue() instanceof SectPr) {
sectPr = (SectPr) ((JAXBElement<?>) lastObj).getValue();
}
}
if (sectPr != null && sectPr.getCols() != null) {
CTColumns cols = sectPr.getCols();
return cols.isEqualWidth() ? "" : "";
}
return "未知";
}
// 中文版式 - 双行合一
public static String getParagraphCNBidi(P paragraph, StyleDefinitionsPart stylePart) {
PPr pPr = paragraph.getPPr();
if (pPr.getTextAlignment() != null) {
PPrBase.TextAlignment textAlignment = pPr.getTextAlignment();
if (textAlignment.getVal() != null &&
textAlignment.getVal().equals(STTextAlignment.CENTER)) {
return "";
}
}
return "";
}
}

View File

@@ -1,9 +1,4 @@
package pc.exam.pp.module.judgement.utils.wps_word;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
package pc.exam.pp.module.judgement.utils.wps_word.utils;
@SuppressWarnings("all")
public class WpsWordNameSpaces {

View File

@@ -1,4 +1,4 @@
package pc.exam.pp.module.judgement.utils.wps_word;
package pc.exam.pp.module.judgement.utils.wps_word.utils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.xmlbeans.XmlObject;