fix 78374 返回公式的omml到前端
This commit is contained in:
+40
-6
@@ -18,6 +18,7 @@ import com.jero.modules.split.vo.TitleNumberVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.poi.hwpf.usermodel.PictureType;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||
import org.apache.poi.xwpf.usermodel.*;
|
||||
@@ -152,12 +153,23 @@ public class FileSpiltService {
|
||||
//try (InputStream is = new FileInputStream(readFilePath); InputStream is1 = new FileInputStream(readFilePath)) {//需要将文件路更改为word文档所在路径。
|
||||
ZipSecureFile.setMinInflateRatio(-1.0d);
|
||||
XWPFDocument doc = new XWPFDocument(is);
|
||||
// 获取文档中的图片
|
||||
List<XWPFPictureData> allPictures = doc.getAllPictures();
|
||||
// 遍历图片并处理数学公式
|
||||
for (XWPFPictureData pictureData : allPictures) {
|
||||
String contentType = pictureData.getPackagePart().getContentType();
|
||||
System.out.println(contentType);
|
||||
// 判断图片类型是否为数学公式
|
||||
if (contentType.equals(PictureType.EMF.getExtension())) {
|
||||
// 处理数学公式,你可以在这里添加自己的逻辑
|
||||
System.out.println("Found a math equation!");
|
||||
}
|
||||
}
|
||||
//获得序号标题和无标题序号
|
||||
TitleNumberVO titleNumberVO = AsposeUtil.getNumber(is1);
|
||||
//TitleNumberVO titleNumberVO = new TitleNumberVO();
|
||||
Map<String, String> titleNumberMap = titleNumberVO.getTitleNumberMap();
|
||||
List<String> emptyTitleList = titleNumberVO.getEmptyTitleList();
|
||||
|
||||
// 记录拆分后的每一段文字
|
||||
List<IBodyElement> elements = doc.getBodyElements();
|
||||
// 记录word自动生成的编号数据
|
||||
@@ -176,6 +188,31 @@ public class FileSpiltService {
|
||||
XWPFParagraph p = (XWPFParagraph) element;
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
|
||||
ParagraphChildOrderManager runOrMaths = new ParagraphChildOrderManager(p);
|
||||
List<Object> childList = runOrMaths.getChildList();
|
||||
|
||||
for (Object child : childList) {
|
||||
//if (child instanceof XWPFRun) {
|
||||
// //处理段落中的文本以及图片
|
||||
// handleParagraphRun(content, (XWPFRun) child, imageParser);
|
||||
//} else
|
||||
if (child instanceof CTOMath) {
|
||||
CTOMath ctoMath = (CTOMath) child;
|
||||
stringBuilder.append(ctoMath.xmlText());
|
||||
// 处理word中存在的公式成mathML格式
|
||||
//handleParagraphOMath(stringBuilder, ctoMath);
|
||||
if (messageList.size() > 0) {
|
||||
addItermsConditionsMath(messageList.get(messageList.size() - 1), itemValList, stringBuilder.toString());
|
||||
}
|
||||
} else if (child instanceof CTOMathPara) {
|
||||
CTOMathPara ctoMathPara = (CTOMathPara) child;
|
||||
stringBuilder.append(ctoMathPara.xmlText());
|
||||
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);
|
||||
@@ -345,9 +382,6 @@ public class FileSpiltService {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (nextParagraphString.contains("附 录 A")){
|
||||
System.out.println("1");
|
||||
}
|
||||
if (!hasGoIf && menuCanAdd) {
|
||||
// 判断是否是附录
|
||||
boolean find = APPENDIX_PATTERN.matcher(paragraphString).find();
|
||||
@@ -447,7 +481,7 @@ public class FileSpiltService {
|
||||
private static void handleParagraphOMath(StringBuilder content, CTOMath child) {
|
||||
log.info(">> 开始解析段落中的CTOMath公式");
|
||||
//将word中的omml格式转换成mathML
|
||||
String mathMLFromNode = OmmlUtils.getMathMLFromNode(child.xmlText());
|
||||
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||
content.append(mathMLFromNode);
|
||||
}
|
||||
|
||||
@@ -460,7 +494,7 @@ public class FileSpiltService {
|
||||
private static void handleParagraphOMath(StringBuilder content, CTOMathPara child) {
|
||||
log.info(">> 开始解析段落中的CTOMathPara公式");
|
||||
//将word中的omml格式转换成mathML
|
||||
String mathMLFromNode = OmmlUtils.getMathMLFromNode(child.xmlText());
|
||||
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||
content.append(mathMLFromNode);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -27,9 +27,9 @@ public class OmmlUtils {
|
||||
*/
|
||||
public static String getMathMLFromNode(String omML) {
|
||||
//通过word中的xsl转成器解析omml公式格式
|
||||
URL resourceUrl = ResourcePath.class.getClassLoader().getResource("OMML2MML.XSL");
|
||||
File file = new File(resourceUrl.getPath());
|
||||
StreamSource xslSource = new StreamSource(WordUtil.class.getResourceAsStream("conventer/OMML2MML.XSL"));
|
||||
//URL resourceUrl = ResourcePath.class.getClassLoader().getResource("OMML2MML.XSL");
|
||||
//File file = new File(resourceUrl.getPath());
|
||||
StreamSource xslSource = new StreamSource(MathmlUtils.class.getResourceAsStream("conventer/OMML2MML.XSL"));
|
||||
StringWriter writer = new StringWriter();
|
||||
try {
|
||||
Transformer t = TransformerFactory.newInstance().newTransformer(xslSource);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user