提交代码

This commit is contained in:
lijiarao
2024-03-25 15:56:05 +08:00
parent 3de2fe4bbb
commit 5b432488c6
14 changed files with 5626 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
+102
View File
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mathToImg</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mathToImg</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-codec</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jeuclid</groupId>
<artifactId>jeuclid-core</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
<exclusions>
<exclusion>
<artifactId>okio</artifactId>
<groupId>com.squareup.okio</groupId>
</exclusion>
<exclusion>
<artifactId>okhttp</artifactId>
<groupId>com.squareup.okhttp3</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,13 @@
package com.example.mathtoimg;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MathToImgApplication {
public static void main(String[] args) {
SpringApplication.run(MathToImgApplication.class, args);
}
}
@@ -0,0 +1,640 @@
package com.example.mathtoimg.controller;
import com.example.mathtoimg.utils.ImageParse;
import com.example.mathtoimg.utils.MinioUtil;
import com.example.mathtoimg.utils.OmmlUtils;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.URLDecoder;
import java.util.Map;
@RestController
public class mathToImgController {
private static final Logger log = LoggerFactory.getLogger(mathToImgController.class);
@Value("${file.mathToImgFilePath}")
private String mathToImgFilePath;
@Value("${xsl.omml2mmlFilePath}")
private String omml2mmlFilePath;
@PostMapping("/mathToImg")
public String mathToImg(@RequestBody String oriMathXmlStr) throws XmlException, UnsupportedEncodingException {
String result = "";
//String oriMathXmlStr = decoder((String) map.get("encode"));
XmlObject object = XmlObject.Factory.parse(oriMathXmlStr);
ImageParse imageParser = new ImageParse();
File file = OmmlUtils.convertOmathToPng(object, imageParser,mathToImgFilePath,omml2mmlFilePath);
try {
MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
String upload = MinioUtil.upload(multipartFile, "1");
file.delete();
return upload;
} catch (IOException e) {
log.error("",e);
return "公式转换图片失败";
}
}
public String decoder(String encode){
String decode = null;
try {
decode = URLDecoder.decode(encode, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return decode;
}
public static String oriMathXmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<m:oMath xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"\n" +
" xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\"\n" +
" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n" +
" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n" +
" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n" +
" xmlns:v=\"urn:schemas-microsoft-com:vml\"\n" +
" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\"\n" +
" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\n" +
" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n" +
" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\n" +
" xmlns:w10=\"urn:schemas-microsoft-com:office:word\"\n" +
" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\n" +
" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\"\n" +
" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\"\n" +
" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\"\n" +
" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"\n" +
" xmlns:wpsCustomData=\"http://www.wps.cn/officeDocument/2013/wpsCustomData\">\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>f</m:t>\n" +
" </m:r>\n" +
" <m:d>\n" +
" <m:dPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:dPr>\n" +
" <m:e>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>x</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" </m:d>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>=</m:t>\n" +
" </m:r>\n" +
" <m:sSub>\n" +
" <m:sSubPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sSubPr>\n" +
" <m:e>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>a</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" <m:sub>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>0</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sub>\n" +
" </m:sSub>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>+</m:t>\n" +
" </m:r>\n" +
" <m:nary>\n" +
" <m:naryPr>\n" +
" <m:chr m:val=\"\"/>\n" +
" <m:grow m:val=\"1\"/>\n" +
" <m:limLoc m:val=\"undOvr\"/>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:naryPr>\n" +
" <m:sub>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>n=1</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sub>\n" +
" <m:sup>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>∞</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sup>\n" +
" <m:e>\n" +
" <m:d>\n" +
" <m:dPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:dPr>\n" +
" <m:e>\n" +
" <m:sSub>\n" +
" <m:sSubPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sSubPr>\n" +
" <m:e>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>a</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" <m:sub>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>n</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sub>\n" +
" </m:sSub>\n" +
" <m:func>\n" +
" <m:funcPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:funcPr>\n" +
" <m:fName>\n" +
" <m:r>\n" +
" <m:rPr>\n" +
" <m:sty m:val=\"p\"/>\n" +
" </m:rPr>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>cos</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:fName>\n" +
" <m:e>\n" +
" <m:f>\n" +
" <m:fPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:fPr>\n" +
" <m:num>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>nπx</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:num>\n" +
" <m:den>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>L</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:den>\n" +
" </m:f>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" </m:func>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>+</m:t>\n" +
" </m:r>\n" +
" <m:sSub>\n" +
" <m:sSubPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sSubPr>\n" +
" <m:e>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>b</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" <m:sub>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>n</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:sub>\n" +
" </m:sSub>\n" +
" <m:func>\n" +
" <m:funcPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:funcPr>\n" +
" <m:fName>\n" +
" <m:r>\n" +
" <m:rPr>\n" +
" <m:sty m:val=\"p\"/>\n" +
" </m:rPr>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>sin</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:fName>\n" +
" <m:e>\n" +
" <m:f>\n" +
" <m:fPr>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:fPr>\n" +
" <m:num>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>nπx</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:num>\n" +
" <m:den>\n" +
" <m:r>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" <m:t>L</m:t>\n" +
" </m:r>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:den>\n" +
" </m:f>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" </m:func>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" </m:d>\n" +
" <m:ctrlPr>\n" +
" <m:rPr/>\n" +
" <w:rPr>\n" +
" <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"微软雅黑\"/>\n" +
" <w:i/>\n" +
" <w:spacing w:val=\"8\"/>\n" +
" <w:sz w:val=\"19\"/>\n" +
" <w:szCs w:val=\"19\"/>\n" +
" </w:rPr>\n" +
" </m:ctrlPr>\n" +
" </m:e>\n" +
" </m:nary>\n" +
"</m:oMath>";
}
@@ -0,0 +1,45 @@
package com.example.mathtoimg.utils;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import java.io.*;
import java.util.UUID;
public class ImageParse {
private int number = 0;
// private String targetDir;
public ImageParse() {
super();
// this.targetDir = targetDir;
}
public String parse(byte[] data, String extName,String mathToImgFilePath) {
return parse(new ByteArrayInputStream(data), extName,mathToImgFilePath);
}
public String parse(InputStream in, String extName,String mathToImgFilePath) {
if (extName.lastIndexOf(".") > -1) {
extName = extName.substring(extName.lastIndexOf(".") + 1);
}
mathToImgFilePath = mathToImgFilePath + "/" + UUID.randomUUID().toString().replaceAll("-","");
File target = new File(mathToImgFilePath);
if (!target.exists()) {
target.mkdirs();
}
String filename = mathToImgFilePath + "/" + "image_" + (number++) + "." + extName;
try {
IOUtils.copy(in, new FileOutputStream(filename));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return filename;
}
}
@@ -0,0 +1,35 @@
package com.example.mathtoimg.utils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Minio文件上传配置文件
*/
@Configuration
public class MinioConfig {
@Value(value = "${jero.minio.minio_url}")
private String minioUrl;
@Value(value = "${jero.minio.minio_name}")
private String minioName;
@Value(value = "${jero.minio.minio_pass}")
private String minioPass;
@Value(value = "${jero.minio.bucketName}")
private String bucketName;
@Bean
public void initMinio(){
if(!minioUrl.startsWith("http")){
minioUrl = "http://" + minioUrl;
}
if(!minioUrl.endsWith("/")){
minioUrl = minioUrl.concat("/");
}
MinioUtil.setMinioUrl(minioUrl);
MinioUtil.setMinioName(minioName);
MinioUtil.setMinioPass(minioPass);
MinioUtil.setBucketName(bucketName);
}
}
@@ -0,0 +1,368 @@
package com.example.mathtoimg.utils;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* minio文件上传工具类
*/
public class MinioUtil {
private static final Logger log = LoggerFactory.getLogger(MinioUtil.class);
private MinioUtil(){
}
private static String minioUrl;
private static String minioName;
private static String minioPass;
private static String bucketName;
public static void setMinioUrl(String minioUrl) {
MinioUtil.minioUrl = minioUrl;
}
public static void setMinioName(String minioName) {
MinioUtil.minioName = minioName;
}
public static void setMinioPass(String minioPass) {
MinioUtil.minioPass = minioPass;
}
public static void setBucketName(String bucketName) {
MinioUtil.bucketName = bucketName;
}
public static String getMinioUrl() {
return minioUrl;
}
public static String getBucketName() {
return bucketName;
}
private static MinioClient minioClient = null;
/**
* 上传文件
* @param file
* @return
*/
public static String upload(MultipartFile file, String bizPath, String customBucket) {
String fileName = "";
//update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
//update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
String newBucket = bucketName;
if(isNotEmpty(customBucket)){
newBucket = customBucket;
}
try {
initMinio(minioUrl, minioName,minioPass);
// 检查存储桶是否已经存在
if(!minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
// 创建一个名为ota的存储桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
}
//update-end-author:liusq date:20210809 for: 过滤上传文件类型
InputStream stream = file.getInputStream();
// 获取文件名
String orgName = file.getOriginalFilename();
if("".equals(orgName)){
orgName=file.getName();
}
orgName = getFileName(orgName);
fileName = (!orgName.contains(".")
? orgName + "_" + System.currentTimeMillis()
: orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")));
String objectName = bizPath + "/" + fileName;
// 使用putObject上传一个本地文件到存储桶中。
if(objectName.startsWith("/")){
objectName = objectName.substring(1);
}
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(newBucket)
.contentType("application/octet-stream")
.stream(stream,stream.available(),-1).build();
minioClient.putObject(objectArgs);
stream.close();
}catch (Exception e){
log.error(e.getMessage(), e);
}
return fileName;
}
public static String getFileName(String fileName) {
if (StringUtils.isBlank(fileName)) {
return "";
}
//判断是否带有盘符信息
// Check for Unix-style path
int unixSep = fileName.lastIndexOf('/');
// Check for Windows-style path
int winSep = fileName.lastIndexOf('\\');
// Cut off at latest possible point
int pos = (winSep > unixSep ? winSep : unixSep);
if (pos != -1) {
// Any sort of path separator found...
fileName = fileName.substring(pos + 1);
}
//替换上传文件名字的特殊字符
fileName = fileName.replace("=", "").replace(",", "").replace("&", "")
.replace("#", "").replace("", "").replace("", "");
//替换上传文件名字中的空格
fileName = fileName.replaceAll("\\s", "");
return fileName;
}
public static boolean isNotEmpty(Object object) {
if (object != null && !object.equals("") && !object.equals("null")) {
return (true);
}
return (false);
}
/**
* 文件上传
* @param file
* @param bizPath
* @return
*/
public static String upload(MultipartFile file, String bizPath) {
return upload(file,bizPath,null);
}
/**
* 判断文件是否存在
* @param objectName 文件名
* @return
*/
public static boolean doesObjectExist(String objectName) {
boolean exist = true;
try {
initMinio(minioUrl, minioName,minioPass);
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
} catch (Exception e) {
exist = false;
}
return exist;
}
/**
* 获取文件流
* @param bucketName
* @param objectName
* @return
*/
public static InputStream getMinioFile(String bucketName, String objectName){
InputStream inputStream = null;
try {
initMinio(minioUrl, minioName, minioPass);
GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
inputStream = minioClient.getObject(objectArgs);
} catch (Exception e) {
log.info("文件获取失败" + e.getMessage());
}
return inputStream;
}
/**
* 获取文件流
* @param objectName
* @return
*/
public static InputStream download(String objectName){
InputStream inputStream = null;
try {
initMinio(minioUrl, minioName, minioPass);
GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
inputStream = minioClient.getObject(objectArgs);
} catch (Exception e) {
log.info("文件获取失败" + e.getMessage());
}
return inputStream;
}
/**
* 删除文件
* @param objectName
* @throws Exception
*/
public static void removeObject(String objectName) {
try {
initMinio(minioUrl, minioName,minioPass);
RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
minioClient.removeObject(objectArgs);
}catch (Exception e){
log.info("文件删除失败" + e.getMessage());
}
}
/**
* 删除文件
* @param objectName
* @throws Exception
*/
public static void delete(String objectName) {
try {
initMinio(minioUrl, minioName,minioPass);
RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
minioClient.removeObject(objectArgs);
}catch (Exception e){
log.info("文件删除失败" + e.getMessage());
}
}
/**
* 获取文件外链
* @param bucketName
* @param objectName
* @param expires
* @return
*/
public static String getObjectURL(String bucketName, String objectName, Integer expires) {
initMinio(minioUrl, minioName,minioPass);
try{
GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName)
.bucket(bucketName)
.expiry(expires).build();
String url = minioClient.getPresignedObjectUrl(objectArgs);
return URLDecoder.decode(url,"UTF-8");
}catch (Exception e){
log.info("文件路径获取失败" + e.getMessage());
}
return null;
}
/**
* 初始化客户端
* @param minioUrl
* @param minioName
* @param minioPass
* @return
*/
private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {
if (minioClient == null) {
try {
minioClient = MinioClient.builder()
.endpoint(minioUrl)
.credentials(minioName, minioPass)
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
return minioClient;
}
/**
* 上传文件到minio
* @param stream
* @param relativePath
* @return
*/
public static String upload(InputStream stream,String relativePath) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
initMinio(minioUrl, minioName,minioPass);
if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
log.info("Bucket already exists.");
} else {
// 创建一个名为ota的存储桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
log.info("create a new bucket.");
}
PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath)
.bucket(bucketName)
.contentType("application/octet-stream")
.stream(stream,stream.available(),-1).build();
minioClient.putObject(objectArgs);
stream.close();
return minioUrl+bucketName+"/"+relativePath;
}
/**
* cos 上传
* 相同key 文件会覆盖
* @param bytev
* @param key
*/
public static void uploadByte(byte[] bytev, String key){
initMinio(minioUrl, minioName,minioPass);
try {
// 生成预签名上传 URL
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.PUT)
.bucket(bucketName)
.object(key)
.expiry(1, TimeUnit.DAYS)
.extraQueryParams(reqParams)
.build());
log.info("生成预签名上传URL:" + url);
int responseCode = upLoadFileByte(url.toString(), bytev);
if (responseCode == 200) {
log.info("上传成功!");
} else {
log.info("上传失败!");
}
} catch (ErrorResponseException | InsufficientDataException | InternalException | ServerException | XmlParserException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static int upLoadFileByte(String singnedurl,byte[] bytev){
InputStream inputStream= null;
DataOutputStream out = null;
int responseCode = 0;
try {
URL url= null;
url = new URL(singnedurl);
inputStream= new ByteArrayInputStream(bytev);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
out = new DataOutputStream(connection.getOutputStream());
// 写入要上传的数据
IOUtils.copy(inputStream, out);
responseCode = connection.getResponseCode();
log.info("Service returned response code " + responseCode);
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
try {
inputStream.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
try {
out.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return responseCode;
}
}
}
@@ -0,0 +1,94 @@
package com.example.mathtoimg.utils;
import com.example.mathtoimg.controller.mathToImgController;
import net.sourceforge.jeuclid.context.LayoutContextImpl;
import net.sourceforge.jeuclid.context.Parameter;
import net.sourceforge.jeuclid.converter.Converter;
import org.apache.xmlbeans.XmlObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.net.URL;
public class OmmlUtils {
private static final Logger log = LoggerFactory.getLogger(OmmlUtils.class);
public static File convertOmathToPng(XmlObject xmlObject, ImageParse imageParser,String mathToImgFilePath,String omml2mmlFilePath) {
Document document = null;
try {
String mathMLStr = getMathMLFromNode(xmlObject.getDomNode(),omml2mmlFilePath);
System.out.println("xxxxxxxxxxxxxxxxxxxxxxx : " + mathMLStr);
document = W3cNodeUtil.xmlStr2Node(mathMLStr, "utf-16");
String imageName = documentToImageHTML(document, imageParser,mathToImgFilePath);
if (imageName != null) {
File tf = new File(imageName);
System.out.println("图片是否存在 ======== " + tf.exists() + "Name : " + tf.getName());
return tf;
}
} catch (Exception e) {
log.error("",e);
}
return null;
}
/**
* 直接转node有等号会出问题,先转成xml的string,再转成mathML的字符串
*
* @param node
* @return
* @throws IOException
* @throws TransformerException
*/
private static String getMathMLFromNode(Node node,String omml2mmlFilePath) throws IOException, TransformerException {
ClassLoader classLoader = OmmlUtils.class.getClassLoader();
URL url = classLoader.getResource("xsl/OMML2MML.XSL");
File xslFile = null;
if (url != null) {
try {
xslFile = new File(url.toURI());
} catch (Exception e) {
e.printStackTrace();
}
}
// final File xslFile = new File("/omml2mml.xsl");
// final File xslFile = new File("D:\\MyCode\\omml-test\\omml2mml.xsl");
// boolean exists = xslFile.exists();
//final File xslFile = new File(omml2mmlFilePath);
StreamSource streamSource = new StreamSource(xslFile);
String s = W3cNodeUtil.node2XmlStr(node);
// encoding utf-16
String mathML = W3cNodeUtil.xml2Xml(s, streamSource);
if (mathML != null) {
mathML = mathML.replaceAll("xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"", "");
mathML = mathML.replaceAll("xmlns:mml", "xmlns");
mathML = mathML.replaceAll("mml:", "");
}
return mathML;
}
private static String documentToImageHTML(Document document, ImageParse imageParser,String mathToImgFilePath) {
try {
Converter mathMLConvert = Converter.getInstance();
LayoutContextImpl localLayoutContextImpl = new LayoutContextImpl(LayoutContextImpl.getDefaultLayoutContext());
localLayoutContextImpl.setParameter(Parameter.MATHSIZE, 50);
ByteArrayOutputStream os = new ByteArrayOutputStream();
mathMLConvert.convert(document, os, "image/png", localLayoutContextImpl);
String pngName = imageParser.parse(os.toByteArray(), ".png",mathToImgFilePath);
os.close();
return pngName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,115 @@
package com.example.mathtoimg.utils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
public class W3cNodeUtil {
public static String node2XmlStr(Node node) {
Transformer transformer = null;
if (node == null) {
throw new IllegalArgumentException("node 不能为空..");
}
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
if (transformer != null) {
try {
StringWriter sw = new StringWriter();
transformer.transform(new DOMSource(node), new StreamResult(sw));
return sw.toString();
} catch (TransformerException te) {
throw new RuntimeException(te.getMessage());
}
}
return null;
}
public static String xml2Xml(String xml, Source XSLSource) {
Transformer transformer = null;
if (xml == null) {
throw new IllegalArgumentException("node 不能为空..");
}
try {
if (XSLSource == null) {
transformer = TransformerFactory.newInstance().newTransformer();
} else {
transformer = TransformerFactory.newInstance().newTransformer(XSLSource);
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
if (transformer != null) {
try {
Source source = new StreamSource(new StringReader(xml));
StringWriter sw = new StringWriter();
transformer.transform(source, new StreamResult(sw));
return sw.toString();
} catch (TransformerException te) {
throw new RuntimeException(te.getMessage());
}
}
return null;
}
//MathML转成Document
public static Document xmlStr2Node(String xmlString, String encoding) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
InputStream is = new ByteArrayInputStream(xmlString.getBytes(encoding));
doc = dbf.newDocumentBuilder().parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
private static Node getChildNode(Node node, String nodeName) {
if (!node.hasChildNodes()) {
return null;
}
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;
}
}
return null;
}
public static Node getChildChainNode(Node node, String... nodeName) {
Node childNode = node;
for (int i = 0; i < nodeName.length; i++) {
String tmp = nodeName[i];
childNode = getChildNode(childNode, tmp);
if (childNode == null) {
return null;
}
}
return childNode;
}
}
+11
View File
@@ -0,0 +1,11 @@
server.port = 9998
# \u751F\u6210\u7684\u7279\u6B8A\u516C\u5F0F\u6587\u4EF6\u5B58\u50A8\u8DEF\u5F84
file.mathToImgFilePath = D://opt//mathToImg
# \u5904\u7406\u7279\u6B8A\u516C\u5F0F\u6240\u9700\u6587\u4EF6\u8DEF\u5F84
xsl.omml2mmlFilePath = D://workspace//laws_biyadi//mathToImg//xsl//OMML2MML.XSL
# minio\u6587\u4EF6\u4E0A\u4F20
jero.minio.minio_url = 10.10.10.45:9000
jero.minio.minio_name = admin
jero.minio.minio_pass = hzwlsoft.com
jero.minio.bucketName = laws-sinotruk
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
package com.example.mathtoimg;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MathToImgApplicationTests {
@Test
void contextLoads() {
}
}
+2068
View File
File diff suppressed because it is too large Load Diff