init: WordFileParse docx→HTML 解析服务(含 Word EQ 域公式修复)

服务:Spring Boot 3.2 + docx4j 8.3.9,POST /api/v3/server_office_file/file/parse
      接受 .docx,返回 HTML(公式 → LaTeX,图片 → RustFS 外链)

公式支持三类来源:
- OMML(Word 2007+ 公式)      → Python omml_mathml2latex
- MathType OLE 对象            → Ruby mathtype2mathml → MathML → LaTeX
- Word EQ 域(老教辅主力)      → EqToLatexUtil(本次新增)

本次改动:
1. 新增 java-svc/.../core/EqToLatexUtil.java:
   移植自 jby backend-services office-core,EQ 语法 → LaTeX
   (\f→\dfrac、\r→\sqrt、\i→\int/\sum/\prod、\s→^{}/_{}、\b→\left\right、
     \a→array、\x→\boxed/\overline、\o\al 堆叠、圈码、化学符号、极限、连等式)
   品牌标记 JBYU* → WPU*,与采集端一致
2. CtoMathFinder:接上 EQ 分支(原为 not-ported 桩),域代码经
   EqToLatexUtil.convert 转 LaTeX 写入 eqLatexMap(WPEQNUM 占位符)
3. WordParseUtil.dealPlaceholder:EQ 的 LaTeX 同样加 \( \) 包裹
   (原先因 WPEQNUM 例外不加包裹,前端/MathJax 不渲染)

修前症状:教辅 Word 里分式/方程组/上下标整段丢失(如 {−1/3, 1} 变成 {-,1})
修后实测:46 份教辅 2908 处 EQ 域全部还原,公式总数 2954 处、零未包裹残留

安全:application.yml(含 RustFS 密钥)不入库,提供 application.yml.example;
      OssService 的 @Value 默认密钥已清空
This commit is contained in:
2026-09-29 09:43:13 +08:00
commit 3271fee5cc
360 changed files with 86082 additions and 0 deletions

View File

@@ -0,0 +1,413 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.jby.common.util.SpringContextHolder
* org.apache.commons.lang3.StringUtils
* org.springframework.boot.context.properties.ConfigurationProperties
* org.springframework.cloud.context.config.annotation.RefreshScope
* org.springframework.stereotype.Component
*/
package com.jby.officecore.config;
import com.jby.common.util.SpringContextHolder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope
@ConfigurationProperties(prefix="office.core.config")
public class OfficeCoreConfig {
private String tmpPath = "/opt/files/tmp";
private String templatePath;
private Boolean deleteTmpFile = true;
private String foreLatexToMathMlApi = "https://test.xinjiaoyu.com/api/v3/server_node_sheet_new/latex/to-mathml";
private String latexToMathMlApi = "http://172.26.197.220:8050/latex_to_mathml";
private String mathMlToLatexApi = "http://172.26.197.220:8050/mathml_to_latex";
private Boolean mathMlToLatexApiSwitch;
private String mf2SvgApi = "http://test.format.xinjiaoyu.com/server_format/graphic/mf2svg";
private String downloadPdfApi = "https://test.xinjiaoyu.com/api/v3/server_node_sheet_new/office/download";
private String errorBookTemplate = "https://test.xinjiaoyu.com/main/print.html?%s#/downloadNotebook";
private Integer nodeConnectTimeout = 5000;
private Integer nodeSocketTimeout = 30000;
private Long contentLimit = 100000L;
private Double limitRatio = 0.6;
private Integer checkSize = 10;
private Double imageScalingFactor = 0.7;
private String copyrightAddresses = "www.zxxk.com,www.zujuan.com,www.jyeoo.com";
private Boolean newParseVersion;
private Boolean newDownloadVersion;
private Boolean openParseCache = true;
private Map<String, List<String>> cleanStyleMap = new HashMap<String, List<String>>();
private String transformScriptPath = "E:\\IdeaProject\\jby-project\\base_server\\jby-office\\jby-office-transform";
public String getTransformScriptPath() {
return this.isLocal() ? this.transformScriptPath : "/opt/servers/jby-office-transform";
}
public String getPythonCommand() {
return this.isLocal() ? "python" : "python3";
}
private boolean isLocal() {
String env = SpringContextHolder.getActiveProfile();
return StringUtils.isBlank((CharSequence)env) || env.contains("local");
}
public String getTmpPath() {
return this.tmpPath;
}
public String getTemplatePath() {
return this.templatePath;
}
public Boolean getDeleteTmpFile() {
return this.deleteTmpFile;
}
public String getForeLatexToMathMlApi() {
return this.foreLatexToMathMlApi;
}
public String getLatexToMathMlApi() {
return this.latexToMathMlApi;
}
public String getMathMlToLatexApi() {
return this.mathMlToLatexApi;
}
public Boolean getMathMlToLatexApiSwitch() {
return this.mathMlToLatexApiSwitch;
}
public String getMf2SvgApi() {
return this.mf2SvgApi;
}
public String getDownloadPdfApi() {
return this.downloadPdfApi;
}
public String getErrorBookTemplate() {
return this.errorBookTemplate;
}
public Integer getNodeConnectTimeout() {
return this.nodeConnectTimeout;
}
public Integer getNodeSocketTimeout() {
return this.nodeSocketTimeout;
}
public Long getContentLimit() {
return this.contentLimit;
}
public Double getLimitRatio() {
return this.limitRatio;
}
public Integer getCheckSize() {
return this.checkSize;
}
public Double getImageScalingFactor() {
return this.imageScalingFactor;
}
public String getCopyrightAddresses() {
return this.copyrightAddresses;
}
public Boolean getNewParseVersion() {
return this.newParseVersion;
}
public Boolean getNewDownloadVersion() {
return this.newDownloadVersion;
}
public Boolean getOpenParseCache() {
return this.openParseCache;
}
public Map<String, List<String>> getCleanStyleMap() {
return this.cleanStyleMap;
}
public void setTmpPath(String tmpPath) {
this.tmpPath = tmpPath;
}
public void setTemplatePath(String templatePath) {
this.templatePath = templatePath;
}
public void setDeleteTmpFile(Boolean deleteTmpFile) {
this.deleteTmpFile = deleteTmpFile;
}
public void setForeLatexToMathMlApi(String foreLatexToMathMlApi) {
this.foreLatexToMathMlApi = foreLatexToMathMlApi;
}
public void setLatexToMathMlApi(String latexToMathMlApi) {
this.latexToMathMlApi = latexToMathMlApi;
}
public void setMathMlToLatexApi(String mathMlToLatexApi) {
this.mathMlToLatexApi = mathMlToLatexApi;
}
public void setMathMlToLatexApiSwitch(Boolean mathMlToLatexApiSwitch) {
this.mathMlToLatexApiSwitch = mathMlToLatexApiSwitch;
}
public void setMf2SvgApi(String mf2SvgApi) {
this.mf2SvgApi = mf2SvgApi;
}
public void setDownloadPdfApi(String downloadPdfApi) {
this.downloadPdfApi = downloadPdfApi;
}
public void setErrorBookTemplate(String errorBookTemplate) {
this.errorBookTemplate = errorBookTemplate;
}
public void setNodeConnectTimeout(Integer nodeConnectTimeout) {
this.nodeConnectTimeout = nodeConnectTimeout;
}
public void setNodeSocketTimeout(Integer nodeSocketTimeout) {
this.nodeSocketTimeout = nodeSocketTimeout;
}
public void setContentLimit(Long contentLimit) {
this.contentLimit = contentLimit;
}
public void setLimitRatio(Double limitRatio) {
this.limitRatio = limitRatio;
}
public void setCheckSize(Integer checkSize) {
this.checkSize = checkSize;
}
public void setImageScalingFactor(Double imageScalingFactor) {
this.imageScalingFactor = imageScalingFactor;
}
public void setCopyrightAddresses(String copyrightAddresses) {
this.copyrightAddresses = copyrightAddresses;
}
public void setNewParseVersion(Boolean newParseVersion) {
this.newParseVersion = newParseVersion;
}
public void setNewDownloadVersion(Boolean newDownloadVersion) {
this.newDownloadVersion = newDownloadVersion;
}
public void setOpenParseCache(Boolean openParseCache) {
this.openParseCache = openParseCache;
}
public void setCleanStyleMap(Map<String, List<String>> cleanStyleMap) {
this.cleanStyleMap = cleanStyleMap;
}
public void setTransformScriptPath(String transformScriptPath) {
this.transformScriptPath = transformScriptPath;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof OfficeCoreConfig)) {
return false;
}
OfficeCoreConfig other = (OfficeCoreConfig)o;
if (!other.canEqual(this)) {
return false;
}
String this$tmpPath = this.getTmpPath();
String other$tmpPath = other.getTmpPath();
if (this$tmpPath == null ? other$tmpPath != null : !this$tmpPath.equals(other$tmpPath)) {
return false;
}
String this$templatePath = this.getTemplatePath();
String other$templatePath = other.getTemplatePath();
if (this$templatePath == null ? other$templatePath != null : !this$templatePath.equals(other$templatePath)) {
return false;
}
Boolean this$deleteTmpFile = this.getDeleteTmpFile();
Boolean other$deleteTmpFile = other.getDeleteTmpFile();
if (this$deleteTmpFile == null ? other$deleteTmpFile != null : !((Object)this$deleteTmpFile).equals(other$deleteTmpFile)) {
return false;
}
String this$foreLatexToMathMlApi = this.getForeLatexToMathMlApi();
String other$foreLatexToMathMlApi = other.getForeLatexToMathMlApi();
if (this$foreLatexToMathMlApi == null ? other$foreLatexToMathMlApi != null : !this$foreLatexToMathMlApi.equals(other$foreLatexToMathMlApi)) {
return false;
}
String this$latexToMathMlApi = this.getLatexToMathMlApi();
String other$latexToMathMlApi = other.getLatexToMathMlApi();
if (this$latexToMathMlApi == null ? other$latexToMathMlApi != null : !this$latexToMathMlApi.equals(other$latexToMathMlApi)) {
return false;
}
String this$mathMlToLatexApi = this.getMathMlToLatexApi();
String other$mathMlToLatexApi = other.getMathMlToLatexApi();
if (this$mathMlToLatexApi == null ? other$mathMlToLatexApi != null : !this$mathMlToLatexApi.equals(other$mathMlToLatexApi)) {
return false;
}
Boolean this$mathMlToLatexApiSwitch = this.getMathMlToLatexApiSwitch();
Boolean other$mathMlToLatexApiSwitch = other.getMathMlToLatexApiSwitch();
if (this$mathMlToLatexApiSwitch == null ? other$mathMlToLatexApiSwitch != null : !((Object)this$mathMlToLatexApiSwitch).equals(other$mathMlToLatexApiSwitch)) {
return false;
}
String this$mf2SvgApi = this.getMf2SvgApi();
String other$mf2SvgApi = other.getMf2SvgApi();
if (this$mf2SvgApi == null ? other$mf2SvgApi != null : !this$mf2SvgApi.equals(other$mf2SvgApi)) {
return false;
}
String this$downloadPdfApi = this.getDownloadPdfApi();
String other$downloadPdfApi = other.getDownloadPdfApi();
if (this$downloadPdfApi == null ? other$downloadPdfApi != null : !this$downloadPdfApi.equals(other$downloadPdfApi)) {
return false;
}
String this$errorBookTemplate = this.getErrorBookTemplate();
String other$errorBookTemplate = other.getErrorBookTemplate();
if (this$errorBookTemplate == null ? other$errorBookTemplate != null : !this$errorBookTemplate.equals(other$errorBookTemplate)) {
return false;
}
Integer this$nodeConnectTimeout = this.getNodeConnectTimeout();
Integer other$nodeConnectTimeout = other.getNodeConnectTimeout();
if (this$nodeConnectTimeout == null ? other$nodeConnectTimeout != null : !((Object)this$nodeConnectTimeout).equals(other$nodeConnectTimeout)) {
return false;
}
Integer this$nodeSocketTimeout = this.getNodeSocketTimeout();
Integer other$nodeSocketTimeout = other.getNodeSocketTimeout();
if (this$nodeSocketTimeout == null ? other$nodeSocketTimeout != null : !((Object)this$nodeSocketTimeout).equals(other$nodeSocketTimeout)) {
return false;
}
Long this$contentLimit = this.getContentLimit();
Long other$contentLimit = other.getContentLimit();
if (this$contentLimit == null ? other$contentLimit != null : !((Object)this$contentLimit).equals(other$contentLimit)) {
return false;
}
Double this$limitRatio = this.getLimitRatio();
Double other$limitRatio = other.getLimitRatio();
if (this$limitRatio == null ? other$limitRatio != null : !((Object)this$limitRatio).equals(other$limitRatio)) {
return false;
}
Integer this$checkSize = this.getCheckSize();
Integer other$checkSize = other.getCheckSize();
if (this$checkSize == null ? other$checkSize != null : !((Object)this$checkSize).equals(other$checkSize)) {
return false;
}
Double this$imageScalingFactor = this.getImageScalingFactor();
Double other$imageScalingFactor = other.getImageScalingFactor();
if (this$imageScalingFactor == null ? other$imageScalingFactor != null : !((Object)this$imageScalingFactor).equals(other$imageScalingFactor)) {
return false;
}
String this$copyrightAddresses = this.getCopyrightAddresses();
String other$copyrightAddresses = other.getCopyrightAddresses();
if (this$copyrightAddresses == null ? other$copyrightAddresses != null : !this$copyrightAddresses.equals(other$copyrightAddresses)) {
return false;
}
Boolean this$newParseVersion = this.getNewParseVersion();
Boolean other$newParseVersion = other.getNewParseVersion();
if (this$newParseVersion == null ? other$newParseVersion != null : !((Object)this$newParseVersion).equals(other$newParseVersion)) {
return false;
}
Boolean this$newDownloadVersion = this.getNewDownloadVersion();
Boolean other$newDownloadVersion = other.getNewDownloadVersion();
if (this$newDownloadVersion == null ? other$newDownloadVersion != null : !((Object)this$newDownloadVersion).equals(other$newDownloadVersion)) {
return false;
}
Boolean this$openParseCache = this.getOpenParseCache();
Boolean other$openParseCache = other.getOpenParseCache();
if (this$openParseCache == null ? other$openParseCache != null : !((Object)this$openParseCache).equals(other$openParseCache)) {
return false;
}
Map<String, List<String>> this$cleanStyleMap = this.getCleanStyleMap();
Map<String, List<String>> other$cleanStyleMap = other.getCleanStyleMap();
if (this$cleanStyleMap == null ? other$cleanStyleMap != null : !((Object)this$cleanStyleMap).equals(other$cleanStyleMap)) {
return false;
}
String this$transformScriptPath = this.getTransformScriptPath();
String other$transformScriptPath = other.getTransformScriptPath();
return !(this$transformScriptPath == null ? other$transformScriptPath != null : !this$transformScriptPath.equals(other$transformScriptPath));
}
protected boolean canEqual(Object other) {
return other instanceof OfficeCoreConfig;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
String $tmpPath = this.getTmpPath();
result = result * 59 + ($tmpPath == null ? 43 : $tmpPath.hashCode());
String $templatePath = this.getTemplatePath();
result = result * 59 + ($templatePath == null ? 43 : $templatePath.hashCode());
Boolean $deleteTmpFile = this.getDeleteTmpFile();
result = result * 59 + ($deleteTmpFile == null ? 43 : ((Object)$deleteTmpFile).hashCode());
String $foreLatexToMathMlApi = this.getForeLatexToMathMlApi();
result = result * 59 + ($foreLatexToMathMlApi == null ? 43 : $foreLatexToMathMlApi.hashCode());
String $latexToMathMlApi = this.getLatexToMathMlApi();
result = result * 59 + ($latexToMathMlApi == null ? 43 : $latexToMathMlApi.hashCode());
String $mathMlToLatexApi = this.getMathMlToLatexApi();
result = result * 59 + ($mathMlToLatexApi == null ? 43 : $mathMlToLatexApi.hashCode());
Boolean $mathMlToLatexApiSwitch = this.getMathMlToLatexApiSwitch();
result = result * 59 + ($mathMlToLatexApiSwitch == null ? 43 : ((Object)$mathMlToLatexApiSwitch).hashCode());
String $mf2SvgApi = this.getMf2SvgApi();
result = result * 59 + ($mf2SvgApi == null ? 43 : $mf2SvgApi.hashCode());
String $downloadPdfApi = this.getDownloadPdfApi();
result = result * 59 + ($downloadPdfApi == null ? 43 : $downloadPdfApi.hashCode());
String $errorBookTemplate = this.getErrorBookTemplate();
result = result * 59 + ($errorBookTemplate == null ? 43 : $errorBookTemplate.hashCode());
Integer $nodeConnectTimeout = this.getNodeConnectTimeout();
result = result * 59 + ($nodeConnectTimeout == null ? 43 : ((Object)$nodeConnectTimeout).hashCode());
Integer $nodeSocketTimeout = this.getNodeSocketTimeout();
result = result * 59 + ($nodeSocketTimeout == null ? 43 : ((Object)$nodeSocketTimeout).hashCode());
Long $contentLimit = this.getContentLimit();
result = result * 59 + ($contentLimit == null ? 43 : ((Object)$contentLimit).hashCode());
Double $limitRatio = this.getLimitRatio();
result = result * 59 + ($limitRatio == null ? 43 : ((Object)$limitRatio).hashCode());
Integer $checkSize = this.getCheckSize();
result = result * 59 + ($checkSize == null ? 43 : ((Object)$checkSize).hashCode());
Double $imageScalingFactor = this.getImageScalingFactor();
result = result * 59 + ($imageScalingFactor == null ? 43 : ((Object)$imageScalingFactor).hashCode());
String $copyrightAddresses = this.getCopyrightAddresses();
result = result * 59 + ($copyrightAddresses == null ? 43 : $copyrightAddresses.hashCode());
Boolean $newParseVersion = this.getNewParseVersion();
result = result * 59 + ($newParseVersion == null ? 43 : ((Object)$newParseVersion).hashCode());
Boolean $newDownloadVersion = this.getNewDownloadVersion();
result = result * 59 + ($newDownloadVersion == null ? 43 : ((Object)$newDownloadVersion).hashCode());
Boolean $openParseCache = this.getOpenParseCache();
result = result * 59 + ($openParseCache == null ? 43 : ((Object)$openParseCache).hashCode());
Map<String, List<String>> $cleanStyleMap = this.getCleanStyleMap();
result = result * 59 + ($cleanStyleMap == null ? 43 : ((Object)$cleanStyleMap).hashCode());
String $transformScriptPath = this.getTransformScriptPath();
result = result * 59 + ($transformScriptPath == null ? 43 : $transformScriptPath.hashCode());
return result;
}
public String toString() {
return "OfficeCoreConfig(tmpPath=" + this.getTmpPath() + ", templatePath=" + this.getTemplatePath() + ", deleteTmpFile=" + this.getDeleteTmpFile() + ", foreLatexToMathMlApi=" + this.getForeLatexToMathMlApi() + ", latexToMathMlApi=" + this.getLatexToMathMlApi() + ", mathMlToLatexApi=" + this.getMathMlToLatexApi() + ", mathMlToLatexApiSwitch=" + this.getMathMlToLatexApiSwitch() + ", mf2SvgApi=" + this.getMf2SvgApi() + ", downloadPdfApi=" + this.getDownloadPdfApi() + ", errorBookTemplate=" + this.getErrorBookTemplate() + ", nodeConnectTimeout=" + this.getNodeConnectTimeout() + ", nodeSocketTimeout=" + this.getNodeSocketTimeout() + ", contentLimit=" + this.getContentLimit() + ", limitRatio=" + this.getLimitRatio() + ", checkSize=" + this.getCheckSize() + ", imageScalingFactor=" + this.getImageScalingFactor() + ", copyrightAddresses=" + this.getCopyrightAddresses() + ", newParseVersion=" + this.getNewParseVersion() + ", newDownloadVersion=" + this.getNewDownloadVersion() + ", openParseCache=" + this.getOpenParseCache() + ", cleanStyleMap=" + this.getCleanStyleMap() + ", transformScriptPath=" + this.getTransformScriptPath() + ")";
}
}

