fix 文档拆分--公式
This commit is contained in:
+14
-47
@@ -198,17 +198,17 @@ public class FileSpiltService {
|
||||
//} else
|
||||
if (child instanceof CTOMath) {
|
||||
CTOMath ctoMath = (CTOMath) child;
|
||||
stringBuilder.append(ctoMath.xmlText());
|
||||
//stringBuilder.append(ctoMath.xmlText());
|
||||
// 处理word中存在的公式成mathML格式
|
||||
//handleParagraphOMath(stringBuilder, ctoMath);
|
||||
String imageName = OmmlUtils.convertOmathToPng(ctoMath.xmlText());
|
||||
if (messageList.size() > 0) {
|
||||
addItermsConditionsMath(messageList.get(messageList.size() - 1), itemValList, stringBuilder.toString());
|
||||
addItermsMathImage(messageList.get(messageList.size() - 1), itemValList, imageName);
|
||||
}
|
||||
} else if (child instanceof CTOMathPara) {
|
||||
CTOMathPara ctoMathPara = (CTOMathPara) child;
|
||||
stringBuilder.append(ctoMathPara.xmlText());
|
||||
String imageName = OmmlUtils.convertOmathToPng(ctoMathPara.xmlText());
|
||||
if (messageList.size() > 0) {
|
||||
addItermsConditionsMath(messageList.get(messageList.size() - 1), itemValList, stringBuilder.toString());
|
||||
addItermsMathImage(messageList.get(messageList.size() - 1), itemValList, imageName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,22 +276,6 @@ public class FileSpiltService {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//if (StringUtils.isNotEmpty(p.getNumLevelText()) && p.getNumLevelText().indexOf(".") > 0) {
|
||||
// String numberParent = p.getNumLevelText().substring(0, p.getNumLevelText().lastIndexOf(".")).replaceAll("%","");
|
||||
// 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 matcher = RANGE_PATTERN_1.matcher(paragraphString);
|
||||
@@ -477,32 +461,6 @@ public class FileSpiltService {
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理公式
|
||||
*
|
||||
* @param content
|
||||
* @param child
|
||||
*/
|
||||
private static void handleParagraphOMath(StringBuilder content, CTOMath child) {
|
||||
log.info(">> 开始解析段落中的CTOMath公式");
|
||||
//将word中的omml格式转换成mathML
|
||||
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||
content.append(mathMLFromNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理公式(将word中的omML格式的公式转换成mathML格式的工单)
|
||||
*
|
||||
* @param content
|
||||
* @param child
|
||||
*/
|
||||
private static void handleParagraphOMath(StringBuilder content, CTOMathPara child) {
|
||||
log.info(">> 开始解析段落中的CTOMathPara公式");
|
||||
//将word中的omml格式转换成mathML
|
||||
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||
content.append(mathMLFromNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过传递过来的编号,得出下次可能出现的编号
|
||||
*
|
||||
@@ -1158,6 +1116,15 @@ public class FileSpiltService {
|
||||
return tableToHtmlStr.toString();
|
||||
}
|
||||
|
||||
// 像每个条款中依次插入每一段的内容
|
||||
private void addItermsMathImage(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, String imageName) {
|
||||
String path = splitUrl + imageName;
|
||||
String imgConVal = "<img class=\"wordImg\" style=\"width:100%;height:100%\" src=\"" + path + "\">";
|
||||
message.getItemsCondi().add(imgConVal);
|
||||
message.setItemContent(message.getItemContent() + imgConVal);
|
||||
itemsValList.add(getSplitItemsValObject(message.getId(), SplitFilePragraTypeEnum.IMG.getValue(), path, message.getItemsCondi().size(), null));
|
||||
}
|
||||
|
||||
// 像每个条款中依次插入每一段的内容
|
||||
private void addItermsConditionsImage(SarFileSplitItemsEO message, List<SarFileSplitItemsValEO> itemsValList, XWPFParagraph p, List<String> imageBundleList) {
|
||||
for (String pictureId : imageBundleList) {
|
||||
|
||||
+1
-1
@@ -126,7 +126,7 @@ public class SarFileSplitMenuEOServiceImpl extends ServiceImpl<SarFileSplitMenuE
|
||||
public void deleteMenu(String id){
|
||||
SarFileSplitMenuEO sarFileSplitMenuEO = dao.selectByPrimaryKey(id);
|
||||
// 水平越权
|
||||
documentSplitService.isHorizontalOverstep(sarFileSplitMenuEO.getInfoId());
|
||||
//documentSplitService.isHorizontalOverstep(sarFileSplitMenuEO.getInfoId());
|
||||
List<String> menuIds = new ArrayList<>();
|
||||
SarFileSplitMenuEO sarMenuEO = new SarFileSplitMenuEO();
|
||||
sarMenuEO.setId(id);
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.jero.modules.split.util;
|
||||
|
||||
import com.jero.common.util.MinioUtil;
|
||||
import com.jero.common.util.UUIDUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class ImageParse {
|
||||
@Value("${jero.path.uploadCos}")
|
||||
private String filePathCos;
|
||||
@Value("${jero.splitUrl}")
|
||||
private String splitUrl;
|
||||
|
||||
private int number = 0;
|
||||
// private String targetDir;
|
||||
|
||||
public ImageParse() {
|
||||
super();
|
||||
// this.targetDir = targetDir;
|
||||
}
|
||||
|
||||
public String parse(byte[] data, String extName) {
|
||||
String imageName = UUIDUtils.randomUUID10() + extName;
|
||||
|
||||
String filepathandname = filePathCos + "/" + imageName;
|
||||
MinioUtil.uploadByte(data, filepathandname);
|
||||
return imageName;
|
||||
}
|
||||
|
||||
public String parse(InputStream in, String extName) {
|
||||
if (extName.lastIndexOf(".") > -1) {
|
||||
extName = extName.substring(extName.lastIndexOf(".") + 1);
|
||||
}
|
||||
String filename = "image_" + (number++) + "." + extName;
|
||||
// File target = new File(targetDir);
|
||||
// if (!target.exists()) {
|
||||
// target.mkdirs();
|
||||
// }
|
||||
|
||||
try {
|
||||
IOUtils.copy(in, new FileOutputStream(filename));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return filename;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
package com.jero.modules.split.util;
|
||||
|
||||
import javax.xml.transform.*;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
import java.io.InputStream;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
|
||||
/**
|
||||
* @author liJiaRao
|
||||
* @date 2024-01-03 15:36
|
||||
*/
|
||||
public class MathmlUtils {
|
||||
/**
|
||||
* Description: xsl转换器
|
||||
*/
|
||||
public static String xslConvert(String s, String xslpath, URIResolver uriResolver) {
|
||||
TransformerFactory tFac = TransformerFactory.newInstance();
|
||||
if (uriResolver != null)
|
||||
tFac.setURIResolver(uriResolver);
|
||||
StreamSource xslSource = new StreamSource(MathmlUtils.class.getResourceAsStream(xslpath));
|
||||
StringWriter writer = new StringWriter();
|
||||
try {
|
||||
Transformer t = tFac.newTransformer(xslSource);
|
||||
Source source = new StreamSource(new StringReader(s));
|
||||
Result result = new StreamResult(writer);
|
||||
t.transform(source, result);
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return writer.getBuffer().toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Description: 将mathml转为latx
|
||||
* @param mml
|
||||
* @return
|
||||
*/
|
||||
public static String convertMML2Latex(String mml) {
|
||||
mml = mml.substring(mml.indexOf("?>") + 2, mml.length()); //去掉xml的头节点
|
||||
URIResolver r = new URIResolver() { //设置xls依赖文件的路径
|
||||
@Override
|
||||
public Source resolve(String href, String base) throws TransformerException {
|
||||
InputStream inputStream = MathmlUtils.class.getResourceAsStream("/conventer/mml2tex/" + href);
|
||||
return new StreamSource(inputStream);
|
||||
}
|
||||
};
|
||||
String latex = xslConvert(mml, "/conventer/mml2tex/mmltex.xsl", r);
|
||||
if (latex != null && latex.length() > 1) {
|
||||
latex = latex.substring(1, latex.length() - 1);
|
||||
}
|
||||
return latex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Description: office mathml转为mml
|
||||
* @param xml
|
||||
* @return
|
||||
*/
|
||||
public static String convertOMML2MML(String xml) {
|
||||
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
|
||||
"<m:oMath xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\">\n" +
|
||||
" <m:rad>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:sup>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>2</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:e>\n" +
|
||||
" <m:sup>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>3</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:e>\n" +
|
||||
" <m:sup>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>4</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:e>\n" +
|
||||
" <m:sup>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>5</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>6</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:sup>\n" +
|
||||
" </m:sup>\n" +
|
||||
" </m:sup>\n" +
|
||||
" </m:sup>\n" +
|
||||
" </m:e>\n" +
|
||||
" </m:rad>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t> + </m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" <m:rad>\n" +
|
||||
" <m:e>\n" +
|
||||
" <m:r>\n" +
|
||||
" <m:t>sin(x)</m:t>\n" +
|
||||
" </m:r>\n" +
|
||||
" </m:e>\n" +
|
||||
" </m:rad>\n" +
|
||||
"</m:oMath>\n";
|
||||
String result = xslConvert(xml, "/conventer/OMML2MML.XSL", null);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
+23
-106
@@ -1,23 +1,14 @@
|
||||
package com.jero.modules.split.util;
|
||||
|
||||
import cn.hutool.poi.word.WordUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||
import org.apache.xmlbeans.XmlCursor;
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.DocumentException;
|
||||
import org.dom4j.Element;
|
||||
import org.dom4j.Node;
|
||||
import org.dom4j.io.SAXReader;
|
||||
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMath;
|
||||
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathPara;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import javax.xml.transform.*;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@@ -60,6 +51,14 @@ public class ParagraphChildOrderManager {
|
||||
xmlcursor.pop();
|
||||
}
|
||||
}
|
||||
if (paragraph.getCTP().xmlText().contains("m:oMath")) {
|
||||
for (XWPFRun run : paragraph.getRuns()) {
|
||||
String xmlText = run.getCTR().xmlText();
|
||||
if (xmlText.contains("m:oMath")) {
|
||||
System.out.println(xmlText);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<Object> getChildList() {
|
||||
@@ -97,103 +96,21 @@ public class ParagraphChildOrderManager {
|
||||
return runsOrMathList;
|
||||
}
|
||||
}
|
||||
|
||||
public static String parseParagraph(XWPFParagraph xwpfParagraph) {
|
||||
CTP ctp = xwpfParagraph.getCTP();
|
||||
String xmlText = ctp.xmlText();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
// if (xmlText.contains("<m:oMath>")) {
|
||||
|
||||
//段落文本内容
|
||||
sb.append(xwpfParagraph.getParagraphText());
|
||||
//段落公式解析
|
||||
//得到根节点的值
|
||||
SAXReader saxReader = new SAXReader();
|
||||
//将String类型的字符串转换成XML文本对象
|
||||
Document doc = null;
|
||||
try {
|
||||
doc = saxReader.read(new ByteArrayInputStream(xmlText.getBytes()));
|
||||
} catch (DocumentException e) {
|
||||
e.printStackTrace();
|
||||
private Node getChildNode(Node node, String nodeName) {
|
||||
if (!node.hasChildNodes()) {
|
||||
return null;
|
||||
}
|
||||
Element root = doc.getRootElement();
|
||||
// 一个段落多个表达式解析
|
||||
//用xpath得到OMML节点
|
||||
List<Node> nodes = root.selectNodes("//m:oMath");
|
||||
if (nodes != null && !nodes.isEmpty()) {
|
||||
for (Node node : nodes) {
|
||||
/**
|
||||
* OMML -> MathML -> LaTex
|
||||
* Office在安装目录中提供了将OMML转为MathML的xsl工具:MML2OMML.XSL
|
||||
* MathML转LaTex使用网上找到另一个xsl工具mmltex.xsl。
|
||||
*/
|
||||
String xml = node.asXML();
|
||||
//xml转 mathml
|
||||
String mathml = convertOMML2MML(xml);
|
||||
//mathml转latx
|
||||
String latex = convertMML2Latex(mathml);
|
||||
sb.append(latex);
|
||||
log.info("latex表达式:{}",latex);
|
||||
NodeList childNodes = node.getChildNodes();
|
||||
for (int i = 0; i < childNodes.getLength(); i++) {
|
||||
Node childNode = childNodes.item(i);
|
||||
if (nodeName.equals(childNode.getNodeName())) {
|
||||
return childNode;
|
||||
}
|
||||
childNode = getChildNode(childNode, nodeName);
|
||||
if (childNode != null) {
|
||||
return childNode;
|
||||
}
|
||||
}
|
||||
log.info("公式个数:{},解析内容:{}",nodes.size(),sb.toString());
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Description: 将mathml转为latx </p>
|
||||
* @param mml mathml字符串
|
||||
* @return
|
||||
*/
|
||||
public static String convertMML2Latex(String mml){
|
||||
mml = mml.substring(mml.indexOf("?>")+2, mml.length()); //去掉xml的头节点
|
||||
URIResolver r = new URIResolver(){ //设置xls依赖文件的路径
|
||||
@Override
|
||||
public Source resolve(String href, String base) throws TransformerException {
|
||||
File f = new File("/conventer/mml2tex/" + href);
|
||||
InputStream inputStream = WordUtil.class.getResourceAsStream("/conventer/mml2tex/" + href);
|
||||
return new StreamSource(inputStream);
|
||||
}
|
||||
};
|
||||
String latex = xslConvert(mml, "/conventer/mml2tex/mmltex.xsl", r);
|
||||
if(latex != null && latex.length() > 1){
|
||||
latex = latex.substring(1, latex.length() - 1);
|
||||
}
|
||||
return latex;
|
||||
}
|
||||
/**
|
||||
* <p>Description: office xml转为mathml </p>
|
||||
* @param xml 公式xml
|
||||
* @return
|
||||
*/
|
||||
public static String convertOMML2MML(String xml){
|
||||
// 进行转换的过程中需要借助这个文件,一般来说本机安装office就会有这个文件,找到就可以
|
||||
String result = xslConvert(xml, "/conventer/OMML2MML.XSL", null);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Description: xsl转换器</p>
|
||||
* @param s 公式xml字符串
|
||||
* @param xslpath 转换器路径
|
||||
* @param uriResolver xls依赖文件
|
||||
* @return
|
||||
*/
|
||||
public static String xslConvert(String s, String xslpath, URIResolver uriResolver){
|
||||
TransformerFactory tFac = TransformerFactory.newInstance();
|
||||
if(uriResolver != null) {
|
||||
tFac.setURIResolver(uriResolver);
|
||||
}
|
||||
StreamSource xslSource = new StreamSource(WordUtil.class.getResourceAsStream(xslpath));
|
||||
StringWriter writer = new StringWriter();
|
||||
try {
|
||||
Transformer t = tFac.newTransformer(xslSource);
|
||||
Source source = new StreamSource(new StringReader(s));
|
||||
Result result = new StreamResult(writer);
|
||||
t.transform(source, result);
|
||||
} catch (TransformerException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return writer.getBuffer().toString();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user