diff --git a/src/main/java/com/tools/common/config/JodConverterAutoConfiguration.java b/src/main/java/com/tools/common/config/JodConverterAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..214b800e9d6597d391bdaeff26072244fb2228f2 --- /dev/null +++ b/src/main/java/com/tools/common/config/JodConverterAutoConfiguration.java @@ -0,0 +1,79 @@ +package com.tools.common.config; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.jodconverter.core.DocumentConverter; +import org.jodconverter.core.office.OfficeManager; +import org.jodconverter.local.LocalConverter; +import org.jodconverter.local.office.LocalOfficeManager; +import org.jodconverter.local.office.LocalOfficeManager.Builder; +import org.jodconverter.local.office.LocalOfficeUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnClass({ DocumentConverter.class }) +@ConditionalOnProperty(prefix = "jodconverter.local", name = { + "enabled" }, havingValue = "true", matchIfMissing = false) +@EnableConfigurationProperties({ JodConverterProperties.class }) + +public class JodConverterAutoConfiguration { + + private JodConverterProperties properties; + + public JodConverterAutoConfiguration(JodConverterProperties properties) { + this.properties = properties; + } + + private OfficeManager createOfficeManager() { + Builder builder = LocalOfficeManager.builder(); + if (!StringUtils.isBlank(this.properties.getPortNumbers())) { + Set iports = new HashSet(); + String[] portNumbers = StringUtils.split(this.properties.getPortNumbers(), ", "); + int portCount = portNumbers.length; + + for (int i = 0; i < portCount; ++i) { + String portNumber = portNumbers[i]; + iports.add(NumberUtils.toInt(portNumber, 2002)); + } + + builder.portNumbers(ArrayUtils.toPrimitive(iports.toArray(new Integer[iports.size()]))); + } + + String officeHome = LocalOfficeUtils.getDefaultOfficeHome().getPath(); + builder.officeHome(officeHome); + // builder.officeHome(this.properties.getOfficeHome()); + builder.workingDir(this.properties.getWorkingDir()); + builder.templateProfileDir(this.properties.getTemplateProfileDir()); + builder.killExistingProcess(this.properties.isKillExistingProcess()); + builder.processTimeout(this.properties.getProcessTimeout()); + builder.processRetryInterval(this.properties.getProcessRetryInterval()); + builder.taskExecutionTimeout(this.properties.getTaskExecutionTimeout()); + builder.maxTasksPerProcess(this.properties.getMaxTasksPerProcess()); + builder.taskQueueTimeout(this.properties.getTaskQueueTimeout()); + return builder.build(); + } + + @Bean(initMethod = "start", destroyMethod = "stop") + @ConditionalOnMissingBean + public OfficeManager officeManager() { + return this.createOfficeManager(); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnBean({ OfficeManager.class }) + public DocumentConverter jodConverter(OfficeManager officeManager) { + return LocalConverter.make(officeManager); + } + +} diff --git a/src/main/java/com/tools/common/config/JodConverterProperties.java b/src/main/java/com/tools/common/config/JodConverterProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..38f18347fb606263191d1e3009900a1567f7fea8 --- /dev/null +++ b/src/main/java/com/tools/common/config/JodConverterProperties.java @@ -0,0 +1,115 @@ +package com.tools.common.config; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("jodconverter.local") +public class JodConverterProperties { + + private boolean enabled; + private String officeHome; + private String portNumbers = "2002"; + private String workingDir; + private String templateProfileDir; + private boolean killExistingProcess = true; + private long processTimeout = 120000L; + private long processRetryInterval = 250L; + private long taskExecutionTimeout = 120000L; + private int maxTasksPerProcess = 200; + private long taskQueueTimeout = 30000L; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getOfficeHome() { + return officeHome; + } + + public void setOfficeHome(String officeHome) { + this.officeHome = officeHome; + } + + public String getPortNumbers() { + return portNumbers; + } + + public void setPortNumbers(String portNumbers) { + this.portNumbers = portNumbers; + } + + public String getWorkingDir() { + return workingDir; + } + + public void setWorkingDir(String workingDir) { + this.workingDir = workingDir; + } + + public String getTemplateProfileDir() { + return templateProfileDir; + } + + public void setTemplateProfileDir(String templateProfileDir) { + this.templateProfileDir = templateProfileDir; + } + + public boolean isKillExistingProcess() { + return killExistingProcess; + } + + public void setKillExistingProcess(boolean killExistingProcess) { + this.killExistingProcess = killExistingProcess; + } + + public long getProcessTimeout() { + return processTimeout; + } + + public void setProcessTimeout(long processTimeout) { + this.processTimeout = processTimeout; + } + + public long getProcessRetryInterval() { + return processRetryInterval; + } + + public void setProcessRetryInterval(long processRetryInterval) { + this.processRetryInterval = processRetryInterval; + } + + public long getTaskExecutionTimeout() { + return taskExecutionTimeout; + } + + public void setTaskExecutionTimeout(long taskExecutionTimeout) { + this.taskExecutionTimeout = taskExecutionTimeout; + } + + public int getMaxTasksPerProcess() { + return maxTasksPerProcess; + } + + public void setMaxTasksPerProcess(int maxTasksPerProcess) { + this.maxTasksPerProcess = maxTasksPerProcess; + } + + public long getTaskQueueTimeout() { + return taskQueueTimeout; + } + + public void setTaskQueueTimeout(long taskQueueTimeout) { + this.taskQueueTimeout = taskQueueTimeout; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + +} diff --git a/src/main/java/com/tools/module/document/web/ConverterController.java b/src/main/java/com/tools/module/document/web/ConverterController.java index 46ff34ce220d2f5909726e9491320e6c72212004..01799d41170ee43f1f4f067cbc61158520251c9b 100644 --- a/src/main/java/com/tools/module/document/web/ConverterController.java +++ b/src/main/java/com/tools/module/document/web/ConverterController.java @@ -1,25 +1,27 @@ package com.tools.module.document.web; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.IdUtil; -import com.tools.common.config.AbstractController; -import com.tools.common.constant.SystemConstant; -import com.tools.common.model.Result; -import com.tools.module.sys.model.SysFile; -import io.swagger.annotations.Api; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + import org.jodconverter.core.DocumentConverter; import org.jodconverter.core.office.OfficeException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Resource; -import java.io.File; -import java.util.ArrayList; -import java.util.List; +import com.tools.common.config.AbstractController; +import com.tools.common.constant.SystemConstant; +import com.tools.common.model.Result; +import com.tools.module.sys.model.SysFile; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import io.swagger.annotations.Api; @Api(tags = "文档管理") @RestController @@ -29,7 +31,7 @@ public class ConverterController extends AbstractController { @Value("${file.path}") private String filePath; - @Resource + @Autowired(required = false) private DocumentConverter documentConverter; /** @@ -37,34 +39,33 @@ public class ConverterController extends AbstractController { */ @RequestMapping("/upload") public Result upload(MultipartFile file) { - try { - if (file != null) { - File parentFile = createParentFile(); - String fileName = file.getOriginalFilename(); - String suffix = fileName.substring(fileName.lastIndexOf(".")); - String uuid = IdUtil.simpleUUID(); - fileName = uuid + suffix; - File imageFile = new File(parentFile, fileName); - FileUtil.writeFromStream(file.getInputStream(), imageFile); - /** - * 年月日目录 - */ - String fileDay = DateUtil.thisYear()+"/"+(DateUtil.thisMonth()+1)+"/"+DateUtil.thisDayOfMonth(); - String imagePath = SystemConstant.FILE + "/document/" + fileDay+"/"+fileName; - /** - * 实时转换 - */ - File toFile = new File(parentFile, uuid+".pdf"); - documentConverter - .convert(imageFile) - .to(toFile).execute(); - return Result.ok(imagePath); - } else { - return Result.error(); - } - } catch (Exception e) { - return Result.error(); - } + try { + if (file != null) { + File parentFile = createParentFile(); + String fileName = file.getOriginalFilename(); + String suffix = fileName.substring(fileName.lastIndexOf(".")); + String uuid = IdUtil.simpleUUID(); + fileName = uuid + suffix; + File imageFile = new File(parentFile, fileName); + FileUtil.writeFromStream(file.getInputStream(), imageFile); + /** + * 年月日目录 + */ + String fileDay = DateUtil.thisYear() + "/" + (DateUtil.thisMonth() + 1) + "/" + + DateUtil.thisDayOfMonth(); + String imagePath = SystemConstant.FILE + "/document/" + fileDay + "/" + fileName; + /** + * 实时转换 + */ + File toFile = new File(parentFile, uuid + ".pdf"); + documentConverter.convert(imageFile).to(toFile).execute(); + return Result.ok(imagePath); + } else { + return Result.error(); + } + } catch (Exception e) { + return Result.error(); + } } /** @@ -72,15 +73,13 @@ public class ConverterController extends AbstractController { */ @RequestMapping("converter") public Result converter() { - try { - documentConverter - .convert(new File("F:\\前端.txt")) - .to(new File("E:\\home\\1.pdf")).execute(); - } catch (OfficeException e) { - logger.error("转换失败{}", e); - return Result.error(); - } - return Result.ok(); + try { + documentConverter.convert(new File("F:\\前端.txt")).to(new File("E:\\home\\1.pdf")).execute(); + } catch (OfficeException e) { + logger.error("转换失败{}", e); + return Result.error(); + } + return Result.ok(); } /** @@ -90,10 +89,10 @@ public class ConverterController extends AbstractController { */ @RequestMapping(value = "list", method = RequestMethod.POST) public Result list() { - String document = filePath + SystemConstant.SF_FILE_SEPARATOR + "document"; - List fileList = new ArrayList<>(); - getAllFilePaths(document, fileList, 0, ""); - return Result.ok(fileList); + String document = filePath + SystemConstant.SF_FILE_SEPARATOR + "document"; + List fileList = new ArrayList<>(); + getAllFilePaths(document, fileList, 0, ""); + return Result.ok(fileList); } /** @@ -103,41 +102,41 @@ public class ConverterController extends AbstractController { * @param filePathList * @return */ - private static List getAllFilePaths(String filePath, List filePathList, - Integer level, String parentPath) { - File[] files = new File(filePath).listFiles(); - if (files == null) { - return filePathList; - } - for (File file : files) { - int num = filePathList.size() + 1; - SysFile sysFile = new SysFile(); - sysFile.setName(file.getName()); - sysFile.setFileId(num); - sysFile.setParentId(level); - if (file.isDirectory()) { - sysFile.setDirectory(true); - if (level == 0) { - filePathList.add(sysFile); - parentPath = "/" + file.getName(); - getAllFilePaths(file.getAbsolutePath(), filePathList, num, parentPath); - num++; - } else { - filePathList.add(sysFile); - String subParentPath = parentPath + "/" + file.getName(); - getAllFilePaths(file.getAbsolutePath(), filePathList, num, subParentPath); - num++; - } - } else { - if (level != 0) { - sysFile.setDirectory(false); - sysFile.setParentPath(parentPath + "/" + file.getName()); - filePathList.add(sysFile); - num++; - } - } - } - return filePathList; + private static List getAllFilePaths(String filePath, List filePathList, Integer level, + String parentPath) { + File[] files = new File(filePath).listFiles(); + if (files == null) { + return filePathList; + } + for (File file : files) { + int num = filePathList.size() + 1; + SysFile sysFile = new SysFile(); + sysFile.setName(file.getName()); + sysFile.setFileId(num); + sysFile.setParentId(level); + if (file.isDirectory()) { + sysFile.setDirectory(true); + if (level == 0) { + filePathList.add(sysFile); + parentPath = "/" + file.getName(); + getAllFilePaths(file.getAbsolutePath(), filePathList, num, parentPath); + num++; + } else { + filePathList.add(sysFile); + String subParentPath = parentPath + "/" + file.getName(); + getAllFilePaths(file.getAbsolutePath(), filePathList, num, subParentPath); + num++; + } + } else { + if (level != 0) { + sysFile.setDirectory(false); + sysFile.setParentPath(parentPath + "/" + file.getName()); + filePathList.add(sysFile); + num++; + } + } + } + return filePathList; } /** @@ -146,18 +145,19 @@ public class ConverterController extends AbstractController { * @return */ public File createParentFile() { - File parentFile = new File(filePath + SystemConstant.SF_FILE_SEPARATOR + "document" + SystemConstant.SF_FILE_SEPARATOR + DateUtil.thisYear()); - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - parentFile = new File(parentFile, (DateUtil.thisMonth() + 1) + ""); - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - parentFile = new File(parentFile, DateUtil.thisDayOfMonth() + ""); - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - return parentFile; + File parentFile = new File(filePath + SystemConstant.SF_FILE_SEPARATOR + "document" + + SystemConstant.SF_FILE_SEPARATOR + DateUtil.thisYear()); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + parentFile = new File(parentFile, (DateUtil.thisMonth() + 1) + ""); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + parentFile = new File(parentFile, DateUtil.thisDayOfMonth() + ""); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + return parentFile; } }