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 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.usermodel.PictureType;
|
||||||
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.*;
|
||||||
@@ -152,12 +153,23 @@ 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);
|
||||||
|
// 获取文档中的图片
|
||||||
|
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 = 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();
|
||||||
|
|
||||||
// 记录拆分后的每一段文字
|
// 记录拆分后的每一段文字
|
||||||
List<IBodyElement> elements = doc.getBodyElements();
|
List<IBodyElement> elements = doc.getBodyElements();
|
||||||
// 记录word自动生成的编号数据
|
// 记录word自动生成的编号数据
|
||||||
@@ -176,6 +188,31 @@ public class FileSpiltService {
|
|||||||
XWPFParagraph p = (XWPFParagraph) element;
|
XWPFParagraph p = (XWPFParagraph) element;
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
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()) {
|
for (XWPFRun xwrun : p.getRuns()) {
|
||||||
VerticalAlign subscript = xwrun.getSubscript();
|
VerticalAlign subscript = xwrun.getSubscript();
|
||||||
String smalltext = xwrun.getText(0);
|
String smalltext = xwrun.getText(0);
|
||||||
@@ -345,9 +382,6 @@ public class FileSpiltService {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nextParagraphString.contains("附 录 A")){
|
|
||||||
System.out.println("1");
|
|
||||||
}
|
|
||||||
if (!hasGoIf && menuCanAdd) {
|
if (!hasGoIf && menuCanAdd) {
|
||||||
// 判断是否是附录
|
// 判断是否是附录
|
||||||
boolean find = APPENDIX_PATTERN.matcher(paragraphString).find();
|
boolean find = APPENDIX_PATTERN.matcher(paragraphString).find();
|
||||||
@@ -447,7 +481,7 @@ public class FileSpiltService {
|
|||||||
private static void handleParagraphOMath(StringBuilder content, CTOMath child) {
|
private static void handleParagraphOMath(StringBuilder content, CTOMath child) {
|
||||||
log.info(">> 开始解析段落中的CTOMath公式");
|
log.info(">> 开始解析段落中的CTOMath公式");
|
||||||
//将word中的omml格式转换成mathML
|
//将word中的omml格式转换成mathML
|
||||||
String mathMLFromNode = OmmlUtils.getMathMLFromNode(child.xmlText());
|
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||||
content.append(mathMLFromNode);
|
content.append(mathMLFromNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,7 +494,7 @@ public class FileSpiltService {
|
|||||||
private static void handleParagraphOMath(StringBuilder content, CTOMathPara child) {
|
private static void handleParagraphOMath(StringBuilder content, CTOMathPara child) {
|
||||||
log.info(">> 开始解析段落中的CTOMathPara公式");
|
log.info(">> 开始解析段落中的CTOMathPara公式");
|
||||||
//将word中的omml格式转换成mathML
|
//将word中的omml格式转换成mathML
|
||||||
String mathMLFromNode = OmmlUtils.getMathMLFromNode(child.xmlText());
|
String mathMLFromNode = MathmlUtils.convertOMML2MML(child.xmlText());
|
||||||
content.append(mathMLFromNode);
|
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) {
|
public static String getMathMLFromNode(String omML) {
|
||||||
//通过word中的xsl转成器解析omml公式格式
|
//通过word中的xsl转成器解析omml公式格式
|
||||||
URL resourceUrl = ResourcePath.class.getClassLoader().getResource("OMML2MML.XSL");
|
//URL resourceUrl = ResourcePath.class.getClassLoader().getResource("OMML2MML.XSL");
|
||||||
File file = new File(resourceUrl.getPath());
|
//File file = new File(resourceUrl.getPath());
|
||||||
StreamSource xslSource = new StreamSource(WordUtil.class.getResourceAsStream("conventer/OMML2MML.XSL"));
|
StreamSource xslSource = new StreamSource(MathmlUtils.class.getResourceAsStream("conventer/OMML2MML.XSL"));
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
try {
|
try {
|
||||||
Transformer t = TransformerFactory.newInstance().newTransformer(xslSource);
|
Transformer t = TransformerFactory.newInstance().newTransformer(xslSource);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user