fix 78449 文档拆分--附录没有拆出来
fix 78375 文档拆分--表格拆分缺少边框
This commit is contained in:
-2
@@ -26,8 +26,6 @@ public interface ISarFileSplitInfoService extends IService<SarFileSplitInfoEO> {
|
|||||||
*/
|
*/
|
||||||
void add(SarFileSplitInfoEO sarFileSplitInfoEO);
|
void add(SarFileSplitInfoEO sarFileSplitInfoEO);
|
||||||
|
|
||||||
void add1(SarFileSplitInfoEO sarFileSplitInfoEO);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新
|
* 更新
|
||||||
*
|
*
|
||||||
|
|||||||
+146
-397
@@ -18,7 +18,6 @@ import com.jero.modules.split.vo.TitleNumberVO;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.poi.hwpf.HWPFDocument;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||||
import org.apache.poi.xwpf.usermodel.*;
|
import org.apache.poi.xwpf.usermodel.*;
|
||||||
@@ -30,11 +29,11 @@ import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
|
|||||||
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
|
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
|
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
|
||||||
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMath;
|
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMath;
|
||||||
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathArg;
|
|
||||||
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathPara;
|
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathPara;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLevelText;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLevelText;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -44,7 +43,6 @@ import org.w3c.dom.NamedNodeMap;
|
|||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -81,354 +79,15 @@ public class FileSpiltService {
|
|||||||
private String filePathCos;
|
private String filePathCos;
|
||||||
@Value("${jero.splitUrl}")
|
@Value("${jero.splitUrl}")
|
||||||
private String splitUrl;
|
private String splitUrl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 中国标准数据拆分
|
* 判断附录正则
|
||||||
*
|
|
||||||
* @param sarFileSplitInfoEO
|
|
||||||
* @param enumByValue
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public int fileCHN1(SarFileSplitInfoEO sarFileSplitInfoEO, SplitFileTypeTypeEnum enumByValue) {
|
private static final Pattern APPENDIX_PATTERN = Pattern.compile("^附\\s{0,3}录\\s{0,3}[A-Z]{1}");
|
||||||
if (sarFileSplitInfoEO.getStopNumber() <= 0) {
|
/**
|
||||||
sarFileSplitInfoEO.setStopNumber(200);
|
* 判断范围正则
|
||||||
}
|
*/
|
||||||
if (sarFileSplitInfoEO.getStartNumber() <= 0) {
|
private static final Pattern RANGE_PATTERN_1 = Pattern.compile("^1\\s{0,50}范围");
|
||||||
sarFileSplitInfoEO.setStartNumber(1);
|
private static final Pattern RANGE_PATTERN_2 = Pattern.compile("^\\s{0,50}范围");
|
||||||
}
|
|
||||||
|
|
||||||
// 拆分文件条款表中最终插入数据
|
|
||||||
List<SarFileSplitItemsEO> messageList = new ArrayList<>();
|
|
||||||
// List<SarFileSplitItemsValEO> messageList = new ArrayList<>();
|
|
||||||
int messageNumber = 0;
|
|
||||||
// 拆分文件目录表中最终插入数据
|
|
||||||
List<SarFileSplitMenuEO> treeList = new ArrayList<>();
|
|
||||||
// 拆分文件条款详情表中最终插入数据
|
|
||||||
List<SarFileSplitItemsValEO> itemValList = new ArrayList<>();
|
|
||||||
Long treeListDisplay = 1L;
|
|
||||||
|
|
||||||
String generalCatalogueId = UUIDUtils.randomUUID20();
|
|
||||||
SarFileSplitMenuEO documentTreeEO = new SarFileSplitMenuEO();
|
|
||||||
// SarFileSplitMenuEO documentTreeEO = new SarFileSplitMenuEO(generalCatalogueId,"总目录","",sarFileSplitInfoEO.getId(),treeListDisplay++,"");
|
|
||||||
documentTreeEO.setId(generalCatalogueId);
|
|
||||||
documentTreeEO.setName("总目录");
|
|
||||||
documentTreeEO.setInfoId(sarFileSplitInfoEO.getId());
|
|
||||||
documentTreeEO.setDisplaySeq(1L);
|
|
||||||
documentTreeEO.setDisplaySeq(treeListDisplay++);
|
|
||||||
documentTreeEO.setValidFlag(0);
|
|
||||||
|
|
||||||
|
|
||||||
treeList.add(documentTreeEO);
|
|
||||||
|
|
||||||
List<String> nowStart = new ArrayList<>();
|
|
||||||
// if (sarFileSplitInfoEO.getStartNumber()<4){
|
|
||||||
//从第二个开始拆解
|
|
||||||
nowStart.add("2");
|
|
||||||
// } else {
|
|
||||||
// nowStart.add(String.valueOf(sarFileSplitInfoEO.getStartNumber()));
|
|
||||||
// }
|
|
||||||
//// 获取文件地址
|
|
||||||
// String fileId = sarFileSplitInfoEO.getFileId();
|
|
||||||
// LambdaQueryWrapper<OSSFile> queryWrapper = new LambdaQueryWrapper();
|
|
||||||
// queryWrapper.eq(OSSFile::getId, fileId);
|
|
||||||
// queryWrapper.orderByDesc(OSSFile::getCreateTime);
|
|
||||||
// List<OSSFile> ossFileList = iossFileService.list(queryWrapper);
|
|
||||||
// if (CollectionUtils.isEmpty(ossFileList)) {
|
|
||||||
// throw new JeroBootException("当前文件未找到,请重新选择!");
|
|
||||||
// }
|
|
||||||
// OSSFile ossFile = ossFileList.get(0);
|
|
||||||
// String readFilePath = ossFile.getUrl();
|
|
||||||
// if (StringUtils.isEmpty(readFilePath) || !MinioUtil.doesObjectExist(readFilePath)) {
|
|
||||||
// throw new JeroBootException("当前文件未找到,请重新选择!");
|
|
||||||
// }
|
|
||||||
// try (InputStream is = MinioUtil.download(readFilePath);InputStream is1 = MinioUtil.download(readFilePath)) {
|
|
||||||
String readFilePath = "E:\\Data\\Downloads\\wordtest\\前言.docx";
|
|
||||||
try (InputStream is = new FileInputStream(readFilePath); InputStream is1 = new FileInputStream(readFilePath)) {//需要将文件路更改为word文档所在路径。
|
|
||||||
ZipSecureFile.setMinInflateRatio(-1.0d);
|
|
||||||
XWPFDocument doc = new XWPFDocument(is);
|
|
||||||
|
|
||||||
TitleNumberVO titleNumberVO = AsposeUtil.getNumber(is1);
|
|
||||||
//TitleNumberVO titleNumberVO = new TitleNumberVO();
|
|
||||||
Map<String, String> titleNumberMap = titleNumberVO.getTitleNumberMap();
|
|
||||||
List<String> emptyTitleList = titleNumberVO.getEmptyTitleList();
|
|
||||||
|
|
||||||
Pattern ptest = Pattern.compile("^1范围");
|
|
||||||
Matcher matcher;
|
|
||||||
|
|
||||||
// 记录拆分后的每一段文字
|
|
||||||
List<IBodyElement> elements = doc.getBodyElements();
|
|
||||||
// 记录word自动生成的编号数据
|
|
||||||
Map numberMap = new HashMap<String, Integer>();
|
|
||||||
boolean menuCanAdd = false; // 判断当前目录下是否可以正常填写数据
|
|
||||||
boolean firstFlag = true;
|
|
||||||
List<String> startDigitList = getStartDigit(elements, enumByValue);
|
|
||||||
String regex = "^[0-9]*$";
|
|
||||||
String preName = "";
|
|
||||||
int preNameNum = 0;
|
|
||||||
// for (IBodyElement element : elements) {
|
|
||||||
for (int g=0; g< elements.size(); g++) {
|
|
||||||
IBodyElement element = elements.get(g);
|
|
||||||
|
|
||||||
// 段落
|
|
||||||
if (element instanceof XWPFParagraph) {
|
|
||||||
XWPFParagraph p = (XWPFParagraph) element;
|
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
|
||||||
|
|
||||||
ParagraphChildOrderManager.parseParagraph(p);
|
|
||||||
ParagraphChildOrderManager runOrMaths = new ParagraphChildOrderManager(p);
|
|
||||||
List<Object> childList = runOrMaths.getChildList();
|
|
||||||
|
|
||||||
for (Object child : childList) {
|
|
||||||
if (child instanceof CTOMath) {
|
|
||||||
// 处理word中存在的公式成mathML格式
|
|
||||||
handleParagraphOMath(stringBuilder, (CTOMath) child);
|
|
||||||
if (messageList.size() > 0) {
|
|
||||||
addItermsConditionsMath(messageList.get(messageList.size() - 1), itemValList, stringBuilder.toString());
|
|
||||||
}
|
|
||||||
} else if (child instanceof CTOMathPara) {
|
|
||||||
//处理word中存在的公式
|
|
||||||
handleParagraphOMath(stringBuilder, (CTOMathPara) child);
|
|
||||||
if (messageList.size() > 0) {
|
|
||||||
addItermsConditionsMath(messageList.get(messageList.size() - 1), itemValList, stringBuilder.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (XWPFRun xwrun : p.getRuns()) {
|
|
||||||
VerticalAlign subscript = xwrun.getSubscript();
|
|
||||||
String smalltext = xwrun.getText(0);
|
|
||||||
if (smalltext==null){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch (subscript) {
|
|
||||||
case BASELINE:
|
|
||||||
stringBuilder.append(smalltext);
|
|
||||||
break;
|
|
||||||
case SUBSCRIPT:
|
|
||||||
stringBuilder.append("<sub>").append(smalltext).append("</sub>");
|
|
||||||
break;
|
|
||||||
case SUPERSCRIPT:
|
|
||||||
stringBuilder.append("<sup>").append(smalltext).append("</sup>");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
stringBuilder.append(smalltext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 处理段落生成编号不识别问题
|
|
||||||
String paragraphString = stringBuilder.toString();
|
|
||||||
if (StringUtils.isNotBlank(paragraphString)) {
|
|
||||||
paragraphString = paragraphString.replace((char) 12288, ' ');
|
|
||||||
paragraphString = paragraphString.trim();
|
|
||||||
}
|
|
||||||
if(StringUtils.isEmpty(paragraphString)){
|
|
||||||
// 处理当前段落仅为图片的情况
|
|
||||||
List<String> imageBundleList = readImageInParagraph((XWPFParagraph) p);
|
|
||||||
if (CollectionUtils.isNotEmpty(imageBundleList)) {
|
|
||||||
if (messageList.size() > 0) {
|
|
||||||
addItermsConditionsImage(messageList.get(messageList.size() - 1), itemValList, p, imageBundleList);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
paragraphString = paragraphString.replaceAll("\r\n","");
|
|
||||||
paragraphString = paragraphString.replaceAll("\n","");
|
|
||||||
paragraphString = paragraphString.trim();
|
|
||||||
|
|
||||||
if ("前言".equals(getChinese(paragraphString))
|
|
||||||
&& (paragraphString
|
|
||||||
.replaceAll("\t", "")
|
|
||||||
.replaceAll("\b", "")
|
|
||||||
.replaceAll(" ", "")
|
|
||||||
.length() == 2)) { // 前言后面有文本,判定为是目录中的前言
|
|
||||||
firstFlag = false;
|
|
||||||
}
|
|
||||||
if(firstFlag) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(StringUtils.isEmpty(paragraphString)){
|
|
||||||
// 处理当前段落仅为图片的情况
|
|
||||||
List<String> imageBundleList = readImageInParagraph((XWPFParagraph) p);
|
|
||||||
if (CollectionUtils.isNotEmpty(imageBundleList)) {
|
|
||||||
if (messageList.size() > 0) {
|
|
||||||
addItermsConditionsImage(messageList.get(messageList.size() - 1), itemValList, p, imageBundleList);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (StringUtils.isNotEmpty(p.getNumLevelText()) && p.getNumLevelText().indexOf(".") > 0) {
|
|
||||||
String numberParent = p.getNumLevelText().substring(0, p.getNumLevelText().lastIndexOf("."));
|
|
||||||
if (numberMap.containsKey(numberParent)) {
|
|
||||||
Integer numbernow = (Integer) numberMap.get(numberParent) + 1;
|
|
||||||
if (messageList != null && !messageList.isEmpty() && messageList.get(messageList.size() - 1).getItemNum().equals(numberParent + "." + String.valueOf(numbernow))) {
|
|
||||||
numberMap.put(numberParent, numbernow + 1);
|
|
||||||
paragraphString = numberParent + "." + String.valueOf(numbernow + 1) + paragraphString;
|
|
||||||
} else {
|
|
||||||
numberMap.put(numberParent, numbernow);
|
|
||||||
paragraphString = numberParent + "." + String.valueOf(numbernow) + paragraphString;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
numberMap.put(numberParent, 1);
|
|
||||||
paragraphString = numberParent + ".1" + paragraphString;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (messageNumber == 0) {
|
|
||||||
ptest = Pattern.compile("^1\\s{0,50}范围");
|
|
||||||
matcher = ptest.matcher(paragraphString);
|
|
||||||
ptest = Pattern.compile("^\\s{0,50}范围");
|
|
||||||
Matcher matcher1 = ptest.matcher(paragraphString);;
|
|
||||||
while (matcher.find() || matcher1.find()) {
|
|
||||||
List<String> clauseContent = new ArrayList<>();
|
|
||||||
SarFileSplitItemsEO message = getSarFileSplitItemsEO(sarFileSplitInfoEO.getId(), "1", "范围", clauseContent);
|
|
||||||
SarFileSplitMenuEO documentTreeEO1 = new SarFileSplitMenuEO();
|
|
||||||
// SarFileSplitMenuEO documentTreeEO1 = new SarFileSplitMenuEO(UUIDUtils.randomUUID20(),message.getItemsNum(),generalCatalogueId,sarFileSplitInfoEO.getId(),treeListDisplay++,"范围");
|
|
||||||
documentTreeEO1.setId(UUIDUtils.randomUUID20());
|
|
||||||
documentTreeEO1.setItemName("范围");
|
|
||||||
documentTreeEO1.setPId(generalCatalogueId);
|
|
||||||
documentTreeEO1.setInfoId(sarFileSplitInfoEO.getId());
|
|
||||||
documentTreeEO1.setDisplaySeq(treeListDisplay++);
|
|
||||||
documentTreeEO1.setName(message.getItemNum());
|
|
||||||
documentTreeEO1.setValidFlag(0);
|
|
||||||
// treeList.add(documentTreeEO1);
|
|
||||||
|
|
||||||
message.setMenuId(documentTreeEO1.getId());
|
|
||||||
if (sarFileSplitInfoEO.getStartNumber() <= 1 && sarFileSplitInfoEO.getStopNumber() >= 1) {
|
|
||||||
messageList.add(message);
|
|
||||||
treeList.add(documentTreeEO1);
|
|
||||||
preName = getOneStartDigit(paragraphString, enumByValue);;
|
|
||||||
preNameNum = g;
|
|
||||||
menuCanAdd = true;
|
|
||||||
} else {
|
|
||||||
menuCanAdd = false;
|
|
||||||
}
|
|
||||||
messageNumber++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (messageNumber >= 1) {
|
|
||||||
ptest = Pattern.compile("^[\\d.]*$");
|
|
||||||
boolean hasGoIf = false;
|
|
||||||
String nextParagraphString = getNextParagraphString(g, elements, enumByValue);
|
|
||||||
|
|
||||||
//替换序号
|
|
||||||
boolean replaceNumberFlag = false;
|
|
||||||
String replaceNumber = "";
|
|
||||||
if (!emptyTitleList.isEmpty() && StringUtils.isBlank(paragraphString) && StringUtils.isNotBlank(nextParagraphString)){
|
|
||||||
paragraphString = emptyTitleList.get(0);
|
|
||||||
emptyTitleList.remove(0);
|
|
||||||
}else if (StringUtils.isNotBlank(paragraphString) && titleNumberMap.containsKey(paragraphString)){
|
|
||||||
replaceNumberFlag = true;
|
|
||||||
replaceNumber = titleNumberMap.get(paragraphString);
|
|
||||||
paragraphString = replaceNumber + paragraphString;
|
|
||||||
}
|
|
||||||
String startDigit;
|
|
||||||
if (replaceNumberFlag){
|
|
||||||
startDigit = replaceNumber;
|
|
||||||
}else {
|
|
||||||
startDigit = getOneStartDigit(paragraphString, enumByValue);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < nowStart.size(); i++) {
|
|
||||||
// if (paragraphString.startsWith(nowStart.get(i))) {
|
|
||||||
if (startDigit.equals(nowStart.get(i))) {
|
|
||||||
// 判断真的是标题还是干扰项 TODO
|
|
||||||
if (nowStart.get(i).matches(regex)) {
|
|
||||||
boolean result = fileSplitPdfService.judge(preName, preNameNum, startDigit, g, startDigitList, ".");
|
|
||||||
if (result) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 判断名称,如果大于10位,取十位,
|
|
||||||
String itemName = paragraphString.substring(nowStart.get(i).length()).length() > 10 ? paragraphString.substring(nowStart.get(i).length(), nowStart.get(i).length() + 10) : paragraphString.substring(nowStart.get(i).length());
|
|
||||||
List<String> clauseContent = new ArrayList<>();
|
|
||||||
clauseContent.add(paragraphString);
|
|
||||||
SarFileSplitItemsEO message = getSarFileSplitItemsEO(sarFileSplitInfoEO.getId(), nowStart.get(i), itemName, clauseContent);
|
|
||||||
|
|
||||||
String[] numberStr = nowStart.get(i).split("\\.");
|
|
||||||
if (Integer.valueOf(numberStr[0]) > sarFileSplitInfoEO.getStopNumber()) {
|
|
||||||
menuCanAdd = false;
|
|
||||||
} else {
|
|
||||||
// 增加一条数据,需要在数结构中加一条数据
|
|
||||||
SarFileSplitMenuEO sarFileSplitMenuEO = getTreeList(nowStart.get(i), treeList, generalCatalogueId, sarFileSplitInfoEO, treeListDisplay++, itemName, enumByValue);
|
|
||||||
treeList.add(sarFileSplitMenuEO);
|
|
||||||
preName = startDigit;
|
|
||||||
preNameNum = g;
|
|
||||||
message.setMenuId(sarFileSplitMenuEO.getId());
|
|
||||||
if(!StringUtils.isEmpty(itemName)){
|
|
||||||
addItermsConditionsText(message, itemValList, paragraphString.substring(nowStart.get(i).length()));
|
|
||||||
}
|
|
||||||
messageList.add(message);
|
|
||||||
nowStart = getNewNowStart(nowStart.get(i));
|
|
||||||
menuCanAdd = true;
|
|
||||||
}
|
|
||||||
hasGoIf = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!hasGoIf && menuCanAdd) {
|
|
||||||
// 判断是否是附录
|
|
||||||
ptest = Pattern.compile("^附录\\s{0,3}[A-Z]{1}");
|
|
||||||
matcher = ptest.matcher(paragraphString);
|
|
||||||
// 获取当前最后一项num
|
|
||||||
String appendixNum = messageList.get(messageList.size() - 1).getItemNum().split("\\.")[0];
|
|
||||||
if (matcher.find()&& !messageList.get(messageList.size() - 1).getItemNum().equals("附录")) {
|
|
||||||
if (Integer.valueOf(appendixNum) + 1 <= sarFileSplitInfoEO.getStopNumber()) {
|
|
||||||
String itemName = "附录";
|
|
||||||
List<String> clauseContent = new ArrayList<>();
|
|
||||||
clauseContent.add(paragraphString);
|
|
||||||
SarFileSplitItemsEO message = getSarFileSplitItemsEO(sarFileSplitInfoEO.getId(), "附录", itemName, clauseContent);
|
|
||||||
// 增加一条数据,需要在数结构中加一条数据
|
|
||||||
SarFileSplitMenuEO sarFileSplitMenuEO = getTreeList("附录", treeList, generalCatalogueId, sarFileSplitInfoEO, treeListDisplay++, "", enumByValue);
|
|
||||||
addItermsConditionsText(message, itemValList, paragraphString);
|
|
||||||
treeList.add(sarFileSplitMenuEO);
|
|
||||||
message.setMenuId(sarFileSplitMenuEO.getId());
|
|
||||||
messageList.add(message);
|
|
||||||
nowStart = new ArrayList<>();
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!paragraphString.equals("")) {
|
|
||||||
addItermsConditionsText(messageList.get(messageList.size() - 1), itemValList, paragraphString);
|
|
||||||
}
|
|
||||||
List<String> imageBundleList = readImageInParagraph((XWPFParagraph) p);
|
|
||||||
if (CollectionUtils.isNotEmpty(imageBundleList)) {
|
|
||||||
addItermsConditionsImage(messageList.get(messageList.size() - 1), itemValList, p, imageBundleList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 判断是否直接跳出所有循环
|
|
||||||
if (!menuCanAdd && messageList.size() > 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (element instanceof XWPFTable) {
|
|
||||||
if (!messageList.isEmpty()) {
|
|
||||||
addItermsConditionsOfTable(messageList.get(messageList.size() - 1), itemValList, (XWPFTable) element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (treeList.size() > 0 && messageList.size() > 0) {
|
|
||||||
sarFileSplitMenuEOMapper.insertForeach(treeList);
|
|
||||||
for (int i = 0; i < messageList.size(); i++) {
|
|
||||||
messageList.get(i).setZhan3Shi4Shun4Xu4(String.valueOf(i+1));
|
|
||||||
messageList.get(i).setInfoId(sarFileSplitInfoEO.getId());
|
|
||||||
}
|
|
||||||
iSarFileSplitItemsEOService.insertForeach(messageList);
|
|
||||||
iSarFileSplitItemsValEOService.insertForeach(itemValList);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return treeList.size();
|
|
||||||
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* 中国标准数据拆分
|
* 中国标准数据拆分
|
||||||
*
|
*
|
||||||
@@ -493,15 +152,12 @@ public class FileSpiltService {
|
|||||||
//try (InputStream is = new FileInputStream(readFilePath); InputStream is1 = new FileInputStream(readFilePath)) {//需要将文件路更改为word文档所在路径。
|
//try (InputStream is = new FileInputStream(readFilePath); InputStream is1 = new FileInputStream(readFilePath)) {//需要将文件路更改为word文档所在路径。
|
||||||
ZipSecureFile.setMinInflateRatio(-1.0d);
|
ZipSecureFile.setMinInflateRatio(-1.0d);
|
||||||
XWPFDocument doc = new XWPFDocument(is);
|
XWPFDocument doc = new XWPFDocument(is);
|
||||||
|
//获得序号标题和无标题序号
|
||||||
TitleNumberVO titleNumberVO = AsposeUtil.getNumber(is1);
|
TitleNumberVO titleNumberVO = AsposeUtil.getNumber(is1);
|
||||||
//TitleNumberVO titleNumberVO = new TitleNumberVO();
|
//TitleNumberVO titleNumberVO = new TitleNumberVO();
|
||||||
Map<String, String> titleNumberMap = titleNumberVO.getTitleNumberMap();
|
Map<String, String> titleNumberMap = titleNumberVO.getTitleNumberMap();
|
||||||
List<String> emptyTitleList = titleNumberVO.getEmptyTitleList();
|
List<String> emptyTitleList = titleNumberVO.getEmptyTitleList();
|
||||||
|
|
||||||
Pattern ptest = Pattern.compile("^1范围");
|
|
||||||
Matcher matcher;
|
|
||||||
|
|
||||||
// 记录拆分后的每一段文字
|
// 记录拆分后的每一段文字
|
||||||
List<IBodyElement> elements = doc.getBodyElements();
|
List<IBodyElement> elements = doc.getBodyElements();
|
||||||
// 记录word自动生成的编号数据
|
// 记录word自动生成的编号数据
|
||||||
@@ -583,27 +239,27 @@ public class FileSpiltService {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (StringUtils.isNotEmpty(p.getNumLevelText()) && p.getNumLevelText().indexOf(".") > 0) {
|
//if (StringUtils.isNotEmpty(p.getNumLevelText()) && p.getNumLevelText().indexOf(".") > 0) {
|
||||||
String numberParent = p.getNumLevelText().substring(0, p.getNumLevelText().lastIndexOf("."));
|
// String numberParent = p.getNumLevelText().substring(0, p.getNumLevelText().lastIndexOf(".")).replaceAll("%","");
|
||||||
if (numberMap.containsKey(numberParent)) {
|
// if (numberMap.containsKey(numberParent)) {
|
||||||
Integer numbernow = (Integer) numberMap.get(numberParent) + 1;
|
// Integer numbernow = (Integer) numberMap.get(numberParent) + 1;
|
||||||
if (messageList != null && !messageList.isEmpty() && messageList.get(messageList.size() - 1).getItemNum().equals(numberParent + "." + String.valueOf(numbernow))) {
|
// if (messageList != null && !messageList.isEmpty() && messageList.get(messageList.size() - 1).getItemNum().equals(numberParent + "." + String.valueOf(numbernow))) {
|
||||||
numberMap.put(numberParent, numbernow + 1);
|
// numberMap.put(numberParent, numbernow + 1);
|
||||||
paragraphString = numberParent + "." + String.valueOf(numbernow + 1) + paragraphString;
|
// paragraphString = numberParent + "." + String.valueOf(numbernow + 1) + paragraphString;
|
||||||
} else {
|
// } else {
|
||||||
numberMap.put(numberParent, numbernow);
|
// numberMap.put(numberParent, numbernow);
|
||||||
paragraphString = numberParent + "." + String.valueOf(numbernow) + paragraphString;
|
// paragraphString = numberParent + "." + String.valueOf(numbernow) + paragraphString;
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
numberMap.put(numberParent, 1);
|
// numberMap.put(numberParent, 1);
|
||||||
paragraphString = numberParent + ".1" + paragraphString;
|
// paragraphString = numberParent + ".1" + paragraphString;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
if (messageNumber == 0) {
|
if (messageNumber == 0) {
|
||||||
ptest = Pattern.compile("^1\\s{0,50}范围");
|
//ptest = Pattern.compile("^1\\s{0,50}范围");
|
||||||
matcher = ptest.matcher(paragraphString);
|
Matcher matcher = RANGE_PATTERN_1.matcher(paragraphString);
|
||||||
ptest = Pattern.compile("^\\s{0,50}范围");
|
//ptest = Pattern.compile("^\\s{0,50}范围");
|
||||||
Matcher matcher1 = ptest.matcher(paragraphString);;
|
Matcher matcher1 = RANGE_PATTERN_2.matcher(paragraphString);;
|
||||||
while (matcher.find() || matcher1.find()) {
|
while (matcher.find() || matcher1.find()) {
|
||||||
List<String> clauseContent = new ArrayList<>();
|
List<String> clauseContent = new ArrayList<>();
|
||||||
SarFileSplitItemsEO message = getSarFileSplitItemsEO(sarFileSplitInfoEO.getId(), "1", "范围", clauseContent);
|
SarFileSplitItemsEO message = getSarFileSplitItemsEO(sarFileSplitInfoEO.getId(), "1", "范围", clauseContent);
|
||||||
@@ -632,7 +288,6 @@ public class FileSpiltService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (messageNumber >= 1) {
|
else if (messageNumber >= 1) {
|
||||||
ptest = Pattern.compile("^[\\d.]*$");
|
|
||||||
boolean hasGoIf = false;
|
boolean hasGoIf = false;
|
||||||
String nextParagraphString = getNextParagraphString(g, elements, enumByValue);
|
String nextParagraphString = getNextParagraphString(g, elements, enumByValue);
|
||||||
|
|
||||||
@@ -690,13 +345,15 @@ public class FileSpiltService {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (nextParagraphString.contains("附 录 A")){
|
||||||
|
System.out.println("1");
|
||||||
|
}
|
||||||
if (!hasGoIf && menuCanAdd) {
|
if (!hasGoIf && menuCanAdd) {
|
||||||
// 判断是否是附录
|
// 判断是否是附录
|
||||||
ptest = Pattern.compile("^附录\\s{0,3}[A-Z]{1}");
|
boolean find = APPENDIX_PATTERN.matcher(paragraphString).find();
|
||||||
matcher = ptest.matcher(paragraphString);
|
|
||||||
// 获取当前最后一项num
|
// 获取当前最后一项num
|
||||||
String appendixNum = messageList.get(messageList.size() - 1).getItemNum().split("\\.")[0];
|
String appendixNum = messageList.get(messageList.size() - 1).getItemNum().split("\\.")[0];
|
||||||
if (matcher.find()&& !messageList.get(messageList.size() - 1).getItemNum().equals("附录")) {
|
if (find && !messageList.get(messageList.size() - 1).getItemNum().equals("附录")) {
|
||||||
if (Integer.valueOf(appendixNum) + 1 <= sarFileSplitInfoEO.getStopNumber()) {
|
if (Integer.valueOf(appendixNum) + 1 <= sarFileSplitInfoEO.getStopNumber()) {
|
||||||
String itemName = "附录";
|
String itemName = "附录";
|
||||||
List<String> clauseContent = new ArrayList<>();
|
List<String> clauseContent = new ArrayList<>();
|
||||||
@@ -1185,7 +842,7 @@ public class FileSpiltService {
|
|||||||
* @param paragraph
|
* @param paragraph
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private List<String> readImageInParagraph(XWPFParagraph paragraph) {
|
public List<String> readImageInParagraph(XWPFParagraph paragraph) {
|
||||||
//图片索引List
|
//图片索引List
|
||||||
List<String> imageBundleList = new ArrayList<String>();
|
List<String> imageBundleList = new ArrayList<String>();
|
||||||
|
|
||||||
@@ -1363,11 +1020,10 @@ public class FileSpiltService {
|
|||||||
itemsValList.add(getSplitItemsValObject(message.getId(), SplitFilePragraTypeEnum.MATH.getValue(), p, message.getItemsCondi().size(), null));
|
itemsValList.add(getSplitItemsValObject(message.getId(), SplitFilePragraTypeEnum.MATH.getValue(), p, message.getItemsCondi().size(), null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addItermsConditionsOfTable(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, XWPFTable table) throws IOException {
|
public void addItermsConditionsOfTable(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, XWPFTable table) throws IOException {
|
||||||
StringBuilder tabaleStringNew = new StringBuilder("");
|
StringBuilder tabaleStringNew = new StringBuilder("");
|
||||||
//将表格转为html字符串
|
//将表格转为html字符串
|
||||||
ReadWordTable readWordTable = new ReadWordTable();
|
String tableStr = readTable(table);
|
||||||
String tableStr = readWordTable.readTable(table);
|
|
||||||
tabaleStringNew.append(tableStr);
|
tabaleStringNew.append(tableStr);
|
||||||
message.getItemsCondi().add(table.getText());
|
message.getItemsCondi().add(table.getText());
|
||||||
message.setItemContent(message.getItemContent() + tabaleStringNew);
|
message.setItemContent(message.getItemContent() + tabaleStringNew);
|
||||||
@@ -1375,6 +1031,94 @@ public class FileSpiltService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String readTable(XWPFTable table) {
|
||||||
|
ReadWordTable readWordTable = new ReadWordTable();
|
||||||
|
// 表格行数
|
||||||
|
int tableRowsSize = table.getRows().size();
|
||||||
|
StringBuilder tableToHtmlStr = new StringBuilder("<table style=\"border-collapse: collapse;\">");
|
||||||
|
|
||||||
|
for (int i = 0; i < tableRowsSize; i++) {
|
||||||
|
//最后一行的都增加下边框
|
||||||
|
//if (i == tableRowsSize-1){
|
||||||
|
// tableToHtmlStr.append("<tr style=\"border-bottom: 1px solid;\">");
|
||||||
|
//}else {
|
||||||
|
// tableToHtmlStr.append("<tr>");
|
||||||
|
//}
|
||||||
|
tableToHtmlStr.append("<tr>");
|
||||||
|
|
||||||
|
int tableCellsSize = table.getRow(i).getTableCells().size();
|
||||||
|
for (int j = 0; j < tableCellsSize; j++) {
|
||||||
|
if (readWordTable.isOmitCell(i, j)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XWPFTableCell tableCell = table.getRow(i).getCell(j);
|
||||||
|
|
||||||
|
// 获取单元格的属性
|
||||||
|
CTTcPr cellProperties = tableCell.getCTTc().getTcPr();
|
||||||
|
|
||||||
|
int colspan = readWordTable.getColspan(cellProperties);
|
||||||
|
if (colspan > 1) { // 合并的列
|
||||||
|
tableToHtmlStr.append("<td colspan=\"" + colspan + "\" ");
|
||||||
|
} else { // 正常列
|
||||||
|
tableToHtmlStr.append("<td ");
|
||||||
|
}
|
||||||
|
tableToHtmlStr.append("style=\" border: 1px solid;");
|
||||||
|
XWPFTableCell.XWPFVertAlign verticalAlignment = tableCell.getVerticalAlignment();
|
||||||
|
if (verticalAlignment != null){
|
||||||
|
tableToHtmlStr.append("vertical-align: middle;");
|
||||||
|
}
|
||||||
|
|
||||||
|
tableToHtmlStr.append(" \" ");
|
||||||
|
int rowspan = readWordTable.getRowspan(table, i, j);
|
||||||
|
// 合并的行
|
||||||
|
if (rowspan > 1) {
|
||||||
|
tableToHtmlStr.append(" rowspan=\"" + rowspan + "\">");
|
||||||
|
} else {
|
||||||
|
tableToHtmlStr.append(">");
|
||||||
|
}
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
List<XWPFParagraph> paragraphs = tableCell.getParagraphs();
|
||||||
|
for (XWPFParagraph paragraph : paragraphs) {
|
||||||
|
List<String> imageBundleList = readImageInParagraph(paragraph);
|
||||||
|
if (CollectionUtils.isNotEmpty(imageBundleList)) {
|
||||||
|
String s = addTableImage(paragraph, imageBundleList);
|
||||||
|
stringBuilder.append(s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (XWPFRun xwrun : paragraph.getRuns()) {
|
||||||
|
VerticalAlign subscript = xwrun.getSubscript();
|
||||||
|
String smalltext = xwrun.getText(0);
|
||||||
|
if (smalltext==null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (subscript) {
|
||||||
|
case BASELINE:
|
||||||
|
stringBuilder.append(smalltext);
|
||||||
|
break;
|
||||||
|
case SUBSCRIPT:
|
||||||
|
stringBuilder.append("<sub>").append(smalltext).append("</sub>");
|
||||||
|
break;
|
||||||
|
case SUPERSCRIPT:
|
||||||
|
stringBuilder.append("<sup>").append(smalltext).append("</sup>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
stringBuilder.append(smalltext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stringBuilder.append("<br>");
|
||||||
|
}
|
||||||
|
tableToHtmlStr.append(stringBuilder).append("</td>");
|
||||||
|
|
||||||
|
}
|
||||||
|
tableToHtmlStr.append("</tr>");
|
||||||
|
}
|
||||||
|
tableToHtmlStr.append("</table>");
|
||||||
|
|
||||||
|
readWordTable.clearTableInfo();
|
||||||
|
|
||||||
|
return tableToHtmlStr.toString();
|
||||||
|
}
|
||||||
|
|
||||||
// 像每个条款中依次插入每一段的内容
|
// 像每个条款中依次插入每一段的内容
|
||||||
private void addItermsConditionsImage(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, XWPFParagraph p, List<String> imageBundleList) {
|
private void addItermsConditionsImage(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, XWPFParagraph p, List<String> imageBundleList) {
|
||||||
for (String pictureId : imageBundleList) {
|
for (String pictureId : imageBundleList) {
|
||||||
@@ -1396,6 +1140,26 @@ public class FileSpiltService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String addTableImage(XWPFParagraph p,List<String> imageBundleList){
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
for (String pictureId : imageBundleList) {
|
||||||
|
XWPFPictureData pictureData = p.getDocument().getPictureDataByID(pictureId);
|
||||||
|
String imageName = UUIDUtils.randomUUID10() + pictureData.getFileName();
|
||||||
|
byte[] bytev = pictureData.getData();
|
||||||
|
String filepathandname = filePathCos + "/" + imageName;
|
||||||
|
try {
|
||||||
|
String path = splitUrl+imageName;
|
||||||
|
MinioUtil.uploadByte(bytev, filepathandname);
|
||||||
|
String imgCon = path;
|
||||||
|
String imgConVal = "<img class=\"wordImg\" style=\"width:100%;height:100%\" src=\"" + path + "\">";
|
||||||
|
stringBuilder.append(imgConVal);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private static SarFileSplitItemsValEO getSplitItemsValObject(String itemId, String type, String itemContent, int disPlaySql, List<SarFileSplitItemsTableEO> tableList) {
|
private static SarFileSplitItemsValEO getSplitItemsValObject(String itemId, String type, String itemContent, int disPlaySql, List<SarFileSplitItemsTableEO> tableList) {
|
||||||
SarFileSplitItemsValEO sarFileSplitItemsValEO = new SarFileSplitItemsValEO();
|
SarFileSplitItemsValEO sarFileSplitItemsValEO = new SarFileSplitItemsValEO();
|
||||||
sarFileSplitItemsValEO.setId(UUIDUtils.randomUUID20());
|
sarFileSplitItemsValEO.setId(UUIDUtils.randomUUID20());
|
||||||
@@ -1464,22 +1228,7 @@ public class FileSpiltService {
|
|||||||
//\p{Space} 空白字符:[ \t\n\x0B\f\r]
|
//\p{Space} 空白字符:[ \t\n\x0B\f\r]
|
||||||
//\p{Digit} 十进制数字:[0-9]
|
//\p{Digit} 十进制数字:[0-9]
|
||||||
String regex="[^\\p{Punct}\\p{Space}\\p{Digit}]"; // TODO
|
String regex="[^\\p{Punct}\\p{Space}\\p{Digit}]"; // TODO
|
||||||
switch (enumByValue) {
|
|
||||||
case GB:
|
|
||||||
case GBT:
|
|
||||||
case EU:
|
|
||||||
case GSO:
|
|
||||||
case JPN_ARTICLE:
|
|
||||||
regex = "[^\\p{Punct}\\p{Space}\\p{Digit}]";
|
|
||||||
break;
|
|
||||||
case KMVSS_ARTICLE:
|
|
||||||
case JPN_ATTACHMENT:
|
|
||||||
regex = "[^\\p{Punct}\\p{Space}\\p{Digit}–]";
|
|
||||||
break;
|
|
||||||
case US:
|
|
||||||
regex = "[^\\p{Punct}\\p{Space}\\p{Digit}S]";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Matcher matcher;
|
Matcher matcher;
|
||||||
matcher = Pattern.compile(regex).matcher(arr);
|
matcher = Pattern.compile(regex).matcher(arr);
|
||||||
if(matcher.find()) {
|
if(matcher.find()) {
|
||||||
|
|||||||
-36
@@ -141,42 +141,6 @@ public class SarFileSplitInfoServiceImpl extends ServiceImpl<SarFileSplitInfoMap
|
|||||||
// sarFileSplitMenuEOMapper.insertSelective(sarFileSplitMenuEO);
|
// sarFileSplitMenuEOMapper.insertSelective(sarFileSplitMenuEO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 保存
|
|
||||||
*
|
|
||||||
* @param sarFileSplitInfoEO
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void add1(SarFileSplitInfoEO sarFileSplitInfoEO) {
|
|
||||||
// 唯一校验
|
|
||||||
//uniqueCheck(sarFileSplitInfoEO);
|
|
||||||
|
|
||||||
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
|
||||||
Date now = new Date();
|
|
||||||
//保存拆分数据
|
|
||||||
String infoId = UUID.randomUUID().toString().replace("-", "");
|
|
||||||
sarFileSplitInfoEO.setId(infoId);
|
|
||||||
sarFileSplitInfoEO.setSplitResult("成功");
|
|
||||||
sarFileSplitInfoEO.setSplitStatus(SplitEnum.SPLIT_STATUS1.getValue());
|
|
||||||
sarFileSplitInfoEO.setAuthor(sysUser.getId());
|
|
||||||
sarFileSplitInfoEO.setCreateTime(now);
|
|
||||||
sarFileSplitInfoEO.setUpdateTime(now);
|
|
||||||
save(sarFileSplitInfoEO);
|
|
||||||
|
|
||||||
|
|
||||||
int result = 0;
|
|
||||||
result = fileSpiltService.fileCHN1(sarFileSplitInfoEO,SplitFileTypeTypeEnum.GBT);
|
|
||||||
|
|
||||||
if(result == -1){
|
|
||||||
if(LanguageEnum.CN.equals(MessageUtils.getLanguage())) {
|
|
||||||
throw new JeroBootException("文档格式错误,请检查文档内容!");
|
|
||||||
}else{
|
|
||||||
throw new JeroBootException("The document format is wrong. Please check the document content!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void uniqueCheck(SarFileSplitInfoEO sarFileSplitInfoEO) {
|
private void uniqueCheck(SarFileSplitInfoEO sarFileSplitInfoEO) {
|
||||||
// 文件状态 + 标准号唯一,每个文件状态的标准只能拆分一次
|
// 文件状态 + 标准号唯一,每个文件状态的标准只能拆分一次
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ import java.util.Map;
|
|||||||
* @date 2023-09-20 14:42
|
* @date 2023-09-20 14:42
|
||||||
*/
|
*/
|
||||||
public class AsposeUtil {
|
public class AsposeUtil {
|
||||||
|
/**
|
||||||
|
* 获得序号标题和无标题序号
|
||||||
|
* @param is
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public static TitleNumberVO getNumber(InputStream is) {
|
public static TitleNumberVO getNumber(InputStream is) {
|
||||||
TitleNumberVO titleNumberVO = new TitleNumberVO();
|
TitleNumberVO titleNumberVO = new TitleNumberVO();
|
||||||
Map<String, String> titleNumberMap = new HashMap<>();
|
Map<String, String> titleNumberMap = new HashMap<>();
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
package com.jero.modules.split.util;
|
package com.jero.modules.split.util;
|
||||||
|
|
||||||
|
import com.jero.modules.split.service.impl.FileSpiltService;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.poi.xwpf.usermodel.*;
|
import org.apache.poi.xwpf.usermodel.*;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -181,17 +185,19 @@ public class ReadWordTable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String readTable(XWPFTable table) throws IOException {
|
public String readTable(XWPFTable table) throws IOException {
|
||||||
|
FileSpiltService fileSpiltService = new FileSpiltService();
|
||||||
// 表格行数
|
// 表格行数
|
||||||
int tableRowsSize = table.getRows().size();
|
int tableRowsSize = table.getRows().size();
|
||||||
StringBuilder tableToHtmlStr = new StringBuilder("<table>");
|
StringBuilder tableToHtmlStr = new StringBuilder("<table style=\"border-collapse: collapse;\">");
|
||||||
|
|
||||||
for (int i = 0; i < tableRowsSize; i++) {
|
for (int i = 0; i < tableRowsSize; i++) {
|
||||||
//最后一行的都增加下边框
|
//最后一行的都增加下边框
|
||||||
if (i == tableRowsSize-1){
|
//if (i == tableRowsSize-1){
|
||||||
tableToHtmlStr.append("<tr style=\"border-bottom: 1px solid;\">");
|
// tableToHtmlStr.append("<tr style=\"border-bottom: 1px solid;\">");
|
||||||
}else {
|
//}else {
|
||||||
tableToHtmlStr.append("<tr>");
|
// tableToHtmlStr.append("<tr>");
|
||||||
}
|
//}
|
||||||
|
tableToHtmlStr.append("<tr>");
|
||||||
|
|
||||||
int tableCellsSize = table.getRow(i).getTableCells().size();
|
int tableCellsSize = table.getRow(i).getTableCells().size();
|
||||||
for (int j = 0; j < tableCellsSize; j++) {
|
for (int j = 0; j < tableCellsSize; j++) {
|
||||||
@@ -209,32 +215,12 @@ public class ReadWordTable {
|
|||||||
} else { // 正常列
|
} else { // 正常列
|
||||||
tableToHtmlStr.append("<td ");
|
tableToHtmlStr.append("<td ");
|
||||||
}
|
}
|
||||||
tableToHtmlStr.append("style=\" ");
|
tableToHtmlStr.append("style=\" border: 1px solid;");
|
||||||
XWPFTableCell.XWPFVertAlign verticalAlignment = tableCell.getVerticalAlignment();
|
XWPFTableCell.XWPFVertAlign verticalAlignment = tableCell.getVerticalAlignment();
|
||||||
if (verticalAlignment != null){
|
if (verticalAlignment != null){
|
||||||
tableToHtmlStr.append("vertical-align: middle;");
|
tableToHtmlStr.append("vertical-align: middle;");
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTcBorders tcBorders = cellProperties.getTcBorders();
|
|
||||||
if (tcBorders != null){
|
|
||||||
CTBorder top = tcBorders.getTop();
|
|
||||||
if (top != null){
|
|
||||||
tableToHtmlStr.append("border-top: 1px solid;");
|
|
||||||
}
|
|
||||||
CTBorder bottom = tcBorders.getBottom();
|
|
||||||
if (bottom != null){
|
|
||||||
tableToHtmlStr.append("border-bottom: 1px solid;");
|
|
||||||
}
|
|
||||||
CTBorder left = tcBorders.getLeft();
|
|
||||||
if (left != null){
|
|
||||||
tableToHtmlStr.append("border-left: 1px solid;");
|
|
||||||
}
|
|
||||||
CTBorder right = tcBorders.getRight();
|
|
||||||
if (right != null){
|
|
||||||
tableToHtmlStr.append("border-right: 1px solid;");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tableToHtmlStr.append(" \" ");
|
tableToHtmlStr.append(" \" ");
|
||||||
int rowspan = getRowspan(table, i, j);
|
int rowspan = getRowspan(table, i, j);
|
||||||
// 合并的行
|
// 合并的行
|
||||||
@@ -246,6 +232,12 @@ public class ReadWordTable {
|
|||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
List<XWPFParagraph> paragraphs = tableCell.getParagraphs();
|
List<XWPFParagraph> paragraphs = tableCell.getParagraphs();
|
||||||
for (XWPFParagraph paragraph : paragraphs) {
|
for (XWPFParagraph paragraph : paragraphs) {
|
||||||
|
List<String> imageBundleList = fileSpiltService.readImageInParagraph(paragraph);
|
||||||
|
if (CollectionUtils.isNotEmpty(imageBundleList)) {
|
||||||
|
String s = fileSpiltService.addTableImage(paragraph, imageBundleList);
|
||||||
|
stringBuilder.append(s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for (XWPFRun xwrun : paragraph.getRuns()) {
|
for (XWPFRun xwrun : paragraph.getRuns()) {
|
||||||
VerticalAlign subscript = xwrun.getSubscript();
|
VerticalAlign subscript = xwrun.getSubscript();
|
||||||
String smalltext = xwrun.getText(0);
|
String smalltext = xwrun.getText(0);
|
||||||
|
|||||||
Reference in New Issue
Block a user