fix 文档拆分--公式

This commit is contained in:
lijiarao
2024-01-25 11:53:16 +08:00
parent fbc9e50d81
commit 15c8da599d
18 changed files with 289 additions and 4854 deletions
@@ -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) {
@@ -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
@@ -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