fix 78374 返回公式的omml到前端

This commit is contained in:
lijiarao
2024-01-04 09:12:05 +08:00
parent bb5f080da4
commit 86ddedb445
4 changed files with 2224 additions and 9 deletions
@@ -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);