View File

@@ -0,0 +1,152 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.alibaba.fastjson.JSON
* com.jby.common.advisor.annotation.ParamBarrier
* com.jby.common.result.Result
* com.jby.office.api.FileServiceApi
* com.jby.office.domain.param.DownloadFileParam
* com.jby.office.domain.param.DownloadParam
* com.jby.office.domain.param.FileParam
* com.jby.office.domain.param.GenerateFileParam
* com.jby.office.domain.param.OfficeFileParseParam
* com.jby.office.domain.param.OfficeFileParseRecordParam
* com.jby.office.domain.vo.OfficeFileDownloadScheduleVO
* com.jby.office.domain.vo.OfficeFileInfoVO
* com.jby.office.domain.vo.OfficeFileParseRecordVO
* com.jby.office.domain.vo.OfficeFileParseVO
* com.jby.officecore.annotation.CostTime
* com.jby.officecore.domain.dto.CreateWordDTO
* com.jby.officecore.utils.WordExportUtil
* com.jby.system.domain.param.NodeParam
* javax.annotation.Resource
* org.map.utils.BeanMapping
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.web.bind.annotation.GetMapping
* org.springframework.web.bind.annotation.PathVariable
* org.springframework.web.bind.annotation.PostMapping
* org.springframework.web.bind.annotation.RequestBody
* org.springframework.web.bind.annotation.RequestMapping
* org.springframework.web.bind.annotation.RestController
*/
package com.jby.officefile.controller;
import com.alibaba.fastjson.JSON;
import com.jby.common.advisor.annotation.ParamBarrier;
import com.jby.common.result.Result;
import com.jby.office.api.FileServiceApi;
import com.jby.office.domain.param.DownloadFileParam;
import com.jby.office.domain.param.DownloadParam;
import com.jby.office.domain.param.FileParam;
import com.jby.office.domain.param.GenerateFileParam;
import com.jby.office.domain.param.OfficeFileParseParam;
import com.jby.office.domain.param.OfficeFileParseRecordParam;
import com.jby.office.domain.vo.OfficeFileDownloadScheduleVO;
import com.jby.office.domain.vo.OfficeFileInfoVO;
import com.jby.office.domain.vo.OfficeFileParseRecordVO;
import com.jby.office.domain.vo.OfficeFileParseVO;
import com.jby.officecore.annotation.CostTime;
import com.jby.officecore.domain.dto.CreateWordDTO;
import com.jby.officecore.utils.WordExportUtil;
import com.jby.officefile.service.FileService;
import com.jby.system.domain.param.NodeParam;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import org.map.utils.BeanMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value={"/file"})
public class FileController
implements FileServiceApi {
private static final Logger log = LoggerFactory.getLogger(FileController.class);
@Resource
private FileService fileService;
@CostTime
@PostMapping(value={"/generate/by/url"})
public Result<OfficeFileInfoVO> generateFileByUrl(@RequestBody GenerateFileParam param) {
log.info("\u901a\u8fc7word\u8d44\u6e90\u5730\u5740\u751f\u6210\u5728\u7ebf\u7f16\u8f91\u6587\u4ef6(\u5b8c\u6574\u6587\u6863), param={}", (Object)JSON.toJSONString((Object)param));
OfficeFileInfoVO result = this.fileService.generateFileByUrl(param);
return Result.success((Object)result);
}
@CostTime
@PostMapping(value={"/generate/by/file"}, consumes={"multipart/form-data"})
public Result<OfficeFileInfoVO> generateFileByFile(FileParam param) {
log.info("\u901a\u8fc7word\u8d44\u6e90\u6587\u4ef6\u751f\u6210\u5728\u7ebf\u7f16\u8f91\u6587\u4ef6(\u5b8c\u6574\u6587\u6863), param={}", (Object)JSON.toJSONString((Object)param));
OfficeFileInfoVO result = this.fileService.generateFileByFile(param);
return Result.success((Object)result);
}
@CostTime
@PostMapping(value={"/parse"}, consumes={"multipart/form-data"})
public Result<OfficeFileParseVO> parseOfficeFile(OfficeFileParseParam param) {
OfficeFileParseVO parseVO = this.fileService.parseOfficeFile(param);
return Result.success((Object)parseVO);
}
@CostTime
@PostMapping(value={"/download"}, consumes={"multipart/form-data"})
public Result<String> downloadOfficeFile(DownloadFileParam param) {
log.info("\u4e0b\u8f7d\u5728\u7ebf\u7f16\u8f91\u6587\u4ef6, file={}, param={}", (Object)Objects.nonNull(param.getPdfFile()), (Object)JSON.toJSONString((Object)param));
String fileUrl = this.fileService.downloadOfficeFile(param);
return Result.success((Object)fileUrl);
}
@CostTime
@PostMapping(value={"/v2/download"})
public Result<String> downloadFile(@RequestBody DownloadParam param) {
log.info("\u4e0b\u8f7d\u5728\u7ebf\u7f16\u8f91\u6587\u4ef6V2, param={}", (Object)JSON.toJSONString((Object)param));
DownloadFileParam fileParam = (DownloadFileParam)BeanMapping.toBean((Object)param, DownloadFileParam.class);
String fileUrl = this.fileService.downloadOfficeFile(fileParam);
return Result.success((Object)fileUrl);
}
@Deprecated
@CostTime
@PostMapping(value={"/batch/download"})
public Result<OfficeFileDownloadScheduleVO> batchDownloadOfficeFile(@RequestBody NodeParam rootNode) {
log.info("\u6279\u91cf\u4e0b\u8f7d\u5728\u7ebf\u6587\u4ef6, \u8282\u70b9\u53c2\u6570rootNode={}", (Object)JSON.toJSONString((Object)rootNode));
OfficeFileDownloadScheduleVO result = this.fileService.batchDownloadOfficeFile(rootNode);
return Result.success((Object)result);
}
@CostTime
@PostMapping(value={"/download/word"})
public Result<String> downloadWord(@RequestBody CreateWordDTO param) {
log.info("\u4e0b\u8f7dword\u6587\u4ef6, param={}", (Object)JSON.toJSONString((Object)param));
String result = WordExportUtil.createWord((CreateWordDTO)param);
return Result.success((Object)result);
}
@GetMapping(value={"/parse/record/{md5}"})
public Result<OfficeFileParseRecordVO> getOfficeFileParseRecordByMd5(@PathVariable String md5) {
OfficeFileParseRecordVO result = this.fileService.getOfficeFileParseRecordByMd5(md5);
return Result.success((Object)result);
}
@PostMapping(value={"/parse/record"})
public Result<?> saveOfficeFileParseRecord(@RequestBody OfficeFileParseRecordParam param) {
this.fileService.saveOfficeFileParseRecord(param);
return Result.success();
}
@PostMapping(value={"/parse/record/query"})
@ParamBarrier(value={"fileIds"})
public Result<List<OfficeFileParseRecordVO>> queryFileUrlByFileIds(@RequestBody OfficeFileParseRecordParam param) {
List<OfficeFileParseRecordVO> result = this.fileService.queryFileUrlByFileIds(param);
return Result.success(result);
}
}

View File

@@ -0,0 +1,123 @@
/*
* Decompiled with CFR 0.152.
*/
package com.jby.officecore.domain.bo;
import java.io.InputStream;
import java.io.Serializable;
public class ImageBO
implements Serializable {
private static final long serialVersionUID = 6640950035295880234L;
private InputStream is;
private Double width;
private Double height;
private Integer pictureType;
private String pictureUrl;
public InputStream getIs() {
return this.is;
}
public Double getWidth() {
return this.width;
}
public Double getHeight() {
return this.height;
}
public Integer getPictureType() {
return this.pictureType;
}
public String getPictureUrl() {
return this.pictureUrl;
}
public ImageBO setIs(InputStream is) {
this.is = is;
return this;
}
public ImageBO setWidth(Double width) {
this.width = width;
return this;
}
public ImageBO setHeight(Double height) {
this.height = height;
return this;
}
public ImageBO setPictureType(Integer pictureType) {
this.pictureType = pictureType;
return this;
}
public ImageBO setPictureUrl(String pictureUrl) {
this.pictureUrl = pictureUrl;
return this;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof ImageBO)) {
return false;
}
ImageBO other = (ImageBO)o;
if (!other.canEqual(this)) {
return false;
}
InputStream this$is = this.getIs();
InputStream other$is = other.getIs();
if (this$is == null ? other$is != null : !this$is.equals(other$is)) {
return false;
}
Double this$width = this.getWidth();
Double other$width = other.getWidth();
if (this$width == null ? other$width != null : !((Object)this$width).equals(other$width)) {
return false;
}
Double this$height = this.getHeight();
Double other$height = other.getHeight();
if (this$height == null ? other$height != null : !((Object)this$height).equals(other$height)) {
return false;
}
Integer this$pictureType = this.getPictureType();
Integer other$pictureType = other.getPictureType();
if (this$pictureType == null ? other$pictureType != null : !((Object)this$pictureType).equals(other$pictureType)) {
return false;
}
String this$pictureUrl = this.getPictureUrl();
String other$pictureUrl = other.getPictureUrl();
return !(this$pictureUrl == null ? other$pictureUrl != null : !this$pictureUrl.equals(other$pictureUrl));
}
protected boolean canEqual(Object other) {
return other instanceof ImageBO;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
InputStream $is = this.getIs();
result = result * 59 + ($is == null ? 43 : $is.hashCode());
Double $width = this.getWidth();
result = result * 59 + ($width == null ? 43 : ((Object)$width).hashCode());
Double $height = this.getHeight();
result = result * 59 + ($height == null ? 43 : ((Object)$height).hashCode());
Integer $pictureType = this.getPictureType();
result = result * 59 + ($pictureType == null ? 43 : ((Object)$pictureType).hashCode());
String $pictureUrl = this.getPictureUrl();
result = result * 59 + ($pictureUrl == null ? 43 : $pictureUrl.hashCode());
return result;
}
public String toString() {
return "ImageBO(is=" + this.getIs() + ", width=" + this.getWidth() + ", height=" + this.getHeight() + ", pictureType=" + this.getPictureType() + ", pictureUrl=" + this.getPictureUrl() + ")";
}
}

View File

