From 86ddedb4456a61c8346a097d9edc1be442a749c8 Mon Sep 17 00:00:00 2001 From: lijiarao Date: Wed, 3 Jan 2024 17:19:25 +0800 Subject: [PATCH] =?UTF-8?q?fix=2078374=20=E8=BF=94=E5=9B=9E=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E7=9A=84omml=E5=88=B0=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../split/service/impl/FileSpiltService.java | 46 +- .../jero/modules/split/util/MathmlUtils.java | 113 + .../jero/modules/split/util/OmmlUtils.java | 6 +- .../src/main/resources/conventer/OMML2MML.XSL | 2068 +++++++++++++++++ 4 files changed, 2224 insertions(+), 9 deletions(-) create mode 100644 laws-modules/src/main/java/com/jero/modules/split/util/MathmlUtils.java create mode 100644 laws-modules/src/main/resources/conventer/OMML2MML.XSL diff --git a/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSpiltService.java b/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSpiltService.java index 67b6b01d..36deb7b4 100644 --- a/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSpiltService.java +++ b/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSpiltService.java @@ -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 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 titleNumberMap = titleNumberVO.getTitleNumberMap(); List emptyTitleList = titleNumberVO.getEmptyTitleList(); - // 记录拆分后的每一段文字 List 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 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); } diff --git a/laws-modules/src/main/java/com/jero/modules/split/util/MathmlUtils.java b/laws-modules/src/main/java/com/jero/modules/split/util/MathmlUtils.java new file mode 100644 index 00000000..a0d73c17 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/split/util/MathmlUtils.java @@ -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 = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 2\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 3\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 4\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 5\n" + + " \n" + + " \n" + + " \n" + + " 6\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " + \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " sin(x)\n" + + " \n" + + " \n" + + " \n" + + "\n"; + String result = xslConvert(xml, "/conventer/OMML2MML.XSL", null); + return result; + } +} diff --git a/laws-modules/src/main/java/com/jero/modules/split/util/OmmlUtils.java b/laws-modules/src/main/java/com/jero/modules/split/util/OmmlUtils.java index 3a75d50a..57905ed0 100644 --- a/laws-modules/src/main/java/com/jero/modules/split/util/OmmlUtils.java +++ b/laws-modules/src/main/java/com/jero/modules/split/util/OmmlUtils.java @@ -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); diff --git a/laws-modules/src/main/resources/conventer/OMML2MML.XSL b/laws-modules/src/main/resources/conventer/OMML2MML.XSL new file mode 100644 index 00000000..b46ae33b --- /dev/null +++ b/laws-modules/src/main/resources/conventer/OMML2MML.XSL @@ -0,0 +1,2068 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ˘ + + ¸ + + ` + + - + + + + . + + ˙ + + ˝ + + ´ + + ~ + + ˜ + + ¨ + + ˇ + + ^ + + ¯ + + _ + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + + + right + + + + + + + + + + + + + + + + 0 + + + + + + + + + + 0 + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0in + + + 0in + + + 0in + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + false + + + + + + + + + + + + + + + + + + + off + + + + + + + + + + + off + + + + + + + + + + + + + + off + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + 0pt + + + + right + + + left + + + + + right + + + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + ¯ + + + + + + + + + + _ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + normal + + + + + + + + monospace + sans-serif-italic + bold-sans-serif + sans-serif-bold-italic + sans-serif + bold-fraktur + fraktur + double-struck + bold-script + script + bold + italic + normal + bold-italic + + + + + + bold + normal + + + + + normal + italic + + + + + + + + + + + + + + + + + + + + + + + + italic + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + box + + + + + + + + + + + + + + + + + left right top bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + -1 + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + 1 + 0 + + +