@@ -0,0 +1,455 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.alibaba.fastjson.JSONObject
* org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart
*/
package com.jby.officecore.domain.bo;
import com.alibaba.fastjson.JSONObject;
import com.jby.officecore.domain.bo.ImageBO;
import com.jby.officecore.utils.NumPr;
import java.io.Serializable;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.transform.Transformer;
import org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart;
public class ParseBO
implements Serializable {
private static final long serialVersionUID = -1386361606482288851L;
public static final String IMAGES = "images";
public static final String PARSE_ = "parse-";
public static final String OUTPUT_HTML = "output.html";
private static final String JBY_OPEN_OFFICE_XML_ = "JBY_OPEN_OFFICE_XML_";
private static final String JBY_IMAGE_DATA_ = "JBY_IMAGE_DATA_";
private static final String PLACEHOLDER_SUFFIX = "_END";
private static final String IMAGE_ = "image_";
private static final String JBY_EQ_LATEX_ = "JBY_EQ_LATEX_";
public static final String JBY_TEXTBOX = "JBY_TEXTBOX_JBY";
private static final String JBY_MATHTYPE_DATA_ = "JBY_MATHTYPE_DATA_";
private Path tempDir;
private String sourceFilePath;
private String sourceFileUrl;
private String sourceFileMd5;
private String sourceFileBakPath;
private String htmlPath;
private String imagesDir;
private String ossFolder;
private Transformer transformer;
private List<JSONObject> latexReplaceList;
private Map<String, String> imgMap = new HashMap<String, String>();
private Map<String, String> shapeImgMap;
private Map<String, String> openOfficeXmlMap = new HashMap<String, String>();
private Map<String, String> mathTypeMap = new HashMap<String, String>();
private Map<String, String> eqLatexMap = new HashMap<String, String>();
private StyleDefinitionsPart styleDefinitionsPart;
private Map<String, NumPr> numberingDefinitionsMap = new HashMap<String, NumPr>();
private Map<String, ImageBO> imageMap;
private Boolean newParseVersion;
private Integer count = 0;
private Long fileId;
public ParseBO() {
this.shapeImgMap = new HashMap<String, String>();
this.imageMap = new HashMap<String, ImageBO>();
}
private Integer incrCount() {
this.count = this.count + 1;
return this.count;
}
public String getOpenOfficeXmlPlaceholder() {
return JBY_OPEN_OFFICE_XML_ + this.incrCount() + PLACEHOLDER_SUFFIX;
}
public String getMathTypePlaceholder() {
return JBY_IMAGE_DATA_ + this.incrCount() + PLACEHOLDER_SUFFIX;
}
public String getMathTypePlaceholder(String ctOleObjectRid) {
return JBY_MATHTYPE_DATA_ + ctOleObjectRid + PLACEHOLDER_SUFFIX;
}
public String getImgName() {
return IMAGE_ + this.incrCount();
}
public String getEqLatexPlaceholder() {
return JBY_EQ_LATEX_ + this.incrCount() + PLACEHOLDER_SUFFIX;
}
public String getShapeImgPlaceholder() {
return JBY_IMAGE_DATA_ + this.incrCount() + PLACEHOLDER_SUFFIX;
}
public String getImagePlaceholder(String rid) {
return JBY_IMAGE_DATA_ + this.incrCount() + PLACEHOLDER_SUFFIX;
}
public Path getTempDir() {
return this.tempDir;
}
public String getSourceFilePath() {
return this.sourceFilePath;
}
public String getSourceFileUrl() {
return this.sourceFileUrl;
}
public String getSourceFileMd5() {
return this.sourceFileMd5;
}
public String getSourceFileBakPath() {
return this.sourceFileBakPath;
}
public String getHtmlPath() {
return this.htmlPath;
}
public String getImagesDir() {
return this.imagesDir;
}
public String getOssFolder() {
return this.ossFolder;
}
public Transformer getTransformer() {
return this.transformer;
}
public List<JSONObject> getLatexReplaceList() {
return this.latexReplaceList;
}
public Map<String, String> getImgMap() {
return this.imgMap;
}
public Map<String, String> getShapeImgMap() {
return this.shapeImgMap;
}
public Map<String, String> getOpenOfficeXmlMap() {
return this.openOfficeXmlMap;
}
public Map<String, String> getMathTypeMap() {
return this.mathTypeMap;
}
public Map<String, String> getEqLatexMap() {
return this.eqLatexMap;
}
public StyleDefinitionsPart getStyleDefinitionsPart() {
return this.styleDefinitionsPart;
}
public Map<String, NumPr> getNumberingDefinitionsMap() {
return this.numberingDefinitionsMap;
}
public Map<String, ImageBO> getImageMap() {
return this.imageMap;
}
public Boolean getNewParseVersion() {
return this.newParseVersion;
}
public Integer getCount() {
return this.count;
}
public Long getFileId() {
return this.fileId;
}
public ParseBO setTempDir(Path tempDir) {
this.tempDir = tempDir;
return this;
}
public ParseBO setSourceFilePath(String sourceFilePath) {
this.sourceFilePath = sourceFilePath;
return this;
}
public ParseBO setSourceFileUrl(String sourceFileUrl) {
this.sourceFileUrl = sourceFileUrl;
return this;
}
public ParseBO setSourceFileMd5(String sourceFileMd5) {
this.sourceFileMd5 = sourceFileMd5;
return this;
}
public ParseBO setSourceFileBakPath(String sourceFileBakPath) {
this.sourceFileBakPath = sourceFileBakPath;
return this;
}
public ParseBO setHtmlPath(String htmlPath) {
this.htmlPath = htmlPath;
return this;
}
public ParseBO setImagesDir(String imagesDir) {
this.imagesDir = imagesDir;
return this;
}
public ParseBO setOssFolder(String ossFolder) {
this.ossFolder = ossFolder;
return this;
}
public ParseBO setTransformer(Transformer transformer) {
this.transformer = transformer;
return this;
}
public ParseBO setLatexReplaceList(List<JSONObject> latexReplaceList) {
this.latexReplaceList = latexReplaceList;
return this;
}
public ParseBO setImgMap(Map<String, String> imgMap) {
this.imgMap = imgMap;
return this;
}
public ParseBO setShapeImgMap(Map<String, String> shapeImgMap) {
this.shapeImgMap = shapeImgMap;
return this;
}
public ParseBO setOpenOfficeXmlMap(Map<String, String> openOfficeXmlMap) {
this.openOfficeXmlMap = openOfficeXmlMap;
return this;
}
public ParseBO setMathTypeMap(Map<String, String> mathTypeMap) {
this.mathTypeMap = mathTypeMap;
return this;
}
public ParseBO setEqLatexMap(Map<String, String> eqLatexMap) {
this.eqLatexMap = eqLatexMap;
return this;
}
public ParseBO setStyleDefinitionsPart(StyleDefinitionsPart styleDefinitionsPart) {
this.styleDefinitionsPart = styleDefinitionsPart;
return this;
}
public ParseBO setNumberingDefinitionsMap(Map<String, NumPr> numberingDefinitionsMap) {
this.numberingDefinitionsMap = numberingDefinitionsMap;
return this;
}
public ParseBO setImageMap(Map<String, ImageBO> imageMap) {
this.imageMap = imageMap;
return this;
}
public ParseBO setNewParseVersion(Boolean newParseVersion) {
this.newParseVersion = newParseVersion;
return this;
}
public ParseBO setCount(Integer count) {
this.count = count;
return this;
}
public ParseBO setFileId(Long fileId) {
this.fileId = fileId;
return this;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof ParseBO)) {
return false;
}
ParseBO other = (ParseBO)o;
if (!other.canEqual(this)) {
return false;
}
Path this$tempDir = this.getTempDir();
Path other$tempDir = other.getTempDir();
if (this$tempDir == null ? other$tempDir != null : !((Object)this$tempDir).equals(other$tempDir)) {
return false;
}
String this$sourceFilePath = this.getSourceFilePath();
String other$sourceFilePath = other.getSourceFilePath();
if (this$sourceFilePath == null ? other$sourceFilePath != null : !this$sourceFilePath.equals(other$sourceFilePath)) {
return false;
}
String this$sourceFileUrl = this.getSourceFileUrl();
String other$sourceFileUrl = other.getSourceFileUrl();
if (this$sourceFileUrl == null ? other$sourceFileUrl != null : !this$sourceFileUrl.equals(other$sourceFileUrl)) {
return false;
}
String this$sourceFileMd5 = this.getSourceFileMd5();
String other$sourceFileMd5 = other.getSourceFileMd5();
if (this$sourceFileMd5 == null ? other$sourceFileMd5 != null : !this$sourceFileMd5.equals(other$sourceFileMd5)) {
return false;
}
String this$sourceFileBakPath = this.getSourceFileBakPath();
String other$sourceFileBakPath = other.getSourceFileBakPath();
if (this$sourceFileBakPath == null ? other$sourceFileBakPath != null : !this$sourceFileBakPath.equals(other$sourceFileBakPath)) {
return false;
}
String this$htmlPath = this.getHtmlPath();
String other$htmlPath = other.getHtmlPath();
if (this$htmlPath == null ? other$htmlPath != null : !this$htmlPath.equals(other$htmlPath)) {
return false;
}
String this$imagesDir = this.getImagesDir();
String other$imagesDir = other.getImagesDir();
if (this$imagesDir == null ? other$imagesDir != null : !this$imagesDir.equals(other$imagesDir)) {
return false;
}
String this$ossFolder = this.getOssFolder();
String other$ossFolder = other.getOssFolder();
if (this$ossFolder == null ? other$ossFolder != null : !this$ossFolder.equals(other$ossFolder)) {
return false;
}
Transformer this$transformer = this.getTransformer();
Transformer other$transformer = other.getTransformer();
if (this$transformer == null ? other$transformer != null : !this$transformer.equals(other$transformer)) {
return false;
}
List<JSONObject> this$latexReplaceList = this.getLatexReplaceList();
List<JSONObject> other$latexReplaceList = other.getLatexReplaceList();
if (this$latexReplaceList == null ? other$latexReplaceList != null : !((Object)this$latexReplaceList).equals(other$latexReplaceList)) {
return false;
}
Map<String, String> this$imgMap = this.getImgMap();
Map<String, String> other$imgMap = other.getImgMap();
if (this$imgMap == null ? other$imgMap != null : !((Object)this$imgMap).equals(other$imgMap)) {
return false;
}
Map<String, String> this$shapeImgMap = this.getShapeImgMap();
Map<String, String> other$shapeImgMap = other.getShapeImgMap();
if (this$shapeImgMap == null ? other$shapeImgMap != null : !((Object)this$shapeImgMap).equals(other$shapeImgMap)) {
return false;
}
Map<String, String> this$openOfficeXmlMap = this.getOpenOfficeXmlMap();
Map<String, String> other$openOfficeXmlMap = other.getOpenOfficeXmlMap();
if (this$openOfficeXmlMap == null ? other$openOfficeXmlMap != null : !((Object)this$openOfficeXmlMap).equals(other$openOfficeXmlMap)) {
return false;
}
Map<String, String> this$mathTypeMap = this.getMathTypeMap();
Map<String, String> other$mathTypeMap = other.getMathTypeMap();
if (this$mathTypeMap == null ? other$mathTypeMap != null : !((Object)this$mathTypeMap).equals(other$mathTypeMap)) {
return false;
}
Map<String, String> this$eqLatexMap = this.getEqLatexMap();
Map<String, String> other$eqLatexMap = other.getEqLatexMap();
if (this$eqLatexMap == null ? other$eqLatexMap != null : !((Object)this$eqLatexMap).equals(other$eqLatexMap)) {
return false;
}
StyleDefinitionsPart this$styleDefinitionsPart = this.getStyleDefinitionsPart();
StyleDefinitionsPart other$styleDefinitionsPart = other.getStyleDefinitionsPart();
if (this$styleDefinitionsPart == null ? other$styleDefinitionsPart != null : !this$styleDefinitionsPart.equals(other$styleDefinitionsPart)) {
return false;
}
Map<String, NumPr> this$numberingDefinitionsMap = this.getNumberingDefinitionsMap();
Map<String, NumPr> other$numberingDefinitionsMap = other.getNumberingDefinitionsMap();
if (this$numberingDefinitionsMap == null ? other$numberingDefinitionsMap != null : !((Object)this$numberingDefinitionsMap).equals(other$numberingDefinitionsMap)) {
return false;
}
Map<String, ImageBO> this$imageMap = this.getImageMap();
Map<String, ImageBO> other$imageMap = other.getImageMap();
if (this$imageMap == null ? other$imageMap != null : !((Object)this$imageMap).equals(other$imageMap)) {
return false;
}
Boolean this$newParseVersion = this.getNewParseVersion();
Boolean other$newParseVersion = other.getNewParseVersion();
if (this$newParseVersion == null ? other$newParseVersion != null : !((Object)this$newParseVersion).equals(other$newParseVersion)) {
return false;
}
Integer this$count = this.getCount();
Integer other$count = other.getCount();
if (this$count == null ? other$count != null : !((Object)this$count).equals(other$count)) {
return false;
}
Long this$fileId = this.getFileId();
Long other$fileId = other.getFileId();
return !(this$fileId == null ? other$fileId != null : !((Object)this$fileId).equals(other$fileId));
}
protected boolean canEqual(Object other) {
return other instanceof ParseBO;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
Path $tempDir = this.getTempDir();
result = result * 59 + ($tempDir == null ? 43 : ((Object)$tempDir).hashCode());
String $sourceFilePath = this.getSourceFilePath();
result = result * 59 + ($sourceFilePath == null ? 43 : $sourceFilePath.hashCode());
String $sourceFileUrl = this.getSourceFileUrl();
result = result * 59 + ($sourceFileUrl == null ? 43 : $sourceFileUrl.hashCode());
String $sourceFileMd5 = this.getSourceFileMd5();
result = result * 59 + ($sourceFileMd5 == null ? 43 : $sourceFileMd5.hashCode());
String $sourceFileBakPath = this.getSourceFileBakPath();
result = result * 59 + ($sourceFileBakPath == null ? 43 : $sourceFileBakPath.hashCode());
String $htmlPath = this.getHtmlPath();
result = result * 59 + ($htmlPath == null ? 43 : $htmlPath.hashCode());
String $imagesDir = this.getImagesDir();
result = result * 59 + ($imagesDir == null ? 43 : $imagesDir.hashCode());
String $ossFolder = this.getOssFolder();
result = result * 59 + ($ossFolder == null ? 43 : $ossFolder.hashCode());
Transformer $transformer = this.getTransformer();
result = result * 59 + ($transformer == null ? 43 : $transformer.hashCode());
List<JSONObject> $latexReplaceList = this.getLatexReplaceList();
result = result * 59 + ($latexReplaceList == null ? 43 : ((Object)$latexReplaceList).hashCode());
Map<String, String> $imgMap = this.getImgMap();
result = result * 59 + ($imgMap == null ? 43 : ((Object)$imgMap).hashCode());
Map<String, String> $shapeImgMap = this.getShapeImgMap();
result = result * 59 + ($shapeImgMap == null ? 43 : ((Object)$shapeImgMap).hashCode());
Map<String, String> $openOfficeXmlMap = this.getOpenOfficeXmlMap();
result = result * 59 + ($openOfficeXmlMap == null ? 43 : ((Object)$openOfficeXmlMap).hashCode());
Map<String, String> $mathTypeMap = this.getMathTypeMap();
result = result * 59 + ($mathTypeMap == null ? 43 : ((Object)$mathTypeMap).hashCode());
Map<String, String> $eqLatexMap = this.getEqLatexMap();
result = result * 59 + ($eqLatexMap == null ? 43 : ((Object)$eqLatexMap).hashCode());
StyleDefinitionsPart $styleDefinitionsPart = this.getStyleDefinitionsPart();
result = result * 59 + ($styleDefinitionsPart == null ? 43 : $styleDefinitionsPart.hashCode());
Map<String, NumPr> $numberingDefinitionsMap = this.getNumberingDefinitionsMap();
result = result * 59 + ($numberingDefinitionsMap == null ? 43 : ((Object)$numberingDefinitionsMap).hashCode());
Map<String, ImageBO> $imageMap = this.getImageMap();
result = result * 59 + ($imageMap == null ? 43 : ((Object)$imageMap).hashCode());
Boolean $newParseVersion = this.getNewParseVersion();
result = result * 59 + ($newParseVersion == null ? 43 : ((Object)$newParseVersion).hashCode());
Integer $count = this.getCount();
result = result * 59 + ($count == null ? 43 : ((Object)$count).hashCode());
Long $fileId = this.getFileId();
result = result * 59 + ($fileId == null ? 43 : ((Object)$fileId).hashCode());
return result;
}
public String toString() {
return "ParseBO(tempDir=" + this.getTempDir() + ", sourceFilePath=" + this.getSourceFilePath() + ", sourceFileUrl=" + this.getSourceFileUrl() + ", sourceFileMd5=" + this.getSourceFileMd5() + ", sourceFileBakPath=" + this.getSourceFileBakPath() + ", htmlPath=" + this.getHtmlPath() + ", imagesDir=" + this.getImagesDir() + ", ossFolder=" + this.getOssFolder() + ", transformer=" + this.getTransformer() + ", latexReplaceList=" + this.getLatexReplaceList() + ", imgMap=" + this.getImgMap() + ", shapeImgMap=" + this.getShapeImgMap() + ", openOfficeXmlMap=" + this.getOpenOfficeXmlMap() + ", mathTypeMap=" + this.getMathTypeMap() + ", eqLatexMap=" + this.getEqLatexMap() + ", styleDefinitionsPart=" + this.getStyleDefinitionsPart() + ", numberingDefinitionsMap=" + this.getNumberingDefinitionsMap() + ", imageMap=" + this.getImageMap() + ", newParseVersion=" + this.getNewParseVersion() + ", count=" + this.getCount() + ", fileId=" + this.getFileId() + ")";
}
}

View File

@@ -0,0 +1,42 @@
/*
* Decompiled with CFR 0.152.
*/
package com.jby.officecore.domain.bo;
import java.io.Serializable;
public class TagStyleBO
implements Serializable {
private static final long serialVersionUID = -5541312317983576319L;
private String tagName;
private String attr;
private String value;
public String getTagName() {
return this.tagName;
}
public String getAttr() {
return this.attr;
}
public String getValue() {
return this.value;
}
public TagStyleBO setTagName(String tagName) {
this.tagName = tagName;
return this;
}
public TagStyleBO setAttr(String attr) {
this.attr = attr;
return this;
}
public TagStyleBO setValue(String value) {
this.value = value;
return this;
}
}

View File

@@ -0,0 +1,132 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.alibaba.fastjson.JSONObject
* com.alibaba.fastjson.annotation.JSONField
* org.springframework.web.multipart.MultipartFile
*/
package com.jby.officecore.domain.param;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import java.io.Serializable;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
public class ParseParam
implements Serializable {
private static final long serialVersionUID = 4113866861283462539L;
private String sourceUrl;
@JSONField(serialize=false)
private MultipartFile sourceFile;
private List<JSONObject> latexReplaceList;
private Boolean newParseVersion;
private Long fileId;
public String getSourceUrl() {
return this.sourceUrl;
}
public MultipartFile getSourceFile() {
return this.sourceFile;
}
public List<JSONObject> getLatexReplaceList() {
return this.latexReplaceList;
}
public Boolean getNewParseVersion() {
return this.newParseVersion;
}
public Long getFileId() {
return this.fileId;
}
public ParseParam setSourceUrl(String sourceUrl) {
this.sourceUrl = sourceUrl;
return this;
}
public ParseParam setSourceFile(MultipartFile sourceFile) {
this.sourceFile = sourceFile;
return this;
}
public ParseParam setLatexReplaceList(List<JSONObject> latexReplaceList) {
this.latexReplaceList = latexReplaceList;
return this;
}
public ParseParam setNewParseVersion(Boolean newParseVersion) {
this.newParseVersion = newParseVersion;
return this;
}
public ParseParam setFileId(Long fileId) {
this.fileId = fileId;
return this;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof ParseParam)) {
return false;
}
ParseParam other = (ParseParam)o;
if (!other.canEqual(this)) {
return false;
}
String this$sourceUrl = this.getSourceUrl();
String other$sourceUrl = other.getSourceUrl();
if (this$sourceUrl == null ? other$sourceUrl != null : !this$sourceUrl.equals(other$sourceUrl)) {
return false;
}
MultipartFile this$sourceFile = this.getSourceFile();
MultipartFile other$sourceFile = other.getSourceFile();
if (this$sourceFile == null ? other$sourceFile != null : !this$sourceFile.equals(other$sourceFile)) {
return false;
}
List<JSONObject> this$latexReplaceList = this.getLatexReplaceList();
List<JSONObject> other$latexReplaceList = other.getLatexReplaceList();
if (this$latexReplaceList == null ? other$latexReplaceList != null : !((Object)this$latexReplaceList).equals(other$latexReplaceList)) {
return false;
}
Boolean this$newParseVersion = this.getNewParseVersion();
Boolean other$newParseVersion = other.getNewParseVersion();
if (this$newParseVersion == null ? other$newParseVersion != null : !((Object)this$newParseVersion).equals(other$newParseVersion)) {
return false;
}
Long this$fileId = this.getFileId();
Long other$fileId = other.getFileId();
return !(this$fileId == null ? other$fileId != null : !((Object)this$fileId).equals(other$fileId));
}
protected boolean canEqual(Object other) {
return other instanceof ParseParam;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
String $sourceUrl = this.getSourceUrl();
result = result * 59 + ($sourceUrl == null ? 43 : $sourceUrl.hashCode());
MultipartFile $sourceFile = this.getSourceFile();
result = result * 59 + ($sourceFile == null ? 43 : $sourceFile.hashCode());
List<JSONObject> $latexReplaceList = this.getLatexReplaceList();
result = result * 59 + ($latexReplaceList == null ? 43 : ((Object)$latexReplaceList).hashCode());
Boolean $newParseVersion = this.getNewParseVersion();
result = result * 59 + ($newParseVersion == null ? 43 : ((Object)$newParseVersion).hashCode());
Long $fileId = this.getFileId();
result = result * 59 + ($fileId == null ? 43 : ((Object)$fileId).hashCode());
return result;
}
public String toString() {
return "ParseParam(sourceUrl=" + this.getSourceUrl() + ", sourceFile=" + this.getSourceFile() + ", latexReplaceList=" + this.getLatexReplaceList() + ", newParseVersion=" + this.getNewParseVersion() + ", fileId=" + this.getFileId() + ")";
}
}

View File

@@ -0,0 +1,79 @@
/*
* Decompiled with CFR 0.152.
*/
package com.jby.officecore.enums;
public enum AttrEnum {
STYLE("style"),
COLOR("color"),
BACKGROUND_COLOR("background-color"),
BACKGROUND("background"),
FONT_WEIGHT("font-weight"),
FONT_SIZE("font-size"),
MIN_HEIGHT("min-height"),
LINE_HEIGHT("line-height"),
TEXT_ALIGN("text-align"),
PADDING("padding"),
PADDING_TOP("padding-top"),
PADDING_RIGHT("padding-right"),
PADDING_BOTTOM("padding-bottom"),
PADDING_LEFT("padding-left"),
TEXT_INDENT("text-indent"),
MARGIN("margin"),
MARGIN_TOP("margin-top"),
MARGIN_RIGHT("margin-right"),
MARGIN_BOTTOM("margin-bottom"),
MARGIN_LEFT("margin-left"),
VERTICAL_ALIGN("vertical-align"),
FONT_FAMILY("font-family"),
FONT_STYLE("font-style"),
FACE("face"),
SIZE("size"),
HREF("href"),
SRC("src"),
WIDTH("width"),
HEIGHT("height"),
CLASS("class"),
BORDER_STYLE("border-style"),
COLSPAN("colspan"),
ROWSPAN("rowspan"),
TEXT_DECORATION("text-decoration"),
BACKGROUND_IMAGE("background-image"),
TINYMCE_HORIZONTAL_LINE("tinymce-horizontal-line"),
TINYMCE_LINE_NUMBER("tinymce-line-number"),
TEXT_EMPHASIS_POSITION("text-emphasis-position"),
DATA_TYPE("data-type"),
SEGMENT("segment"),
BUSINESS("business"),
LIST_STYLE_TYPE("list-style-type"),
ALT("alt"),
NAME("name"),
DATA_HREF("data-href"),
DATA_File_SUFFIX("data-file-suffix"),
TINYMCE_LINK("tinymce-link"),
DATA_RESOURCE_URL("data-resource-url"),
DATA_COURSE_NETWORK_LESSON_RESOURCE_NAME("data-course-network-lesson-resource-name"),
TINYMCE_HOLLOWOUT("tinymce-hollowOut"),
TINYMCE_HIDDENONLY("tinymce-hiddenOnly"),
TINYMCE_HIDDENANDANSWER("tinymce-hiddenAndAnswer"),
BORDER("border"),
BORDER_LEFT("border-left"),
BORDER_BOTTOM("border-bottom"),
BORDER_RIGHT("border-right"),
BORDER_TOP("border-top"),
BORDER_LEFT_COLOR("border-left-color"),
BORDER_BOTTOM_COLOR("border-bottom-color"),
BORDER_RIGHT_COLOR("border-right-color"),
BORDER_TOP_COLOR("border-top-color");
private final String attr;
public String getAttr() {
return this.attr;
}
private AttrEnum(String attr) {
this.attr = attr;
}
}

140
java-src/enums/TagEnum.java Normal file
View File

@@ -0,0 +1,140 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.jby.common.util.DistinctUtils
* org.apache.commons.collections4.CollectionUtils
* org.apache.commons.lang3.StringUtils
* org.jsoup.nodes.Element
*/
package com.jby.officecore.enums;
import com.jby.common.util.DistinctUtils;
import com.jby.officecore.domain.bo.TagStyleBO;
import com.jby.officecore.enums.AttrEnum;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.nodes.Element;
public enum TagEnum {
H1("h1", true, null),
H2("h2", true, null),
H3("h3", true, null),
H4("h4", true, null),
P("p", false, null),
DIV("div", false, null),
FONT("font", false, Stream.of(AttrEnum.FACE, AttrEnum.SIZE, AttrEnum.COLOR).collect(Collectors.toList())),
STRIKE("strike", true, null),
BR("br", false, null),
PBR("pbr", false, null),
HR("hr", false, null),
U("u", true, null),
I("i", true, null),
SUB("sub", true, null),
SUP("sup", true, null),
WAVE("wave", true, null),
DOT("dot", true, null),
B("b", true, null),
A("a", false, Stream.of(AttrEnum.HREF).collect(Collectors.toList())),
TABLE("table", false, null),
UL("ul", false, null),
OL("ol", false, null),
LI("li", false, null),
IMG("img", false, Stream.of(AttrEnum.WIDTH, AttrEnum.HEIGHT).collect(Collectors.toList())),
IMQ("imq", false, Stream.of(AttrEnum.WIDTH, AttrEnum.HEIGHT).collect(Collectors.toList())),
VIDEO("video", false, Stream.of(AttrEnum.WIDTH, AttrEnum.HEIGHT).collect(Collectors.toList())),
SOURCE("source", false, null),
MATH("math", false, null),
TAB("tab", false, null),
TEXT("#text", false, null),
SPAN("span", false, Stream.of(AttrEnum.CLASS).collect(Collectors.toList())),
EM("em", true, null),
STRONG("strong", true, null);
private final String name;
private final Boolean dealTagStyle;
private final List<AttrEnum> attrList;
public static final Set<String> H_P_SET;
public static final Set<String> H_SET;
public static final Set<String> UL_OL_SET;
private static final Map<String, TagEnum> MAP;
public static TagEnum getTagEnum(String tagName) {
return MAP.get(tagName);
}
public static List<TagStyleBO> getStyleList(Element element) {
ArrayList<TagStyleBO> styleList = new ArrayList<TagStyleBO>();
TagEnum tagEnum = TagEnum.getTagEnum(element.tagName());
if (Objects.nonNull((Object)tagEnum) && Boolean.TRUE.equals(tagEnum.dealTagStyle)) {
styleList.add(new TagStyleBO().setTagName(element.tagName()).setAttr(tagEnum.getName()).setValue(tagEnum.getName()));
}
if (Objects.nonNull((Object)tagEnum) && CollectionUtils.isNotEmpty(tagEnum.getAttrList())) {
for (AttrEnum attrEnum : tagEnum.getAttrList()) {
if (!StringUtils.isNotBlank((CharSequence)element.attr(attrEnum.getAttr())) || "null".equals(element.attr(attrEnum.getAttr()))) continue;
styleList.add(new TagStyleBO().setTagName(element.tagName()).setAttr(attrEnum.getAttr()).setValue(element.attr(attrEnum.getAttr())));
}
}
List<String> styles = StringUtils.isBlank((CharSequence)element.attr(AttrEnum.STYLE.getAttr())) ? Collections.emptyList() : Arrays.asList(element.attr(AttrEnum.STYLE.getAttr()).split(";"));
styles.forEach(style -> {
if (StringUtils.isBlank((CharSequence)style)) {
return;
}
String[] split = style.split(":");
if (split.length < 2) {
return;
}
String attr = split[0].trim();
String value = split[1].trim();
if (StringUtils.isBlank((CharSequence)value) || "null".equals(value) || StringUtils.isBlank((CharSequence)attr) || "null".equals(attr)) {
return;
}
styleList.add(new TagStyleBO().setTagName(element.tagName()).setAttr(attr).setValue(value));
});
return styleList.stream().filter(DistinctUtils.distinctByKey(TagStyleBO::getAttr)).filter(e -> !e.getValue().contains("auto")).collect(Collectors.toList());
}
public static Map<String, String> getStyleMap(Element element) {
List<TagStyleBO> styleList = TagEnum.getStyleList(element);
return styleList.stream().collect(Collectors.toMap(TagStyleBO::getAttr, TagStyleBO::getValue, (l, r) -> l));
}
public String getName() {
return this.name;
}
public Boolean getDealTagStyle() {
return this.dealTagStyle;
}
public List<AttrEnum> getAttrList() {
return this.attrList;
}
private TagEnum(String name, Boolean dealTagStyle, List<AttrEnum> attrList) {
this.name = name;
this.dealTagStyle = dealTagStyle;
this.attrList = attrList;
}
static {
H_P_SET = Stream.of(H1.getName(), H2.getName(), H3.getName(), H4.getName(), P.getName()).collect(Collectors.toSet());
H_SET = Stream.of(H1.getName(), H2.getName(), H3.getName(), H4.getName()).collect(Collectors.toSet());
UL_OL_SET = Stream.of(UL.getName(), OL.getName()).collect(Collectors.toSet());
MAP = new HashMap<String, TagEnum>();
for (TagEnum tagEnum : TagEnum.values()) {
MAP.put(tagEnum.getName(), tagEnum);
}
}
}

View File

@@ -0,0 +1,110 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.jby.common.exceptions.BusinessException
* org.apache.commons.pool2.BasePooledObjectFactory
* org.apache.commons.pool2.PooledObject
* org.apache.commons.pool2.PooledObjectFactory
* org.apache.commons.pool2.impl.DefaultPooledObject
* org.apache.commons.pool2.impl.GenericObjectPool
* org.apache.commons.pool2.impl.GenericObjectPoolConfig
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.core.io.ClassPathResource
*/
package com.jby.officecore.pool;
import com.jby.common.exceptions.BusinessException;
import java.util.Objects;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
public enum OMml2MmlTransformerPool {
INSTANCE;
private static final Logger log;
private GenericObjectPool<Transformer> objectPool;
private OMml2MmlTransformerPool() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(30);
poolConfig.setMinIdle(4);
poolConfig.setMaxIdle(8);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setMaxWaitMillis(3000L);
poolConfig.setTestOnCreate(true);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
PooledTransformerFactory objectFactory = new PooledTransformerFactory();
this.objectPool = new GenericObjectPool((PooledObjectFactory)objectFactory, poolConfig);
}
public Transformer borrowObject() {
log.info("\u8f6c\u6362\u5668\u6c60TransformerPool, \u7a7a\u95f2\u5bf9\u8c61\u6570\u91cf:{}, \u6d3b\u8dc3\u5bf9\u8c61\u6570\u91cf:{}, \u963b\u585e\u7b49\u5f85\u6570\u91cf:{},", new Object[]{this.objectPool.getNumIdle(), this.objectPool.getNumActive(), this.objectPool.getNumWaiters()});
try {
return (Transformer)this.objectPool.borrowObject();
}
catch (Exception e) {
log.error("\u4ece\u5bf9\u8c61\u6c60\u4e2d\u501f\u51fa\u5bf9\u8c61\u5f02\u5e38", (Throwable)e);
return null;
}
}
public void returnObject(Transformer transformer) {
log.info("\u8f6c\u6362\u5668\u6c60TransformerPool, \u7a7a\u95f2\u5bf9\u8c61\u6570\u91cf:{}, \u6d3b\u8dc3\u5bf9\u8c61\u6570\u91cf:{}, \u963b\u585e\u7b49\u5f85\u6570\u91cf:{},", new Object[]{this.objectPool.getNumIdle(), this.objectPool.getNumActive(), this.objectPool.getNumWaiters()});
if (Objects.nonNull(transformer)) {
this.objectPool.returnObject((Object)transformer);
}
}
static {
log = LoggerFactory.getLogger(OMml2MmlTransformerPool.class);
}
public static class PooledTransformerFactory
extends BasePooledObjectFactory<Transformer> {
private static final Logger log = LoggerFactory.getLogger(PooledTransformerFactory.class);
private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
public Transformer create() throws Exception {
return PooledTransformerFactory.buildTransformer();
}
public PooledObject<Transformer> wrap(Transformer transformer) {
return new DefaultPooledObject((Object)transformer);
}
public void destroyObject(PooledObject<Transformer> p) throws Exception {
super.destroyObject(p);
}
public boolean validateObject(PooledObject<Transformer> p) {
return Objects.nonNull(p.getObject());
}
private static Transformer buildTransformer() {
try {
ClassPathResource resource = new ClassPathResource("xsl/OMML2MML.XSL");
StreamSource xslSource = new StreamSource(resource.getInputStream());
return TRANSFORMER_FACTORY.newTransformer(xslSource);
}
catch (Exception e) {
log.error("\u751f\u6210\u8f6c\u6362\u5668\u5f02\u5e38", (Throwable)e);
throw new BusinessException("\u751f\u6210\u8f6c\u6362\u5668\u5f02\u5e38");
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,112 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.jby.common.util.FileUtil
* org.apache.commons.codec.binary.Hex
* org.apache.commons.codec.digest.DigestUtils
* org.apache.commons.lang3.StringUtils
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.stereotype.Component
* org.springframework.web.multipart.MultipartFile
*/
package com.jby.officecore.utils;
import com.jby.common.util.FileUtil;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class DigestUtil {
private static final Logger log = LoggerFactory.getLogger(DigestUtil.class);
private static final String DIGEST_MD5 = "MD5";
private static final String DIGEST_SHA1 = "SHA-1";
public static String getMd5(String str) {
if (StringUtils.isBlank((CharSequence)str)) {
return null;
}
try {
return DigestUtils.md5Hex((String)str);
}
catch (Exception e) {
log.error("\u83b7\u53d6\u5b57\u7b26\u4e32MD5\u503c\u5f02\u5e38:{}", (Object)e.getMessage(), (Object)e);
return null;
}
}
public static String getFileMd5(String filePath) {
File file = FileUtil.getFile((String)filePath);
return DigestUtil.getFileMd5(FileUtil.getMultipartFile((String)file.getName(), (File)file));
}
public static String getFileMd5(MultipartFile file) {
return DigestUtil.getDigest(file, DIGEST_MD5);
}
public static String getSha1(String str) {
if (StringUtils.isBlank((CharSequence)str)) {
return null;
}
try {
return DigestUtils.sha1Hex((String)str);
}
catch (Exception e) {
log.error("\u83b7\u53d6\u5b57\u7b26\u4e32sha1\u503c\u5f02\u5e38:{}", (Object)e.getMessage(), (Object)e);
return null;
}
}
public static String getFileSha1(String filePath) {
File file = FileUtil.getFile((String)filePath);
return DigestUtil.getFileSha1(FileUtil.getMultipartFile((String)file.getName(), (File)file));
}
public static String getFileSha1(MultipartFile file) {
return DigestUtil.getDigest(file, DIGEST_SHA1);
}
/*
* WARNING - Removed try catching itself - possible behaviour change.
*/
private static String getDigest(MultipartFile file, String digest) {
InputStream is = null;
try {
int length;
MessageDigest messageDigest = MessageDigest.getInstance(digest);
is = file.getInputStream();
byte[] buffer = new byte[8192];
while ((length = is.read(buffer)) != -1) {
messageDigest.update(buffer, 0, length);
}
String string = new String(Hex.encodeHex((byte[])messageDigest.digest()));
return string;
}
catch (Exception e) {
log.error("\u83b7\u53d6\u6458\u8981\u503c\u5f02\u5e38:{}", (Object)e.getMessage(), (Object)e);
String string = null;
return string;
}
finally {
try {
if (is != null) {
is.close();
}
}
catch (IOException e) {
log.error("close error");
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,501 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* cn.hutool.core.thread.ThreadUtil
* com.alibaba.fastjson.JSON
* com.alibaba.fastjson.JSONObject
* com.alibaba.fastjson.TypeReference
* com.alibaba.fastjson.parser.Feature
* com.fasterxml.jackson.databind.ObjectMapper
* com.fasterxml.jackson.databind.SerializationFeature
* com.jby.common.util.FileUtil
* com.jby.common.util.HttpClientUtil
* com.jby.common.util.UniqueUtil
* fmath.conversion.ConvertFromLatexToMathML
* fmath.conversion.ConvertFromMathMLToLatex
* org.apache.commons.collections4.MapUtils
* org.apache.commons.exec.CommandLine
* org.apache.commons.exec.DefaultExecutor
* org.apache.commons.exec.ExecuteStreamHandler
* org.apache.commons.exec.PumpStreamHandler
* org.apache.commons.lang3.StringUtils
* org.scilab.forge.jlatexmath.TeXFormula
* org.scilab.forge.jlatexmath.TeXIcon
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.beans.factory.annotation.Autowired
* org.springframework.stereotype.Component
*/
package com.jby.officecore.utils;
import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.jby.common.util.FileUtil;
import com.jby.common.util.HttpClientUtil;
import com.jby.common.util.UniqueUtil;
import com.jby.officecore.config.OfficeCoreConfig;
import com.jby.officecore.domain.bo.LatexInfoBO;
import com.jby.officecore.utils.MapUtil;
import fmath.conversion.ConvertFromLatexToMathML;
import fmath.conversion.ConvertFromMathMLToLatex;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteStreamHandler;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.lang3.StringUtils;
import org.scilab.forge.jlatexmath.TeXFormula;
import org.scilab.forge.jlatexmath.TeXIcon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LatexUtil {
private static final Logger log = LoggerFactory.getLogger(LatexUtil.class);
private static final String LATEX_PATTERN_STR = "\\$\\$(.*?)\\$\\$|\\\\\\((.*?)\\\\\\)";
private static final Pattern LATEX_PATTERN = Pattern.compile("\\$\\$(.*?)\\$\\$|\\\\\\((.*?)\\\\\\)");
private static final String LATEX_SELF_PATTERN_STR = "(?<=\\$\\$)(.*?)(?=\\$\\$)|(?<=\\\\\\()(.*?)(?=\\\\\\))";
private static final Pattern LATEX_SELF_PATTERN = Pattern.compile("(?<=\\$\\$)(.*?)(?=\\$\\$)|(?<=\\\\\\()(.*?)(?=\\\\\\))");
private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4e00-\u9fa5]");
private static final String LATEX_REPLACE = "@@@";
public static final String LATEX_SPLIT = "###";
private static OfficeCoreConfig officeCoreConfig;
private static final ObjectMapper MAPPER;
@Autowired
public void setOfficeCoreConfig(OfficeCoreConfig officeCoreConfig) {
LatexUtil.officeCoreConfig = officeCoreConfig;
}
public static String dealLatexContent(String content, Map<String, LatexInfoBO> latexMap, Boolean newTransferVersion) {
String result = content.replaceAll(LATEX_PATTERN_STR, LATEX_REPLACE);
Matcher mather = LatexUtil.getLatexMatcher(content);
while (mather.find()) {
String latex = mather.group();
String latexKey = "";
if (StringUtils.isNotBlank((CharSequence)latex)) {
String cleanLatex;
Matcher matcher;
latex = latex.replaceAll("&nbsp;", " ");
latex = latex.replaceAll("&gt;", ">");
latex = latex.replaceAll("&lt;", "<");
latex = latex.replace("<br/>", "").replace("\\&nbsp;", "");
if (Boolean.TRUE.equals(newTransferVersion)) {
latexKey = latex.replaceAll(LATEX_SELF_PATTERN_STR, UniqueUtil.getUuid());
matcher = LATEX_SELF_PATTERN.matcher(latex);
if (matcher.find() && StringUtils.isNotBlank((CharSequence)(cleanLatex = matcher.group()))) {
latex = cleanLatex;
}
} else {
latex = LatexUtil.formatLatex(latex);
latexKey = latex.replaceAll(LATEX_SELF_PATTERN_STR, UniqueUtil.getUuid());
matcher = LATEX_SELF_PATTERN.matcher(latex);
if (matcher.find() && StringUtils.isNotBlank((CharSequence)(cleanLatex = matcher.group()))) {
latex = cleanLatex;
}
latex = LatexUtil.wrapLatexExpressionWithBraces(latex);
}
latexMap.put(latexKey, new LatexInfoBO().setLatexKey(latexKey).setLatex(latex));
}
result = StringUtils.replaceOnce((String)result, (String)LATEX_REPLACE, (String)("&nbsp;###" + latexKey + LATEX_SPLIT + "&nbsp;"));
}
return result;
}
public static String wrapLatexExpressionWithBraces(String latex) {
String[] simpleOperators;
String[] limitsOperators;
if (StringUtils.isBlank((CharSequence)latex)) {
return latex;
}
latex = latex.replaceAll("\\\\xleftrightarrow\\[([^\\]]+)\\]\\{([^}]+)\\}", "\\\\underset{$1}{\\\\overset{$2}{\\\\longleftrightarrow}}");
latex = latex.replaceAll("\\\\xrightleftharpoons\\[([^\\]]+)\\]\\{([^}]+)\\}", "\\\\underset{$1}{\\\\overset{$2}{\\\\mathop{\\\\rightleftharpoons }}}\\\\,");
latex = latex.replaceAll("\\\\enclose\\{madruwb\\}\\{([^}]+)\\}", "\\\\left. \\{\\\\underline \\{$1\\}\\} \\\\right|");
latex = latex.replaceAll("\\\\enclose\\{actuarial\\}\\{([^}]+)\\}", "\\\\left. \\{\\\\overline \\{$1\\}\\} \\\\right|");
String[] operators = new String[]{"prod", "coprod", "sum", "int", "bigcap", "bigcup", "iint", "iiint", "oint"};
for (String op : limitsOperators = new String[]{"prod", "coprod", "sum", "bigcap", "bigcup", "iint", "iiint", "oint"}) {
latex = latex.replaceAll("(\\\\displaystyle\\\\" + op + "\\\\limits(?:\\s*_\\{[^}]*\\})?(?:\\s*\\^\\{[^}]*\\}|\\s*_\\{[^}]*\\})\\s*)([a-zA-Z0-9]+)(?![a-zA-Z0-9])", "$1{$2}");
}
for (String op : operators) {
latex = latex.replaceAll("(\\\\displaystyle\\\\" + op + "(?:\\s*_\\{[^}]*\\})?(?:\\s*\\^\\{[^}]*\\}|\\s*_\\{[^}]*\\})\\s*)([a-zA-Z0-9]+)(?![a-zA-Z0-9])", "$1{$2}");
}
for (String op : simpleOperators = new String[]{"iint", "iiint", "oint"}) {
latex = latex.replaceAll("(\\\\" + op + "\\s*_\\{[^}]*\\}\\s*)([a-zA-Z0-9]+)(?![a-zA-Z0-9])", "$1{$2}");
}
return latex;
}
public static String formatLatex(String latex) {
if (StringUtils.isBlank((CharSequence)latex)) {
return latex;
}
StringBuilder latexBuilder = new StringBuilder();
try {
latex = latex.replace("leqslant", "leq");
latex = latex.replace("geqslant", "geq");
boolean inChinese = false;
char[] cArray = latex.toCharArray();
int n = cArray.length;
for (int i = 0; i < n; ++i) {
Character c = Character.valueOf(cArray[i]);
Matcher chineseMatch = CHINESE_PATTERN.matcher(c.toString());
if (chineseMatch.find()) {
if (inChinese) {
latexBuilder.append(c);
continue;
}
latexBuilder.append("\\mbox{").append(c);
inChinese = true;
continue;
}
if (inChinese) {
inChinese = false;
latexBuilder.append("}");
}
latexBuilder.append(c);
}
if (inChinese) {
latexBuilder.append("}");
}
}
catch (Exception e) {
log.error("formatLatex error, latex:{}, result:{}", new Object[]{latex, latexBuilder.toString(), e});
}
return latexBuilder.toString();
}
public static void latexToImg(String latex, String path) {
try {
TeXFormula formula = new TeXFormula(latex);
TeXIcon icon = formula.createTeXIcon(0, 40.0f);
icon.setInsets(new Insets(5, 5, 5, 5));
BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), 6);
Graphics2D g2d = bImg.createGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight());
JLabel jl = new JLabel();
jl.setForeground(new Color(0, 0, 0));
icon.paintIcon((java.awt.Component)jl, (Graphics)g2d, 0, 0);
File out = FileUtil.getFile((String)path);
ImageIO.write((RenderedImage)bImg, "png", out);
}
catch (Exception e) {
log.error("latexToImg error\uff1alatex={}, path={}, ", new Object[]{latex, path, e});
}
}
public static void latexToMathML(Map<String, LatexInfoBO> latexMap) {
Collection<Map<String, LatexInfoBO>> maps = MapUtil.splitMap(latexMap, 500);
HashMap convertMap = new HashMap();
maps.forEach(map -> {
if (MapUtils.isEmpty((Map)map)) {
return;
}
HashMap convertParam = new HashMap();
String result = null;
try {
HashMap param = new HashMap();
map.values().forEach(info -> param.put(info.getLatexKey(), info.getLatex()));
convertParam.put("latex", param);
long ts = System.currentTimeMillis();
result = HttpClientUtil.doPost((String)officeCoreConfig.getForeLatexToMathMlApi(), (String)JSON.toJSONString(convertParam));
log.info("latex\u8f6cmathML\u8c03\u7528python\u63a5\u53e3\u6210\u529f, \u8017\u65f6\uff1a{}\u6beb\u79d2", (Object)(System.currentTimeMillis() - ts));
Map convertResult = (Map)HttpClientUtil.parseResult((String)result, (TypeReference)new TypeReference<Map<String, String>>(){});
if (MapUtils.isNotEmpty((Map)convertResult)) {
convertMap.putAll(convertResult);
}
}
catch (Exception e) {
log.error("latex\u8f6cmathML\u8c03\u7528python\u63a5\u53e3\u5f02\u5e38, param:{}, result:{}", new Object[]{JSON.toJSONString(convertParam), result, e});
}
});
latexMap.values().forEach(info -> {
String mathMl = (String)convertMap.get(info.getLatexKey());
if (StringUtils.isBlank((CharSequence)mathMl)) {
try {
mathMl = LatexUtil.convertFromLatexToMathML(info.getLatex());
log.info("latex\u8f6cmathML\u672c\u5730\u8f6c\u6362,latex:{}", (Object)info.getLatex());
}
catch (Exception e) {
log.error("latex\u8f6cmathML\u672c\u5730\u8f6c\u6362\u5f02\u5e38, info:{}", (Object)JSON.toJSONString((Object)info), (Object)e);
}
}
if (StringUtils.isNotBlank((CharSequence)mathMl)) {
mathMl = mathMl.replaceAll("(?i)&#x27C2;", "&#x22A5;");
}
info.setMathMl(mathMl);
});
}
private static String convertFromLatexToMathML(String latex) {
String mathMl = ConvertFromLatexToMathML.convertToMathML((String)latex);
mathMl = mathMl.replace("\n", "").replaceFirst("<math", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\" ").replace("&lowast;", "\u2217").replace("&there4;", "\u2234").replace("&prop;", "\u221d").replace("&asymp;", "\u2248").replace("&ne;", "\u2260").replace("&ni;", "\u220b").replace("&isin;", "\u2208").replace("&notin;", "\u2209").replace("&alpha;", "\u03b1").replace("&beta;", "\u03b2").replace("&gamma;", "\u03b3").replace("&delta;", "\u03b4").replace("&varepsilon;", "\u03b5").replace("&epsilon;", "\u03f5").replace("&zeta;", "\u03b6").replace("&eta;", "\u03b7").replace("&theta;", "\u03b8").replace("&thetasym;", "\u03d1").replace("&iota;", "\u03b9").replace("&kappa;", "\u03ba").replace("&lambda;", "\u03bb").replace("&mu;", "\u03bc").replace("&nu;", "\u03bd").replace("&rho;", "\u03c1").replace("&sigma;", "\u03c3").replace("&phi;", "\u03d5").replace("&varphi;", "\u03c6").replace("&omega;", "\u03c9").replace("&Lambda;", "\u039b").replace("&Sigma;", "\u03a3").replace("&Omega;", "\u03a9").replace("&sub;", "\u2282").replace("&sup;", "\u2283").replace("&sube;", "\u2286").replace("&supe;", "\u2287").replace("&nabla;", "\u2207").replace("&hellip;", "\u2026").replace("&darr;", "\u2193").replace("&dArr;", "\u21d3").replace("&uarr;", "\u2191").replace("&uArr;", "\u21d1").replace("&rarr;", "\u2192").replace("&rArr;", "\u21d2").replace("&larr;", "\u2190").replace("&lArr;", "\u21d0").replace("&harr;", "\u2194").replace("&hArr;", "\u21d4").replace("&real;", "\u211c").replace("&image;", "\u2111").replace("&part;", "\u2202").replace("&infin;", "\u221e").replace("&alefsym;", "\u2135").replace("&exist;", "\u2203").replace("&empty;", "\u2205").replace("&cup;", "\u222a").replace("&cap;", "\u2229").replace("&deg;", "\u00b0").replace("&ang;", "\u2220").replace("&int;", "\u222b").replace("&prod;", "\u220f").replace("&coprod;", "\u2210");
return mathMl;
}
public static void mathMlToLatex(Map<String, String> formulaMap, Path path) {
if (!MapUtils.isEmpty(formulaMap)) {
log.info("mathML\u8f6clatex\u6570\u91cf:{}", (Object)formulaMap.size());
}
Collection<Map<String, String>> maps = MapUtil.splitMap(formulaMap, 500);
HashMap convertMap = new HashMap();
maps.forEach(map -> {
block11: {
if (MapUtils.isEmpty((Map)map)) {
return;
}
HashMap<String, Map> convertParam = new HashMap<String, Map>();
String result = "";
if (Boolean.TRUE.equals(officeCoreConfig.getMathMlToLatexApiSwitch())) {
try {
convertParam.put("mathml_dict", (Map)map);
long ts = System.currentTimeMillis();
result = HttpClientUtil.doPost((String)officeCoreConfig.getMathMlToLatexApi(), convertParam, (int)5000, (int)15000);
log.info("mathML\u8f6clatex\u8c03\u7528python\u63a5\u53e3\u6210\u529f, \u8017\u65f6\uff1a{}\u6beb\u79d2", (Object)(System.currentTimeMillis() - ts));
result = result.replace("<", "\\\\lt ");
Map convertResult = (Map)HttpClientUtil.parseResult((String)result, (TypeReference)new TypeReference<Map<String, String>>(){});
if (MapUtils.isNotEmpty((Map)convertResult)) {
convertMap.putAll(convertResult);
}
}
catch (Exception e) {
log.error("mathML\u8f6clatex\u8c03\u7528python\u63a5\u53e3\u5f02\u5e38, param:{}, result:{}", new Object[]{JSON.toJSONString(convertParam), result, e});
}
ThreadUtil.sleep((long)2000L);
} else {
try {
Map convertResult;
JSONObject json;
String data;
convertParam.put("mathml_dict", (Map)map);
File tempFile = File.createTempFile("mathml_input-", ".json", new File(path.toString()));
String absolutePath = tempFile.getAbsolutePath();
if (!StringUtils.isNotBlank((CharSequence)absolutePath) || map.isEmpty()) break block11;
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValue(tempFile, convertParam);
CommandLine cmdLine = CommandLine.parse((String)officeCoreConfig.getPythonCommand());
cmdLine.addArgument(officeCoreConfig.getTransformScriptPath() + "/mathml2latex/batch_converter.py");
cmdLine.addArgument("--input-file=" + absolutePath);
ByteArrayOutputStream output = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler((OutputStream)output, (OutputStream)output);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler((ExecuteStreamHandler)streamHandler);
long ts = System.currentTimeMillis();
try {
executor.execute(cmdLine);
}
catch (Exception e) {
log.error("mathml2latex/batch_converter.py error, \n\u8f93\u51fa:{}", (Object)output, (Object)e);
}
log.info("mathml2latex/batch_converter.py end, \u6570\u91cf:{}, \u8017\u65f6:{}\u6beb\u79d2", (Object)map.size(), (Object)(System.currentTimeMillis() - ts));
String fullOutput = output.toString();
CharSequence[] lines = fullOutput.split("\n");
result = String.join((CharSequence)"", lines);
result = result.replace("<", "\\\\lt ");
if (StringUtils.isNotBlank((CharSequence)result) && Objects.nonNull(data = (json = JSONObject.parseObject((String)result)).getString("data")) && MapUtils.isNotEmpty((Map)(convertResult = (Map)JSON.parseObject((String)data, (TypeReference)new TypeReference<Map<String, String>>(){}, (Feature[])new Feature[0])))) {
convertMap.putAll(convertResult);
}
}
catch (Exception e) {
log.error("mathML\u8f6clatex\u8c03\u7528\u672c\u5730python\u7a0b\u5e8f\u5f02\u5e38,param:{}, result:{}", new Object[]{JSON.toJSONString(convertParam), result, e});
}
}
}
});
formulaMap.forEach((formulaKey, mathMl) -> {
String latex = (String)convertMap.get(formulaKey);
if (StringUtils.isBlank((CharSequence)latex)) {
try {
latex = ConvertFromMathMLToLatex.convertToLatex((String)mathMl);
log.info("mathML\u8f6clatex\u672c\u5730\u8f6c\u6362,latex:{}", (Object)latex);
}
catch (Exception e) {
log.error("mathML\u8f6clatex\u672c\u5730\u8f6c\u6362\u5f02\u5e38, mathMl:{}, latex:{}", new Object[]{mathMl, latex, e});
}
}
if (StringUtils.isNotBlank((CharSequence)latex) && latex.length() > 2) {
formulaMap.put((String)formulaKey, latex.substring(1, latex.length() - 1));
}
});
}
public static Matcher getLatexMatcher(String content) {
return LATEX_PATTERN.matcher(content);
}
public static void mathMlToLatexIgnoreNull(Map<String, String> formulaMap, String copyrightAddresses, Path path) {
Map<String, String> map = formulaMap.entrySet().stream().filter(f -> Objects.nonNull(f.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
LatexUtil.mathMlToLatex(map, path);
String[] original = copyrightAddresses.split(",");
String[] transformed = (String[])Arrays.stream(original).map(s -> s.chars().mapToObj(c -> {
if (c == 46) {
return ".";
}
return "\\mathrm{" + (char)c + "}";
}).collect(Collectors.joining())).toArray(String[]::new);
String[] splits = (String[])Stream.concat(Arrays.stream(original), Arrays.stream(transformed)).toArray(String[]::new);
map.replaceAll((key, value) -> {
if (value == null) {
return null;
}
return Arrays.stream(splits).anyMatch(value::contains) ? null : value;
});
formulaMap.putAll(map);
}
public static void ommlAndMathMlToLatex(Map<String, String> formulaMap, Path path) {
if (!MapUtils.isEmpty(formulaMap)) {
log.info("Omml\u6216MathML\u8f6clatex\u6570\u91cf:{}", (Object)formulaMap.size());
}
Collection<Map<String, String>> maps = MapUtil.splitMap(formulaMap, 1000);
maps.forEach(map -> {
block6: {
if (MapUtils.isEmpty((Map)map)) {
return;
}
String result = "";
try {
Map convertResult;
File tempFile = File.createTempFile("input-", ".json", new File(path.toString()));
String absolutePath = tempFile.getAbsolutePath();
if (!StringUtils.isNotBlank((CharSequence)absolutePath) || map.isEmpty()) break block6;
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValue(tempFile, map);
CommandLine cmdLine = CommandLine.parse((String)officeCoreConfig.getPythonCommand());
cmdLine.addArgument(officeCoreConfig.getTransformScriptPath() + "/omml_mathml2latex/omml_mathml2latex.py");
cmdLine.addArgument("--json");
cmdLine.addArgument(absolutePath);
ByteArrayOutputStream output = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler((OutputStream)output, (OutputStream)output);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler((ExecuteStreamHandler)streamHandler);
long ts = System.currentTimeMillis();
try {
executor.execute(cmdLine);
}
catch (Exception e) {
log.error("/omml_mathml2latex/omml_mathml2latex.py error, \n\u8f93\u51fa:{}", (Object)output, (Object)e);
}
log.info("/omml_mathml2latex/omml_mathml2latex.py end, \u6570\u91cf:{}, \u8017\u65f6:{}\u6beb\u79d2", (Object)map.size(), (Object)(System.currentTimeMillis() - ts));
String fullOutput = output.toString();
CharSequence[] lines = fullOutput.split("\n");
result = String.join((CharSequence)"", lines);
if (StringUtils.isNotBlank((CharSequence)result) && MapUtils.isNotEmpty((Map)(convertResult = (Map)JSON.parseObject((String)result, (TypeReference)new TypeReference<Map<String, String>>(){}, (Feature[])new Feature[0])))) {
formulaMap.putAll(convertResult);
}
}
catch (Exception e) {
log.error("Omml\u6216MathML\u8f6clatex\u8c03\u7528\u672c\u5730python\u7a0b\u5e8f\u5f02\u5e38,param:{}, result:{}", new Object[]{JSON.toJSONString((Object)map), result, e});
}
}
});
}
public static void ommlMathMlToLatexIgnoreNull(Map<String, String> formulaMap, String copyrightAddresses, Path path) {
Map<String, String> map = formulaMap.entrySet().stream().filter(f -> Objects.nonNull(f.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
LatexUtil.ommlAndMathMlToLatex(map, path);
String[] original = copyrightAddresses.split(",");
String[] transformed = (String[])Arrays.stream(original).map(s -> s.chars().mapToObj(c -> {
if (c == 46) {
return ".";
}
return "\\mathrm{" + (char)c + "}";
}).collect(Collectors.joining())).toArray(String[]::new);
String[] splits = (String[])Stream.concat(Arrays.stream(original), Arrays.stream(transformed)).toArray(String[]::new);
map.replaceAll((key, value) -> {
if (value == null) {
return null;
}
return Arrays.stream(splits).anyMatch(value.replace(" ", "")::contains) ? null : value;
});
formulaMap.putAll(map);
}
public static void latexAndMathMlToOmml(Map<String, String> latexMathmlMap) {
if (!MapUtils.isEmpty(latexMathmlMap)) {
log.info("Latex\u6216MathML\u8f6cOmml\u6570\u91cf:{}", (Object)latexMathmlMap.size());
}
String tempFolder = officeCoreConfig.getTmpPath() + "/download" + File.separator + UniqueUtil.getUuid() + File.separator;
Collection<Map<String, String>> maps = MapUtil.splitMap(latexMathmlMap, 1000);
maps.forEach(map -> {
block10: {
if (MapUtils.isEmpty((Map)map)) {
return;
}
String result = "";
try {
Map convertResult;
File tempFile = FileUtil.getFile((String)(tempFolder + UniqueUtil.getUuid() + ".json"));
String absolutePath = tempFile.getAbsolutePath();
if (!StringUtils.isNotBlank((CharSequence)absolutePath) || map.isEmpty()) break block10;
MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
MAPPER.writeValue(tempFile, map);
CommandLine cmdLine = CommandLine.parse((String)officeCoreConfig.getPythonCommand());
cmdLine.addArguments(new String[]{officeCoreConfig.getTransformScriptPath() + "/latex_mathml2omml/latex_mathml2omml.py", "--json", absolutePath}, false);
ByteArrayOutputStream output = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler((OutputStream)output, (OutputStream)output);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler((ExecuteStreamHandler)streamHandler);
long ts = System.currentTimeMillis();
try {
executor.execute(cmdLine);
}
catch (Exception e) {
log.error("/latex_mathml2omml/latex_mathml2omml.py error, \n\u8f93\u51fa:{}", (Object)output, (Object)e);
}
log.info("/latex_mathml2omml/latex_mathml2omml.py end, \u6570\u91cf:{}, \u8017\u65f6:{}\u6beb\u79d2", (Object)map.size(), (Object)(System.currentTimeMillis() - ts));
String fullOutput = output.toString();
CharSequence[] lines = fullOutput.split("\n");
result = String.join((CharSequence)"", lines);
if (StringUtils.isNotBlank((CharSequence)result) && MapUtils.isNotEmpty((Map)(convertResult = (Map)JSON.parseObject((String)result, (TypeReference)new TypeReference<Map<String, String>>(){}, (Feature[])new Feature[0])))) {
latexMathmlMap.putAll(convertResult);
}
}
catch (Exception e) {
log.error("Latex\u6216MathML\u8f6cOmml\u8c03\u7528\u672c\u5730python\u7a0b\u5e8f\u5f02\u5e38,param:{}, result:{}", new Object[]{JSON.toJSONString((Object)map), result, e});
}
finally {
if (Boolean.TRUE.equals(officeCoreConfig.getDeleteTmpFile())) {
FileUtil.delFolder((String)tempFolder);
}
}
}
});
}
static {
MAPPER = new ObjectMapper();
}
}

View File

@@ -0,0 +1,131 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.alibaba.fastjson.JSON
* com.alibaba.fastjson.JSONObject
* org.apache.commons.collections4.MapUtils
* org.apache.commons.exec.CommandLine
* org.apache.commons.exec.DefaultExecutor
* org.apache.commons.exec.ExecuteStreamHandler
* org.apache.commons.exec.PumpStreamHandler
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.beans.factory.annotation.Autowired
* org.springframework.stereotype.Component
*/
package com.jby.officecore.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jby.officecore.config.OfficeCoreConfig;
import com.jby.officecore.utils.MapUtil;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteStreamHandler;
import org.apache.commons.exec.PumpStreamHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MathTypeUtil {
private static final Logger log = LoggerFactory.getLogger(MathTypeUtil.class);
private static OfficeCoreConfig officeCoreConfig;
@Autowired
public void setOfficeCoreConfig(OfficeCoreConfig officeCoreConfig) {
MathTypeUtil.officeCoreConfig = officeCoreConfig;
}
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
for (int i = 1; i < 927; ++i) {
map.put("jby_" + i, "/Users/hking/test/embeddings/oleObject" + i + ".bin");
}
MathTypeUtil.mathTypeToMathMl(map);
System.out.println(map);
}
public static void mathTypeToMathMl(Map<String, String> formulaMap) {
if (!MapUtils.isEmpty(formulaMap)) {
log.info("mathtype\u8f6cmathml\u6570\u91cf:{}", (Object)formulaMap.size());
}
try {
Collection<Map<String, String>> maps = MapUtil.splitMap(formulaMap, 500);
maps.forEach(m -> {
Path tempJsonFile;
if (MapUtils.isEmpty((Map)formulaMap)) {
return;
}
CommandLine cmdLine = CommandLine.parse((String)"ruby");
cmdLine.addArgument(officeCoreConfig.getTransformScriptPath() + "/mathtype2mathml/batch_converter.rb");
String data = JSONObject.toJSONString((Object)m);
try {
tempJsonFile = Files.createTempFile("mathtype_input-", ".json", new FileAttribute[0]);
Files.write(tempJsonFile, data.getBytes(StandardCharsets.UTF_8), new OpenOption[0]);
}
catch (IOException e) {
log.error("\u521b\u5efa\u4e34\u65f6JSON\u6587\u4ef6\u5931\u8d25", (Throwable)e);
return;
}
Path finalTempJsonFile = tempJsonFile;
cmdLine.addArgument(tempJsonFile.toString());
ByteArrayOutputStream output = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler((OutputStream)output, (OutputStream)output);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler((ExecuteStreamHandler)streamHandler);
long ts = System.currentTimeMillis();
try {
executor.execute(cmdLine);
}
catch (IOException e) {
log.error("/mathtype2mathml/batch_converter.rb error, \n\u547d\u4ee4:{}, \n\u8f93\u51fa:{}", new Object[]{cmdLine, output, e});
}
finally {
try {
Files.deleteIfExists(finalTempJsonFile);
}
catch (IOException e) {
log.warn("\u5220\u9664JSON\u4e34\u65f6\u6587\u4ef6\u5931\u8d25: {}", (Object)finalTempJsonFile, (Object)e);
}
}
String fullOutput = output.toString();
log.info("/mathtype2mathml/batch_converter.rb end, \u6570\u91cf:{}, \u8017\u65f6:{}\u6beb\u79d2", (Object)m.size(), (Object)(System.currentTimeMillis() - ts));
String[] lines = fullOutput.split("\n");
String jbyOutput = Arrays.stream(lines).filter(f -> f.startsWith("JBY_RUBY_")).collect(Collectors.joining());
String result = jbyOutput.replace("JBY_RUBY_", "");
result = result.replace("display=\\\"block\\", "display=\\\"inline\\");
result = result.replace("~", "JBYSIMJBY");
JSONObject rootObj = JSON.parseObject((String)result);
JSONObject results = rootObj.getJSONObject("results");
HashMap<String, String> resultMap = new HashMap<String, String>();
for (String key : results.keySet()) {
JSONObject item = results.getJSONObject(key);
String mathml = item.getString("mathml");
resultMap.put(key, mathml);
}
formulaMap.putAll(resultMap);
});
}
catch (Exception e) {
log.error("MathType\u8f6cMathMl\u51fa\u73b0\u5f02\u5e38", (Throwable)e);
}
}
}

109
java-src/utils/NumPr.java Normal file
View File

@@ -0,0 +1,109 @@
/*
* Decompiled with CFR 0.152.
*/
package com.jby.officecore.utils;
import java.math.BigInteger;
public class NumPr {
private BigInteger start;
private BigInteger current;
private String numFmt;
private String lvlText;
public NumPr() {
}
public NumPr(BigInteger start, BigInteger current, String numFmt, String lvlText) {
this.start = start;
this.current = current;
this.numFmt = numFmt;
this.lvlText = lvlText;
}
public BigInteger getStart() {
return this.start;
}
public BigInteger getCurrent() {
return this.current;
}
public String getNumFmt() {
return this.numFmt;
}
public String getLvlText() {
return this.lvlText;
}
public void setStart(BigInteger start) {
this.start = start;
}
public void setCurrent(BigInteger current) {
this.current = current;
}
public void setNumFmt(String numFmt) {
this.numFmt = numFmt;
}
public void setLvlText(String lvlText) {
this.lvlText = lvlText;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof NumPr)) {
return false;
}
NumPr other = (NumPr)o;
if (!other.canEqual(this)) {
return false;
}
BigInteger this$start = this.getStart();
BigInteger other$start = other.getStart();
if (this$start == null ? other$start != null : !((Object)this$start).equals(other$start)) {
return false;
}
BigInteger this$current = this.getCurrent();
BigInteger other$current = other.getCurrent();
if (this$current == null ? other$current != null : !((Object)this$current).equals(other$current)) {
return false;
}
String this$numFmt = this.getNumFmt();
String other$numFmt = other.getNumFmt();
if (this$numFmt == null ? other$numFmt != null : !this$numFmt.equals(other$numFmt)) {
return false;
}
String this$lvlText = this.getLvlText();
String other$lvlText = other.getLvlText();
return !(this$lvlText == null ? other$lvlText != null : !this$lvlText.equals(other$lvlText));
}
protected boolean canEqual(Object other) {
return other instanceof NumPr;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
BigInteger $start = this.getStart();
result = result * 59 + ($start == null ? 43 : ((Object)$start).hashCode());
BigInteger $current = this.getCurrent();
result = result * 59 + ($current == null ? 43 : ((Object)$current).hashCode());
String $numFmt = this.getNumFmt();
result = result * 59 + ($numFmt == null ? 43 : $numFmt.hashCode());
String $lvlText = this.getLvlText();
result = result * 59 + ($lvlText == null ? 43 : $lvlText.hashCode());
return result;
}
public String toString() {
return "NumPr(start=" + this.getStart() + ", current=" + this.getCurrent() + ", numFmt=" + this.getNumFmt() + ", lvlText=" + this.getLvlText() + ")";
}
}

View File

@@ -0,0 +1,235 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* cn.hutool.core.io.FileUtil
* com.alibaba.fastjson.JSON
* com.alibaba.fastjson.JSONObject
* com.alibaba.fastjson.TypeReference
* com.jby.common.exceptions.BusinessException
* com.jby.common.util.FileUtil
* com.jby.common.util.HttpClientUtil
* com.jby.common.util.RequestHeaderUtil
* com.jby.oss.domain.param.OssParam
* com.jby.system.enums.AttachmentModuleEnum
* org.apache.poi.xwpf.usermodel.XWPFDocument
* org.slf4j.Logger
* org.slf4j.LoggerFactory
* org.springframework.beans.factory.annotation.Autowired
* org.springframework.stereotype.Component
* org.springframework.web.multipart.MultipartFile
*/
package com.jby.officecore.utils;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.jby.common.exceptions.BusinessException;
import com.jby.common.util.HttpClientUtil;
import com.jby.common.util.RequestHeaderUtil;
import com.jby.officecore.config.OfficeCoreConfig;
import com.jby.officecore.utils.OssServiceUtil;
import com.jby.oss.domain.param.OssParam;
import com.jby.system.enums.AttachmentModuleEnum;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class OfficeFileUtil {
private static final Logger log = LoggerFactory.getLogger(OfficeFileUtil.class);
private static OfficeCoreConfig officeCoreConfig;
@Autowired
public void setOfficeCoreConfig(OfficeCoreConfig officeCoreConfig) {
OfficeFileUtil.officeCoreConfig = officeCoreConfig;
}
public static File writeFile(String content, String savePath) {
FileWriter fw = null;
BufferedWriter bW = null;
try {
File file = com.jby.common.util.FileUtil.getFile((String)savePath);
fw = new FileWriter(file);
bW = new BufferedWriter(fw);
bW.write(content);
File file2 = file;
return file2;
}
catch (Exception e) {
log.error("\u5199\u5165\u6587\u4ef6\u5f02\u5e38, savePath:{}", (Object)savePath, (Object)e);
throw new BusinessException("\u5199\u5165\u6587\u4ef6\u5f02\u5e38");
}
finally {
if (bW != null) {
try {
bW.close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
if (fw != null) {
try {
fw.close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
}
}
public static File writeWord(XWPFDocument document, String savePath) {
OutputStream os = null;
try {
File file = com.jby.common.util.FileUtil.getFile((String)savePath);
os = Files.newOutputStream(file.toPath(), new OpenOption[0]);
document.write(os);
File file2 = file;
return file2;
}
catch (Exception e) {
log.error("\u751f\u6210word\u6587\u4ef6\u5f02\u5e38, savePath:{}", (Object)savePath, (Object)e);
throw new BusinessException("\u751f\u6210word\u6587\u4ef6\u5f02\u5e38\uff01");
}
finally {
if (Objects.nonNull(os)) {
try {
os.close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
if (Objects.nonNull(document)) {
try {
document.close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
}
}
public static File writeFile(MultipartFile file, String savePath) {
try {
return OfficeFileUtil.writeFile(file.getInputStream(), savePath);
}
catch (Exception e) {
log.error("\u5199\u5165\u6587\u4ef6\u5f02\u5e38, savePath:{}", (Object)savePath, (Object)e);
throw new BusinessException("\u5199\u5165\u6587\u4ef6\u5f02\u5e38");
}
}
public static File writeFile(InputStream is, String savePath) {
FileOutputStream os = null;
try {
int length;
File saveFile = com.jby.common.util.FileUtil.getFile((String)savePath);
os = new FileOutputStream(saveFile);
byte[] buffer = new byte[15360];
while ((length = is.read(buffer)) != -1) {
((OutputStream)os).write(buffer, 0, length);
}
os.flush();
File file = saveFile;
return file;
}
catch (Exception e) {
log.error("\u5199\u5165\u6587\u4ef6\u5f02\u5e38, savePath:{}", (Object)savePath, (Object)e);
throw new BusinessException("\u5199\u5165\u6587\u4ef6\u5f02\u5e38");
}
finally {
if (is != null) {
try {
is.close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
if (os != null) {
try {
((OutputStream)os).close();
}
catch (IOException e) {
log.error("close error", (Throwable)e);
}
}
}
}
/*
* WARNING - Removed try catching itself - possible behaviour change.
*/
public static String mf2svg(InputStream is, String imgPath) {
HashMap<String, Object> params = null;
String result = null;
try {
File localFile = com.jby.common.util.FileUtil.getFile((String)imgPath);
FileUtil.writeFromStream((InputStream)is, (File)localFile);
String accessUrl = OssServiceUtil.uploadFile(new OssParam().setModule(AttachmentModuleEnum.OFFICE_IMG.getModule()).setFile(com.jby.common.util.FileUtil.getMultipartFile((String)localFile.getName(), (File)localFile)));
params = new HashMap<String, Object>();
params.put("fileUrl", accessUrl);
params.put("refreshImg", false);
Map headers = RequestHeaderUtil.getAuthHeaders();
result = HttpClientUtil.doPost((String)officeCoreConfig.getMf2SvgApi(), params, (Map)headers);
JSONObject json = (JSONObject)HttpClientUtil.parseResult((String)result, (TypeReference)new TypeReference<JSONObject>(){});
String string = Objects.isNull(json) ? null : json.getString("svgUrl");
return string;
}
catch (Exception e) {
log.error("mf2svg exception, imgPath:{}, params:{}, result:{}", new Object[]{imgPath, JSON.toJSONString(params), result, e});
String string = null;
return string;
}
finally {
if (is != null) {
try {
is.close();
}
catch (IOException e) {
log.error("close error");
}
}
}
}
public static String mf2svg(InputStream is, String ossFolder, String imgName) {
HashMap<String, Object> params = null;
String result = null;
try {
String imgUrl = OssServiceUtil.uploadStream(new OssParam().setModule(AttachmentModuleEnum.OFFICE_IMG.getModule()).setFolder(ossFolder).setFileName(imgName).setInputStream(is));
params = new HashMap<String, Object>();
params.put("fileUrl", imgUrl);
params.put("refreshImg", false);
Map headers = RequestHeaderUtil.getAuthHeaders();
result = HttpClientUtil.doPost((String)officeCoreConfig.getMf2SvgApi(), params, (Map)headers);
JSONObject json = (JSONObject)HttpClientUtil.parseResult((String)result, (TypeReference)new TypeReference<JSONObject>(){});
return Objects.isNull(json) ? null : json.getString("svgUrl");
}
catch (Exception e) {
log.error("mf2svg exception, ossFolder:{}, imgName:{}, params:{}, result:{}", new Object[]{ossFolder, imgName, JSON.toJSONString(params), result, e});
return null;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.docx4j.TraversalUtil$CallbackImpl
* org.docx4j.openpackaging.packages.WordprocessingMLPackage
* org.docx4j.openpackaging.parts.Part
* org.docx4j.openpackaging.parts.relationships.RelationshipsPart
* org.docx4j.vml.officedrawing.CTOLEObject
*/
package com.jby.officecore.utils.finder;
import com.jby.officecore.domain.bo.ParseBO;
import java.util.List;
import java.util.Objects;
import org.docx4j.TraversalUtil;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
import org.docx4j.vml.officedrawing.CTOLEObject;
public class CtObjectFinder
extends TraversalUtil.CallbackImpl {
private final WordprocessingMLPackage wordMlPackage;
private final ParseBO parseBO;
public CtObjectFinder(WordprocessingMLPackage wordMlPackage, ParseBO parseBO) {
this.wordMlPackage = wordMlPackage;
this.parseBO = parseBO;
}
public List<Object> apply(Object o) {
if (o instanceof CTOLEObject) {
CTOLEObject ctoleObject = (CTOLEObject)o;
RelationshipsPart rsPart = this.wordMlPackage.getMainDocumentPart().getRelationshipsPart();
if (Objects.nonNull(ctoleObject.getId())) {
Part part = rsPart.getPart(ctoleObject.getId());
String binFilePath = part.getPartName().getURI().getPath();
String placeholder = this.parseBO.getMathTypePlaceholder(ctoleObject.getId());
this.parseBO.getMathTypeMap().put(placeholder, this.parseBO.getTempDir() + "/temp" + binFilePath);
}
}
return null;
}
}

View File

@@ -0,0 +1,121 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* javax.xml.bind.JAXBElement
* org.apache.commons.lang3.StringUtils
* org.docx4j.TextUtils
* org.docx4j.TraversalUtil$CallbackImpl
* org.docx4j.mce.AlternateContent
* org.docx4j.mce.AlternateContent$Fallback
* org.docx4j.openpackaging.packages.WordprocessingMLPackage
* org.docx4j.vml.CTGroup
* org.docx4j.vml.CTRoundRect
* org.docx4j.vml.CTShape
* org.docx4j.vml.CTTextbox
* org.docx4j.vml.VmlShapeElements
* org.docx4j.wml.CTTxbxContent
* org.docx4j.wml.ObjectFactory
* org.docx4j.wml.Pict
* org.docx4j.wml.R
* org.docx4j.wml.Text
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.jby.officecore.utils.finder;
import com.jby.officecore.domain.bo.ParseBO;
import java.util.List;
import javax.xml.bind.JAXBElement;
import org.apache.commons.lang3.StringUtils;
import org.docx4j.TextUtils;
import org.docx4j.TraversalUtil;
import org.docx4j.mce.AlternateContent;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.vml.CTGroup;
import org.docx4j.vml.CTRoundRect;
import org.docx4j.vml.CTShape;
import org.docx4j.vml.CTTextbox;
import org.docx4j.vml.VmlShapeElements;
import org.docx4j.wml.CTTxbxContent;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.Pict;
import org.docx4j.wml.R;
import org.docx4j.wml.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CtTextBoxFinder
extends TraversalUtil.CallbackImpl {
private static final Logger log = LoggerFactory.getLogger(CtTextBoxFinder.class);
private WordprocessingMLPackage wordMlPackage;
private ParseBO parseBO;
public CtTextBoxFinder(WordprocessingMLPackage wordMlPackage, ParseBO parseBO) {
this.wordMlPackage = wordMlPackage;
this.parseBO = parseBO;
}
public List<Object> apply(Object o) {
if (o instanceof Pict) {
boolean isFirstRun = true;
ObjectFactory factory = new ObjectFactory();
StringBuilder stringBuilder = new StringBuilder();
R sourceR = factory.createR();
Pict pict = (Pict)o;
List anyAndAny = pict.getAnyAndAny();
for (Object object : anyAndAny) {
if (!(object instanceof JAXBElement)) continue;
JAXBElement jbe = (JAXBElement)object;
this.findTextBox(jbe.getValue(), stringBuilder, isFirstRun, sourceR);
}
if (StringUtils.isNotBlank((CharSequence)stringBuilder.toString())) {
AlternateContent.Fallback fallback = (AlternateContent.Fallback)pict.getParent();
AlternateContent alternateContent = (AlternateContent)fallback.getParent();
R r = (R)alternateContent.getParent();
Text text = factory.createText();
text.setValue(stringBuilder + "JBY_TEXTBOX_JBY");
r.getContent().set(0, text);
r.setRPr(sourceR.getRPr());
}
}
return null;
}
private void findTextBox(Object object, StringBuilder sb, boolean isFirstRun, R sourceR) {
block8: {
List egShapeElements;
if (object instanceof CTShape || object instanceof CTRoundRect) {
VmlShapeElements vmlShapeElements = (VmlShapeElements)object;
egShapeElements = vmlShapeElements.getEGShapeElements();
for (JAXBElement egShapeElement : egShapeElements) {
if (!(egShapeElement.getValue() instanceof CTTextbox)) continue;
CTTextbox ctTextbox = (CTTextbox)egShapeElement.getValue();
CTTxbxContent txbxContent = ctTextbox.getTxbxContent();
for (int i = 0; i < txbxContent.getContent().size(); ++i) {
Object obj = txbxContent.getContent().get(i);
String text = TextUtils.getText(obj);
if (txbxContent.getContent().size() > 1 && i != txbxContent.getContent().size() - 1) {
text = text + "JBY_TEXTBOX_JBYBR";
}
sb.append(text);
}
}
}
if (!(object instanceof CTGroup)) break block8;
CTGroup ctGroup = (CTGroup)object;
egShapeElements = ctGroup.getEGShapeElements();
boolean isCtShape = egShapeElements.stream().anyMatch(f -> f.getValue() instanceof CTShape);
if (isCtShape) {
for (int i = egShapeElements.size() - 1; i >= 0; --i) {
this.findTextBox(((JAXBElement)egShapeElements.get(i)).getValue(), sb, isFirstRun, sourceR);
}
} else {
for (JAXBElement egShapeElement : egShapeElements) {
this.findTextBox(egShapeElement.getValue(), sb, isFirstRun, sourceR);
}
}
}
}
}

View File

@@ -0,0 +1,427 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* javax.xml.bind.JAXBElement
* org.apache.commons.collections4.CollectionUtils
* org.apache.commons.lang3.StringUtils
* org.docx4j.TraversalUtil$CallbackImpl
* org.docx4j.XmlUtils
* org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTTextboxInfo
* org.docx4j.math.CTOMath
* org.docx4j.math.CTOMathPara
* org.docx4j.wml.CTTxbxContent
* org.docx4j.wml.CTVerticalAlignRun
* org.docx4j.wml.FldChar
* org.docx4j.wml.ObjectFactory
* org.docx4j.wml.P
* org.docx4j.wml.PPr
* org.docx4j.wml.PPrBase$NumPr
* org.docx4j.wml.PPrBase$NumPr$Ilvl
* org.docx4j.wml.R
* org.docx4j.wml.RPrAbstract
* org.docx4j.wml.STFldCharType
* org.docx4j.wml.Style
* org.docx4j.wml.Text
* org.docx4j.wml.U
* org.docx4j.wml.UnderlineEnumeration
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.jby.officecore.utils.finder;
import com.jby.officecore.domain.bo.ParseBO;
import com.jby.officecore.utils.EqToLatexUtil;
import com.jby.officecore.utils.NumPr;
import com.jby.officecore.utils.WordParseUtil;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.bind.JAXBElement;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.docx4j.TraversalUtil;
import org.docx4j.XmlUtils;
import org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTTextboxInfo;
import org.docx4j.math.CTOMath;
import org.docx4j.math.CTOMathPara;
import org.docx4j.wml.CTTxbxContent;
import org.docx4j.wml.CTVerticalAlignRun;
import org.docx4j.wml.FldChar;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.PPrBase;
import org.docx4j.wml.R;
import org.docx4j.wml.RPrAbstract;
import org.docx4j.wml.STFldCharType;
import org.docx4j.wml.Style;
import org.docx4j.wml.Text;
import org.docx4j.wml.U;
import org.docx4j.wml.UnderlineEnumeration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CtoMathFinder
extends TraversalUtil.CallbackImpl {
private static final Logger log = LoggerFactory.getLogger(CtoMathFinder.class);
private ParseBO parseBO;
private static final Pattern CIRCLED_NUMBER_PATTERN = Pattern.compile("^\\s*eq\\s*\\\\o\\((?:\u25cb,\\\\s\\\\up\\d+\\((\\d+)\\)|\\\\s\\\\up\\d+\\((\\d+)\\),\u25cb)\\)");
public CtoMathFinder(ParseBO parseBO) {
this.parseBO = parseBO;
}
public List<Object> apply(Object o) {
if (o instanceof P) {
Text text;
Style style;
CTTxbxContent ctTxbxContent;
StringBuilder eqCode = new StringBuilder();
StringBuilder originEqCode = new StringBuilder();
boolean inFiled = false;
boolean isEq = false;
boolean superScriptFlag = false;
boolean subScriptFlag = false;
ArrayList<Integer> fieldRunIndexs = new ArrayList<Integer>();
P paragraph = (P)o;
ObjectFactory factory = new ObjectFactory();
boolean isNumPr = true;
if (paragraph.getParent() instanceof CTTxbxContent && (ctTxbxContent = (CTTxbxContent)paragraph.getParent()).getParent() instanceof CTTextboxInfo) {
isNumPr = false;
}
PPr pPr = paragraph.getPPr();
PPrBase.NumPr numPr = null;
if (Objects.nonNull(pPr)) {
numPr = pPr.getNumPr();
}
if (Objects.isNull(numPr) && Objects.nonNull(pPr) && Objects.nonNull(pPr.getPStyle()) && Objects.nonNull(style = this.parseBO.getStyleDefinitionsPart().getStyleById(pPr.getPStyle().getVal())) && Objects.nonNull(style.getPPr()) && Objects.nonNull(style.getPPr().getNumPr()) && Objects.isNull((numPr = style.getPPr().getNumPr()).getIlvl())) {
PPrBase.NumPr.Ilvl ilvl = new PPrBase.NumPr.Ilvl();
ilvl.setVal(BigInteger.ZERO);
numPr.setIlvl(ilvl);
}
if (isNumPr && Objects.nonNull(numPr) && Objects.nonNull(numPr.getNumId()) && Objects.nonNull(numPr.getIlvl())) {
String numPrKey = numPr.getNumId().getVal() + "_" + numPr.getIlvl().getVal();
Map<String, NumPr> numberingDefinitionsMap = this.parseBO.getNumberingDefinitionsMap();
if (numberingDefinitionsMap.containsKey(numPrKey)) {
NumPr currentNumPr = numberingDefinitionsMap.get(numPrKey);
String lvlText = currentNumPr.getLvlText();
for (int i = 0; i <= numPr.getIlvl().getVal().intValue(); ++i) {
NumPr numPrDefine;
if (i == numPr.getIlvl().getVal().intValue()) {
currentNumPr.setCurrent(currentNumPr.getCurrent().add(BigInteger.ONE));
}
String rep = String.valueOf((numPrDefine = numberingDefinitionsMap.get(numPr.getNumId().getVal() + "_" + i)).getCurrent().compareTo(BigInteger.ZERO) == 0 ? numPrDefine.getStart() : numPrDefine.getCurrent());
if (i == numPr.getIlvl().getVal().intValue()) {
switch (currentNumPr.getNumFmt()) {
case "UPPER_ROMAN": {
rep = this.strToUpperRoman(rep);
break;
}
case "DECIMAL_ZERO": {
rep = CtoMathFinder.strToDecimalZero(rep);
break;
}
case "LOWER_LETTER": {
rep = CtoMathFinder.strToLowerLetter(rep);
break;
}
case "UPPER_LETTER": {
rep = CtoMathFinder.strToLowerLetter(rep).toUpperCase();
break;
}
case "LOWER_ROMAN": {
rep = this.strToUpperRoman(rep).toLowerCase();
break;
}
case "CHINESE_COUNTING":
case "CHINESE_COUNTING_THOUSAND": {
rep = this.strToChineseCounting(rep);
break;
}
}
}
lvlText = lvlText.replace("%" + (i + 1), rep);
}
if (StringUtils.isNotBlank((CharSequence)lvlText)) {
R run = factory.createR();
text = factory.createText();
text.setValue(lvlText + " ");
run.getContent().add(text);
paragraph.getContent().add(0, run);
}
}
}
for (int i = 0; i < paragraph.getContent().size(); ++i) {
JAXBElement jaxbElement;
Object content = paragraph.getContent().get(i);
if (content instanceof JAXBElement && ((jaxbElement = (JAXBElement)content).getValue() instanceof CTOMath || jaxbElement.getValue() instanceof CTOMathPara)) {
String placeholder = "";
if (Boolean.TRUE.equals(this.parseBO.getNewParseVersion())) {
String omml = XmlUtils.marshaltoString((Object)jaxbElement);
placeholder = this.parseBO.getOpenOfficeXmlPlaceholder();
this.parseBO.getOpenOfficeXmlMap().put(placeholder, omml);
} else {
String mathMl = WordParseUtil.getMathMl(jaxbElement, this.parseBO.getTransformer());
placeholder = this.parseBO.getOpenOfficeXmlPlaceholder();
this.parseBO.getOpenOfficeXmlMap().put(placeholder, mathMl);
}
R run = factory.createR();
text = factory.createText();
text.setValue(placeholder);
run.getContent().add(text);
paragraph.getContent().set(i, run);
}
if (!(content instanceof R)) continue;
R run = (R)content;
for (int j = 0; j < run.getContent().size(); ++j) {
Object runC = run.getContent().get(j);
if (!(runC instanceof JAXBElement)) continue;
JAXBElement runCj = (JAXBElement)runC;
if (runCj.getValue() instanceof FldChar) {
FldChar fldChar = (FldChar)runCj.getValue();
if (fldChar.getFldCharType().equals((Object)STFldCharType.BEGIN)) {
eqCode = new StringBuilder();
originEqCode = new StringBuilder();
inFiled = true;
isEq = false;
superScriptFlag = false;
subScriptFlag = false;
fieldRunIndexs = new ArrayList();
fieldRunIndexs.add(i);
continue;
}
if (inFiled && fldChar.getFldCharType().equals((Object)STFldCharType.END)) {
if (isEq) {
String placeholder;
Matcher matcher = CIRCLED_NUMBER_PATTERN.matcher(originEqCode);
if (matcher.matches()) {
String numStr = matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
placeholder = this.parseBO.getEqLatexPlaceholder() + "JBYEQNUM";
this.parseBO.getEqLatexMap().put(placeholder, CtoMathFinder.getCircledNumber(numStr));
R runN = factory.createR();
Text text2 = factory.createText();
text2.setValue(placeholder);
runN.getContent().add(text2);
paragraph.getContent().set(i, runN);
} else if (StringUtils.isNotBlank((CharSequence)eqCode.toString())) {
String latex = EqToLatexUtil.convert(eqCode.toString());
latex = latex.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
placeholder = this.parseBO.getEqLatexPlaceholder();
this.parseBO.getEqLatexMap().put(placeholder, latex);
R runN = factory.createR();
Text text3 = factory.createText();
text3.setValue(placeholder);
runN.getContent().add(text3);
paragraph.getContent().set(i, runN);
}
}
inFiled = false;
isEq = false;
fieldRunIndexs.clear();
continue;
}
if (inFiled && isEq && !fldChar.getFldCharType().value().equals("separate")) continue;
}
if (!inFiled || !(runCj.getValue() instanceof Text)) continue;
CTVerticalAlignRun vertAlign = Optional.ofNullable(run.getRPr()).map(RPrAbstract::getVertAlign).orElse(null);
String value = ((Text)runCj.getValue()).getValue();
originEqCode.append(value);
U u = Optional.ofNullable(run.getRPr()).filter(f -> Objects.nonNull(f.getU()) && !UnderlineEnumeration.NONE.equals((Object)f.getU().getVal()) && Objects.nonNull(f.getU().getVal())).map(RPrAbstract::getU).orElse(null);
if (StringUtils.isBlank((CharSequence)value) && Objects.nonNull(u)) {
value = value.replace("\u3000", "JBYU1JBYU").replace(" ", "JBYU1JBYU");
} else if (StringUtils.isNotBlank((CharSequence)value) && Objects.nonNull(u)) {
value = "JBYU2BEGIN" + value + "JBYU2END";
} else if (StringUtils.isBlank((CharSequence)value)) {
// empty if block
}
String trimmedOrigin = CtoMathFinder.extractEqPrefix(originEqCode);
if (trimmedOrigin.startsWith("eq")) {
isEq = true;
}
if (isEq) {
if (CollectionUtils.isNotEmpty(fieldRunIndexs)) {
fieldRunIndexs.forEach(m -> paragraph.getContent().set((int)m, factory.createR()));
fieldRunIndexs.clear();
}
if (Objects.nonNull(vertAlign)) {
String newContent;
String tmp;
if ("superscript".equalsIgnoreCase(vertAlign.getVal().toString())) {
int end;
int start;
if (superScriptFlag && (start = eqCode.lastIndexOf("\\s\\up4(")) != -1 && (end = eqCode.toString().indexOf(41, start)) != -1) {
tmp = eqCode.substring(start + 7, end);
newContent = tmp + value;
eqCode = new StringBuilder(eqCode.substring(0, start));
eqCode.append("\\s\\up4(").append(newContent).append(")");
value = "";
}
if (StringUtils.isNotBlank((CharSequence)value)) {
value = "\\s\\up4(" + value + ")";
}
superScriptFlag = true;
subScriptFlag = false;
} else if ("subscript".equalsIgnoreCase(vertAlign.getVal().toString())) {
int end;
int start;
if (subScriptFlag && (start = eqCode.lastIndexOf("\\s\\do4(")) != -1 && (end = eqCode.toString().indexOf(41, start)) != -1) {
tmp = eqCode.substring(start + 7, end);
newContent = tmp + value;
eqCode = new StringBuilder(eqCode.substring(0, start));
eqCode.append("\\s\\do4(").append(newContent).append(")");
value = "";
}
if (StringUtils.isNotBlank((CharSequence)value)) {
value = "\\s\\do4(" + value + ")";
}
subScriptFlag = true;
superScriptFlag = false;
} else {
superScriptFlag = false;
subScriptFlag = false;
}
} else {
superScriptFlag = false;
subScriptFlag = false;
}
eqCode.append(value);
paragraph.getContent().set(i, factory.createR());
continue;
}
if (trimmedOrigin.length() < 2 || "eq".startsWith(trimmedOrigin)) {
eqCode.append(value);
fieldRunIndexs.add(i);
continue;
}
inFiled = false;
fieldRunIndexs.clear();
}
}
}
return null;
}
private String strToUpperRoman(String str) {
int num = Integer.parseInt(str);
if (num < 1 || num > 3999) {
return "I";
}
int[] values = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] symbols = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder roman = new StringBuilder();
for (int i = 0; i < values.length; ++i) {
while (num >= values[i]) {
roman.append(symbols[i]);
num -= values[i];
}
}
return roman.toString();
}
private static String strToDecimalZero(String str) {
if (str.length() == 1) {
return "0" + str;
}
return str;
}
private static String strToLowerLetter(String str) {
int n = Integer.parseInt(str);
int length = (n - 1) / 26 + 1;
char baseChar = (char)(97 + (n - 1) % 26);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; ++i) {
sb.append(baseChar);
}
return sb.toString();
}
public String strToChineseCounting(String str) {
String s;
int num = Integer.parseInt(str);
if (num < 0 || num >= 1000000000) {
throw new IllegalArgumentException("\u4ec5\u652f\u6301 0 \u5230 999,999,999");
}
if (num == 0) {
return "\u3007";
}
char[] digits = new char[]{'\u3007', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d'};
String[] units = new String[]{"", "\u5341", "\u767e", "\u5343"};
String[] bigUnits = new String[]{"", "\u4e07", "\u4ebf"};
StringBuilder result = new StringBuilder();
int yi = num / 100000000;
int wan = num / 10000 % 10000;
int ge = num % 10000;
if (yi > 0) {
result.append(CtoMathFinder.convertSegment(yi, digits, units)).append(bigUnits[2]);
if (wan == 0 && ge > 0) {
result.append('\u3007');
}
}
if (wan > 0) {
result.append(CtoMathFinder.convertSegment(wan, digits, units)).append(bigUnits[1]);
if (ge > 0 && ge < 1000) {
result.append('\u3007');
}
}
if (ge > 0) {
result.append(CtoMathFinder.convertSegment(ge, digits, units));
}
if ((s = result.toString()).startsWith("\u4e00\u5341")) {
s = s.substring(1);
}
return s;
}
private static String convertSegment(int n, char[] digits, String[] units) {
if (n == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; ++i) {
int power = 3 - i;
int base = (int)Math.pow(10.0, power);
int digit = n / base % 10;
if (digit != 0) {
sb.append(digits[digit]).append(units[power]);
continue;
}
if (sb.length() <= 0 || n % base == 0 || power <= 0) continue;
sb.append('\u3007');
}
return sb.toString();
}
private static String getCircledNumber(String num) {
int n = Integer.parseInt(num);
if (n >= 1 && n <= 20) {
return String.valueOf((char)(9312 + n - 1));
}
if (n >= 21 && n <= 35) {
return String.valueOf((char)(12881 + n - 21));
}
if (n >= 36 && n <= 40) {
return String.valueOf((char)(12977 + n - 36));
}
if (n >= 41 && n <= 50) {
return String.valueOf((char)(12982 + n - 41));
}
log.info("\u83b7\u53d6\u5e26\u5708\u5b57\u7b26\u5931\u8d25 {}", (Object)num);
return "";
}
private static String extractEqPrefix(StringBuilder originEqCode) {
int i;
String s = originEqCode.toString().trim();
for (i = 0; i < s.length() && s.charAt(i) == '{'; ++i) {
}
return s.substring(i).trim().toLowerCase();
}
}

View File

@@ -0,0 +1,434 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.alibaba.excel.util.StringUtils
* com.jby.common.util.UniqueUtil
* javax.xml.bind.JAXBElement
* org.apache.commons.collections4.CollectionUtils
* org.docx4j.TraversalUtil$CallbackImpl
* org.docx4j.dml.GraphicData
* org.docx4j.dml.picture.Pic
* org.docx4j.dml.wordprocessingDrawing.Anchor
* org.docx4j.dml.wordprocessingDrawing.Inline
* org.docx4j.openpackaging.packages.WordprocessingMLPackage
* org.docx4j.openpackaging.parts.Part
* org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage
* org.docx4j.openpackaging.parts.relationships.RelationshipsPart
* org.docx4j.vml.CTImageData
* org.docx4j.vml.CTShape
* org.docx4j.vml.officedrawing.CTOLEObject
* org.docx4j.wml.CTObject
* org.docx4j.wml.Drawing
* org.docx4j.wml.ObjectFactory
* org.docx4j.wml.Pict
* org.docx4j.wml.R
* org.docx4j.wml.Text
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.jby.officecore.utils.finder;
import com.alibaba.excel.util.StringUtils;
import com.jby.common.util.UniqueUtil;
import com.jby.officecore.domain.bo.ImageBO;
import com.jby.officecore.domain.bo.ParseBO;
import com.jby.officecore.enums.AttrEnum;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.xml.bind.JAXBElement;
import org.apache.commons.collections4.CollectionUtils;
import org.docx4j.TraversalUtil;
import org.docx4j.dml.GraphicData;
import org.docx4j.dml.picture.Pic;
import org.docx4j.dml.wordprocessingDrawing.Anchor;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
import org.docx4j.vml.CTImageData;
import org.docx4j.vml.CTShape;
import org.docx4j.vml.officedrawing.CTOLEObject;
import org.docx4j.wml.CTObject;
import org.docx4j.wml.Drawing;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.Pict;
import org.docx4j.wml.R;
import org.docx4j.wml.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DrawingPictFinder
extends TraversalUtil.CallbackImpl {
private static final Logger log = LoggerFactory.getLogger(DrawingPictFinder.class);
private final WordprocessingMLPackage wordMlPackage;
private final ParseBO parseBO;
private static final double CROP_SCALE = 1.52587890625;
public DrawingPictFinder(WordprocessingMLPackage wordMlPackage, ParseBO parseBO) {
this.wordMlPackage = wordMlPackage;
this.parseBO = parseBO;
}
public List<Object> apply(Object o) {
List contentList;
List anyAndAny;
R r;
if (o instanceof Drawing && ((Drawing)o).getParent() instanceof R) {
RelationshipsPart relationshipsPart = this.wordMlPackage.getMainDocumentPart().getRelationshipsPart();
Drawing drawing = (Drawing)o;
List anchorOrInline = drawing.getAnchorOrInline();
if (CollectionUtils.isNotEmpty((Collection)anchorOrInline)) {
Object anchorOrInlineObj = anchorOrInline.get(0);
GraphicData graphicData = null;
long cx = 0L;
long cy = 0L;
if (anchorOrInlineObj instanceof Inline) {
Inline inline = (Inline)anchorOrInlineObj;
graphicData = inline.getGraphic().getGraphicData();
cx = inline.getExtent().getCx();
cy = inline.getExtent().getCy();
} else if (anchorOrInlineObj instanceof Anchor) {
Anchor anchor = (Anchor)anchorOrInlineObj;
graphicData = anchor.getGraphic().getGraphicData();
cx = anchor.getExtent().getCx();
cy = anchor.getExtent().getCy();
}
if (Objects.nonNull(graphicData) && "http://schemas.openxmlformats.org/drawingml/2006/picture".equals(graphicData.getUri())) {
for (Object object : graphicData.getAny()) {
String path;
JAXBElement jaxbElement;
if (!(object instanceof JAXBElement) || !((jaxbElement = (JAXBElement)object).getValue() instanceof Pic)) continue;
Pic pic = (Pic)jaxbElement.getValue();
String imageDataId = null;
int cropLeft = 0;
int cropTop = 0;
int cropRight = 0;
int cropBottom = 0;
int rotation = 0;
if (Objects.nonNull(pic.getBlipFill())) {
if (Objects.nonNull(pic.getBlipFill().getBlip())) {
imageDataId = pic.getBlipFill().getBlip().getEmbed();
}
if (Objects.nonNull(pic.getBlipFill().getSrcRect())) {
cropLeft = pic.getBlipFill().getSrcRect().getL();
cropTop = pic.getBlipFill().getSrcRect().getT();
cropRight = pic.getBlipFill().getSrcRect().getR();
cropBottom = pic.getBlipFill().getSrcRect().getB();
}
if (Objects.nonNull(pic.getSpPr()) && Objects.nonNull(pic.getSpPr().getXfrm())) {
rotation = pic.getSpPr().getXfrm().getRot();
}
}
Map<String, Object> map = this.dealCropRotate(imageDataId, cx, cropLeft, cropTop, cropRight, cropBottom, rotation);
Object widthObj = map.get(AttrEnum.WIDTH.getAttr());
Object heightObj = map.get(AttrEnum.HEIGHT.getAttr());
Object pathObj = map.get("imagePath");
double width = Objects.nonNull(widthObj) ? Double.parseDouble(widthObj.toString()) : (double)Math.round((double)cx / 9525.0);
double height = Objects.nonNull(heightObj) ? Double.parseDouble(heightObj.toString()) : (double)Math.round((double)cy / 9525.0);
Part part = relationshipsPart.getPart(imageDataId);
if (Objects.nonNull(pathObj)) {
path = String.valueOf(pathObj);
} else if (Objects.nonNull(part)) {
path = part.getPartName().getURI().getPath();
} else {
log.warn("\u65e0\u6cd5\u83b7\u53d6\u56fe\u7247Part\uff0cimageDataId={}", (Object)imageDataId);
continue;
}
String imagePlaceholder = this.parseBO.getImagePlaceholder(imageDataId);
ImageBO imageBO = new ImageBO().setWidth(width).setHeight(height).setPictureUrl(path);
this.parseBO.getImageMap().put(imagePlaceholder, imageBO);
R r2 = (R)drawing.getParent();
List contentList2 = r2.getContent();
int drawingIndex = contentList2.indexOf(drawing);
if (drawingIndex != -1) {
Text text = new ObjectFactory().createText();
text.setValue(imagePlaceholder);
contentList2.set(drawingIndex, text);
continue;
}
log.warn("\u672a\u627e\u5230drawing\u5bf9\u8c61\u5728\u7236\u5143\u7d20\u4e2d\u7684\u7d22\u5f15\uff0c\u8df3\u8fc7\u66ff\u6362\u64cd\u4f5c");
}
}
}
}
if (o instanceof Pict && ((Pict)o).getParent() instanceof R) {
Pict pict = (Pict)o;
r = (R)pict.getParent();
anyAndAny = pict.getAnyAndAny();
contentList = r.getContent();
int pictIndex = contentList.indexOf(pict);
if (pictIndex != -1) {
this.dealCtShape(anyAndAny, r, pictIndex);
}
}
if (o instanceof CTObject && ((CTObject)o).getParent() instanceof R) {
CTObject ctObject = (CTObject)o;
r = (R)ctObject.getParent();
anyAndAny = ctObject.getAnyAndAny();
contentList = r.getContent();
int ctObjectIndex = contentList.indexOf(ctObject);
if (ctObjectIndex != -1) {
this.dealCtShape(anyAndAny, r, ctObjectIndex);
}
}
return null;
}
private String extractValue(String style, String property) {
if (style == null || property == null) {
return null;
}
String regex = "\\b" + Pattern.quote(property) + "\\s*:\\s*([\\d.]+[a-zA-Z]*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(style);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
private void dealCtShape(List<Object> anyAndAny, R r, int pictIndex) {
String ctOleObjectRid = anyAndAny.stream().filter(f -> f instanceof JAXBElement && ((JAXBElement)f).getValue() instanceof CTOLEObject).map(f -> ((CTOLEObject)((JAXBElement)f).getValue()).getId()).filter(Objects::nonNull).findFirst().orElse(null);
if (Objects.nonNull(ctOleObjectRid) && Objects.nonNull(this.parseBO.getMathTypeMap().get(this.parseBO.getMathTypePlaceholder(ctOleObjectRid)))) {
Text text = new ObjectFactory().createText();
text.setValue(this.parseBO.getMathTypePlaceholder(ctOleObjectRid));
r.getContent().set(pictIndex, text);
} else if (Objects.isNull(ctOleObjectRid) || Objects.isNull(this.parseBO.getMathTypeMap().get(this.parseBO.getMathTypePlaceholder(ctOleObjectRid)))) {
if (Objects.nonNull(ctOleObjectRid)) {
this.parseBO.getMathTypeMap().remove(this.parseBO.getMathTypePlaceholder(ctOleObjectRid));
}
for (Object object : anyAndAny) {
String path;
double heightPx;
double widthPx;
if (!(object instanceof JAXBElement) || !(((JAXBElement)object).getValue() instanceof CTShape)) continue;
CTShape ctShape = (CTShape)((JAXBElement)object).getValue();
String width = this.extractValue(ctShape.getStyle(), "width");
String height = this.extractValue(ctShape.getStyle(), "height");
CTImageData ctImageData = ctShape.getEGShapeElements().stream().filter(f -> f.getValue() instanceof CTImageData).map(m -> (CTImageData)m.getValue()).findFirst().orElse(null);
if (!Objects.nonNull(ctImageData) || !StringUtils.isNotBlank((CharSequence)width) || !StringUtils.isNotBlank((CharSequence)height)) continue;
String ctImageDataId = ctImageData.getId();
long cx = 0L;
try {
double widthPtIn = Double.parseDouble(width.substring(0, width.length() - 2));
if (width.endsWith("pt")) {
cx = Math.round(widthPtIn * 12700.0);
} else if (width.endsWith("in")) {
cx = Math.round(widthPtIn * 914400.0);
}
}
catch (NumberFormatException ignored) {
log.error("extractWidth error");
}
int cropLeft = this.parseVmlCrop(ctImageData.getCropleft());
int cropTop = this.parseVmlCrop(ctImageData.getCroptop());
int cropRight = this.parseVmlCrop(ctImageData.getCropright());
int cropBottom = this.parseVmlCrop(ctImageData.getCropbottom());
String rotRaw = this.extractValue(ctShape.getStyle(), "rotation");
int rotation = rotRaw == null ? 0 : (int)Math.round((double)Long.parseLong(rotRaw.replaceAll("[^\\d-]", "")) * 0.91552734375);
Map<String, Object> map = this.dealCropRotate(ctImageDataId, cx, cropLeft, cropTop, cropRight, cropBottom, rotation);
Object widthObj = map.get(AttrEnum.WIDTH.getAttr());
Object heightObj = map.get(AttrEnum.HEIGHT.getAttr());
Object pathObj = map.get("imagePath");
if (Objects.nonNull(widthObj) && Objects.nonNull(heightObj)) {
widthPx = (Double)map.get(AttrEnum.WIDTH.getAttr());
heightPx = (Double)map.get(AttrEnum.HEIGHT.getAttr());
} else {
widthPx = Double.parseDouble(width.replaceAll("pt|in", ""));
if (width.endsWith("pt")) {
widthPx = Math.round(widthPx * 96.0 / 72.0);
} else if (width.endsWith("in")) {
widthPx = Math.round(widthPx * 96.0);
}
heightPx = Double.parseDouble(height.replaceAll("pt|in", ""));
if (height.endsWith("pt")) {
heightPx = heightPx * 96.0 / 72.0;
} else if (height.endsWith("in")) {
heightPx *= 96.0;
}
}
RelationshipsPart relationshipsPart = this.wordMlPackage.getMainDocumentPart().getRelationshipsPart();
Part part = relationshipsPart.getPart(ctImageDataId);
if (Objects.nonNull(pathObj)) {
path = String.valueOf(pathObj);
} else if (Objects.nonNull(part)) {
path = part.getPartName().getURI().getPath();
} else {
log.warn("\u65e0\u6cd5\u83b7\u53d6\u8001\u7248VML\u56fe\u7247Part\uff0cctImageDataId={}", (Object)ctImageDataId);
continue;
}
ImageBO imageBO = new ImageBO().setWidth(widthPx).setHeight(heightPx).setPictureUrl(path);
String imagePlaceholder = this.parseBO.getImagePlaceholder(ctImageDataId);
this.parseBO.getImageMap().put(imagePlaceholder, imageBO);
Text text = new ObjectFactory().createText();
text.setValue(imagePlaceholder);
r.getContent().set(pictIndex, text);
break;
}
}
}
private Map<String, Object> dealCropRotate(String imageDataId, long cx, int cropLeft, int cropTop, int cropRight, int cropBottom, int rotation) {
HashMap<String, Object> result = new HashMap<String, Object>();
try {
if (Objects.nonNull(imageDataId)) {
boolean isRotate;
boolean isCrop = cropLeft > 0 || cropTop > 0 || cropRight > 0 || cropBottom > 0;
boolean bl = isRotate = rotation != 0;
if (isCrop || isRotate) {
RelationshipsPart relationshipsPart = this.wordMlPackage.getMainDocumentPart().getRelationshipsPart();
Part part = relationshipsPart.getPart(imageDataId);
BinaryPartAbstractImage imagePart = (BinaryPartAbstractImage)part;
BufferedImage targetImage = ImageIO.read(new ByteArrayInputStream(imagePart.getBytes()));
if (isCrop) {
targetImage = this.cropImage(targetImage, cropLeft, cropTop, cropRight, cropBottom);
}
if (isRotate) {
targetImage = this.rotateImage(targetImage, rotation, cx, result);
}
if (Objects.nonNull(targetImage)) {
String formatName = this.getFormatName(imagePart);
String path = "/word/media/" + UniqueUtil.getUuid() + "." + formatName;
ImageIO.write((RenderedImage)targetImage, formatName, new File(this.parseBO.getTempDir() + "/temp" + path));
result.put("imagePath", path);
}
}
}
}
catch (Exception e) {
log.error("\u5904\u7406\u56fe\u7247\u88c1\u526a\u4e0e\u65cb\u8f6c\u5f02\u5e38", (Throwable)e);
}
return result;
}
private String getFormatName(BinaryPartAbstractImage imagePart) {
String contentType = imagePart.getContentType();
String formatName = contentType.contains("png") ? "png" : (contentType.contains("jpeg") ? "jpeg" : (contentType.contains("gif") ? "gif" : (contentType.contains("bmp") ? "bmp" : "png")));
return formatName;
}
public BufferedImage cropImage(BufferedImage originalImage, int srcRectL, int srcRectT, int srcRectR, int srcRectB) {
double leftRatio = srcRectL < 0 ? 0.0 : (double)srcRectL / 100000.0;
double topRatio = srcRectT < 0 ? 0.0 : (double)srcRectT / 100000.0;
double rightRatio = srcRectR < 0 ? 0.0 : (double)srcRectR / 100000.0;
double bottomRatio = srcRectB < 0 ? 0.0 : (double)srcRectB / 100000.0;
int originalWidth = originalImage.getWidth();
int originalHeight = originalImage.getHeight();
int left = (int)Math.floor(leftRatio * (double)originalWidth);
int top = (int)Math.floor(topRatio * (double)originalHeight);
int right = (int)Math.floor(rightRatio * (double)originalWidth);
int bottom = (int)Math.floor(bottomRatio * (double)originalHeight);
int cropWidth = Math.max(1, originalWidth - left - right);
int cropHeight = Math.max(1, originalHeight - top - bottom);
if (left < 0 || top < 0 || left + cropWidth > originalWidth || top + cropHeight > originalHeight) {
log.error("\u88c1\u526a\u533a\u57df\u65e0\u6548\u6216\u8d85\u51fa\u56fe\u7247\u8fb9\u754c");
}
return originalImage.getSubimage(left, top, cropWidth, cropHeight);
}
private BufferedImage rotateImage(BufferedImage originalImage, long rotation, long currentCx, Map<String, Object> result) {
int origWidth = originalImage.getWidth();
int origHeight = originalImage.getHeight();
if (origWidth <= 0 || origHeight <= 0) {
log.error("\u56fe\u7247\u533a\u57df\u65e0\u6548");
}
double emuPerPx = (double)currentCx / (double)origWidth;
if (currentCx == 0L) {
emuPerPx = 9525.0;
}
double degrees = (double)rotation / 60000.0;
double radians = Math.toRadians(degrees);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
double TOLERANCE = 1.0E-10;
if (sin < 1.0E-10) {
sin = 0.0;
}
if (cos < 1.0E-10) {
cos = 0.0;
}
int newWidth = (int)Math.ceil((double)origWidth * cos + (double)origHeight * sin);
int newHeight = (int)Math.ceil((double)origWidth * sin + (double)origHeight * cos);
newWidth = Math.max(1, newWidth);
newHeight = Math.max(1, newHeight);
int superSampleFactor = 4;
int ssWidth = origWidth * superSampleFactor;
int ssHeight = origHeight * superSampleFactor;
int ssNewW = newWidth * superSampleFactor;
int ssNewH = newHeight * superSampleFactor;
int imgType1 = originalImage.getType() == 0 ? 2 : originalImage.getType();
BufferedImage highResOriginal = new BufferedImage(ssWidth, ssHeight, imgType1);
Graphics2D g2dHighRes = highResOriginal.createGraphics();
this.configureGraphics2D(g2dHighRes);
g2dHighRes.drawImage(originalImage, 0, 0, ssWidth, ssHeight, null);
g2dHighRes.dispose();
int imgType2 = highResOriginal.getType() == 0 ? 2 : highResOriginal.getType();
BufferedImage rotatedSuperSample = new BufferedImage(ssNewW, ssNewH, imgType2);
Graphics2D g2dRotated = rotatedSuperSample.createGraphics();
if (highResOriginal.getType() == 2) {
g2dRotated.setComposite(AlphaComposite.Clear);
g2dRotated.fillRect(0, 0, ssNewW, ssNewH);
g2dRotated.setComposite(AlphaComposite.SrcOver);
} else {
g2dRotated.setColor(Color.WHITE);
g2dRotated.fillRect(0, 0, ssNewW, ssNewH);
}
g2dRotated.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2dRotated.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2dRotated.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2dRotated.translate((double)ssNewW / 2.0, (double)ssNewH / 2.0);
g2dRotated.rotate(radians);
g2dRotated.drawImage((Image)highResOriginal, -ssWidth / 2, -ssHeight / 2, null);
g2dRotated.dispose();
BufferedImage rotatedImage = new BufferedImage(newWidth, newHeight, rotatedSuperSample.getType() == 0 ? 2 : rotatedSuperSample.getType());
Graphics2D g2dFinal = rotatedImage.createGraphics();
this.configureGraphics2D(g2dFinal);
g2dFinal.drawImage(rotatedSuperSample, 0, 0, newWidth, newHeight, null);
g2dFinal.dispose();
long newCx = Math.round((double)newWidth * emuPerPx);
long newCy = Math.round((double)newHeight * emuPerPx);
double newWidthPx = Math.round((double)newCx / 9525.0);
double newHeightPx = Math.round((double)newCy / 9525.0);
result.put(AttrEnum.WIDTH.getAttr(), newWidthPx);
result.put(AttrEnum.HEIGHT.getAttr(), newHeightPx);
return rotatedImage;
}
private void configureGraphics2D(Graphics2D g2d) {
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
private int parseVmlCrop(String vmlCrop) {
if (vmlCrop == null || StringUtils.isBlank((CharSequence)vmlCrop)) {
return 0;
}
String clean = vmlCrop.trim().replaceAll("[fF]$", "");
try {
int value = Integer.parseInt(clean);
return (int)Math.round((double)value * 1.52587890625);
}
catch (NumberFormatException e) {
return 0;
}
}
}