diff --git a/jodconverter-web/src/main/java/cn/keking/model/FileAttribute.java b/jodconverter-web/src/main/java/cn/keking/model/FileAttribute.java new file mode 100644 index 00000000..ffe6493c --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/model/FileAttribute.java @@ -0,0 +1,69 @@ +package cn.keking.model; + +/** + * Created by kl on 2018/1/17. + * Content : + */ +public class FileAttribute { + + private FileType type; + + private String suffix; + + private String name; + + private String url; + + private String decodedUrl; + + public FileAttribute() { + } + + public FileAttribute(FileType type, String suffix, String name, String url, String decodedUrl) { + this.type = type; + this.suffix = suffix; + this.name = name; + this.url = url; + this.decodedUrl = decodedUrl; + } + + public FileType getType() { + return type; + } + + public void setType(FileType type) { + this.type = type; + } + + public String getSuffix() { + return suffix; + } + + public void setSuffix(String suffix) { + this.suffix = suffix; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDecodedUrl() { + return decodedUrl; + } + + public void setDecodedUrl(String decodedUrl) { + this.decodedUrl = decodedUrl; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/model/FileType.java b/jodconverter-web/src/main/java/cn/keking/model/FileType.java new file mode 100644 index 00000000..df834668 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/model/FileType.java @@ -0,0 +1,27 @@ +package cn.keking.model; + +/** + * Created by kl on 2018/1/17. + * Content :文件类型,文本,office,压缩包等等 + */ +public enum FileType { + picture("pictureFilePreviewImpl"), + compress("compressFilePreviewImpl"), + office("officeFilePreviewImpl"), + simText("simTextFilePreviewImpl"), + pdf("pdfFilePreviewImpl"), + other("otherFilePreviewImpl"); + + private String instanceName; + FileType(String instanceName){ + this.instanceName=instanceName; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/FilePreview.java b/jodconverter-web/src/main/java/cn/keking/service/FilePreview.java new file mode 100644 index 00000000..5b9c48e6 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/FilePreview.java @@ -0,0 +1,11 @@ +package cn.keking.service; + +import org.springframework.ui.Model; + +/** + * Created by kl on 2018/1/17. + * Content : + */ +public interface FilePreview { + String filePreviewHandle(String url, Model model); +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/FilePreviewFactory.java b/jodconverter-web/src/main/java/cn/keking/service/FilePreviewFactory.java new file mode 100644 index 00000000..86c9c12f --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/FilePreviewFactory.java @@ -0,0 +1,30 @@ +package cn.keking.service; + +import cn.keking.model.FileAttribute; +import cn.keking.utils.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; + +import java.util.Map; + +/** + * Created by kl on 2018/1/17. + * Content : + */ +@Service +public class FilePreviewFactory { + + @Autowired + FileUtils fileUtils; + + @Autowired + ApplicationContext context; + + public FilePreview get(String url) { + Map filePreviewMap = context.getBeansOfType(FilePreview.class); + FileAttribute fileAttribute = fileUtils.getFileAttribute(url); + return filePreviewMap.get(fileAttribute.getType().getInstanceName()); + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java new file mode 100644 index 00000000..712cdf5c --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java @@ -0,0 +1,62 @@ +package cn.keking.service.impl; + +import cn.keking.model.FileAttribute; +import cn.keking.param.ReturnResponse; +import cn.keking.service.FilePreview; +import cn.keking.utils.DownloadUtils; +import cn.keking.utils.FileUtils; +import cn.keking.utils.ZipReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; + +/** + * Created by kl on 2018/1/17. + * Content :处理压缩包文件 + */ +@Service +public class CompressFilePreviewImpl implements FilePreview{ + + @Autowired + FileUtils fileUtils; + + @Autowired + DownloadUtils downloadUtils; + + @Autowired + ZipReader zipReader; + + @Override + public String filePreviewHandle(String url, Model model) { + FileAttribute fileAttribute=fileUtils.getFileAttribute(url); + String fileName=fileAttribute.getName(); + String decodedUrl=fileAttribute.getDecodedUrl(); + String suffix=fileAttribute.getSuffix(); + String fileTree = null; + // 判断文件名是否存在(redis缓存读取) + if (!StringUtils.hasText(fileUtils.getConvertedFile(fileName))) { + ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, fileName); + if (0 != response.getCode()) { + model.addAttribute("msg", response.getMsg()); + return "fileNotSupported"; + } + String filePath = response.getContent(); + if ("zip".equalsIgnoreCase(suffix) || "jar".equalsIgnoreCase(suffix) || "gzip".equalsIgnoreCase(suffix)) { + fileTree = zipReader.readZipFile(filePath, fileName); + } else if ("rar".equalsIgnoreCase(suffix)) { + fileTree = zipReader.unRar(filePath, fileName); + } + fileUtils.addConvertedFile(fileName, fileTree); + } else { + fileTree = fileUtils.getConvertedFile(fileName); + } + if (null != fileTree) { + model.addAttribute("fileTree", fileTree); + return "compress"; + } else { + model.addAttribute("msg", "压缩文件类型不受支持,尝试在压缩的时候选择RAR4格式"); + return "fileNotSupported"; + } + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/OfficeFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/OfficeFilePreviewImpl.java new file mode 100644 index 00000000..220376d7 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/OfficeFilePreviewImpl.java @@ -0,0 +1,73 @@ +package cn.keking.service.impl; + +import cn.keking.model.FileAttribute; +import cn.keking.param.ReturnResponse; +import cn.keking.service.FilePreview; +import cn.keking.utils.DownloadUtils; +import cn.keking.utils.FileUtils; +import cn.keking.utils.OfficeToPdf; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; + +import java.io.File; + +/** + * Created by kl on 2018/1/17. + * Content :处理office文件 + */ +@Service +public class OfficeFilePreviewImpl implements FilePreview { + + @Autowired + FileUtils fileUtils; + + @Value("${file.dir}") + String fileDir; + + @Autowired + DownloadUtils downloadUtils; + + @Autowired + private OfficeToPdf officeToPdf; + + @Override + public String filePreviewHandle(String url, Model model) { + FileAttribute fileAttribute=fileUtils.getFileAttribute(url); + String suffix=fileAttribute.getSuffix(); + String fileName=fileAttribute.getName(); + String decodedUrl=fileAttribute.getDecodedUrl(); + boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx"); + String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf"); + // 判断之前是否已转换过,如果转换过,直接返回,否则执行转换 + if (!fileUtils.listConvertedFiles().containsKey(pdfName)) { + String filePath = fileDir + fileName; + if (!new File(filePath).exists()) { + ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, null); + if (0 != response.getCode()) { + model.addAttribute("msg", response.getMsg()); + return "fileNotSupported"; + } + filePath = response.getContent(); + } + String outFilePath = fileDir + pdfName; + if (StringUtils.hasText(outFilePath)) { + officeToPdf.openOfficeToPDF(filePath, outFilePath); + File f = new File(filePath); + if (f.exists()) { + f.delete(); + } + if (isHtml) { + // 对转换后的文件进行操作(改变编码方式) + fileUtils.doActionConvertedFile(outFilePath); + } + // 加入缓存 + fileUtils.addConvertedFile(pdfName, fileUtils.getRelativePath(outFilePath)); + } + } + model.addAttribute("pdfUrl", pdfName); + return isHtml ? "html" : "pdf"; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java new file mode 100644 index 00000000..b3f307ad --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java @@ -0,0 +1,19 @@ +package cn.keking.service.impl; + +import cn.keking.service.FilePreview; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; + +/** + * Created by kl on 2018/1/17. + * Content :其他文件 + */ +@Service +public class OtherFilePreviewImpl implements FilePreview { + @Override + public String filePreviewHandle(String url, Model model) { + model.addAttribute("msg", "系统还不支持该格式文件的在线预览," + + "如有需要请按下方显示的邮箱地址联系系统维护人员"); + return "fileNotSupported"; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/PdfFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/PdfFilePreviewImpl.java new file mode 100644 index 00000000..9688f317 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/PdfFilePreviewImpl.java @@ -0,0 +1,19 @@ +package cn.keking.service.impl; + +import cn.keking.service.FilePreview; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; + +/** + * Created by kl on 2018/1/17. + * Content :处理pdf文件 + */ +@Service +public class PdfFilePreviewImpl implements FilePreview{ + + @Override + public String filePreviewHandle(String url, Model model) { + model.addAttribute("pdfUrl", url); + return "pdf"; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/PictureFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/PictureFilePreviewImpl.java new file mode 100644 index 00000000..75b0ddf7 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/PictureFilePreviewImpl.java @@ -0,0 +1,37 @@ +package cn.keking.service.impl; + +import cn.keking.service.FilePreview; +import cn.keking.utils.FileUtils; +import com.google.common.collect.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.springframework.web.context.request.RequestContextHolder; + +import java.util.List; + +/** + * Created by kl on 2018/1/17. + * Content :图片文件处理 + */ +@Service +public class PictureFilePreviewImpl implements FilePreview { + + @Autowired + FileUtils fileUtils; + + @Override + public String filePreviewHandle(String url, Model model) { + String fileKey=(String) RequestContextHolder.currentRequestAttributes().getAttribute("fileKey",0); + List imgUrls = Lists.newArrayList(url); + try{ + imgUrls.clear(); + imgUrls.addAll(fileUtils.getRedisImgUrls(fileKey)); + }catch (Exception e){ + imgUrls = Lists.newArrayList(url); + } + model.addAttribute("imgurls", imgUrls); + model.addAttribute("currentUrl",url); + return "picture"; + } +} diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java new file mode 100644 index 00000000..b2ac6b22 --- /dev/null +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java @@ -0,0 +1,42 @@ +package cn.keking.service.impl; + +import cn.keking.model.FileAttribute; +import cn.keking.model.FileType; +import cn.keking.param.ReturnResponse; +import cn.keking.service.FilePreview; +import cn.keking.utils.FileUtils; +import cn.keking.utils.SimTextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; + +import java.net.URLDecoder; + +/** + * Created by kl on 2018/1/17. + * Content :处理文本文件 + */ +@Service +public class SimTextFilePreviewImpl implements FilePreview{ + + @Autowired + SimTextUtil simTextUtil; + + @Autowired + FileUtils fileUtils; + + @Override + public String filePreviewHandle(String url, Model model){ + FileAttribute fileAttribute=fileUtils.getFileAttribute(url); + String decodedUrl=fileAttribute.getDecodedUrl(); + String fileName=fileAttribute.getName(); + ReturnResponse response = simTextUtil.readSimText(decodedUrl, fileName); + if (0 != response.getCode()) { + model.addAttribute("msg", response.getMsg()); + return "fileNotSupported"; + } + model.addAttribute("ordinaryUrl", response.getMsg()); + return "txt"; + } + +} diff --git a/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java b/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java index f7ad589b..3d849cdc 100644 --- a/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java +++ b/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java @@ -1,13 +1,18 @@ package cn.keking.utils; +import cn.keking.model.FileAttribute; +import cn.keking.model.FileType; import com.google.common.collect.Lists; import org.redisson.api.RMapCache; import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.*; +import java.net.URLDecoder; import java.nio.charset.Charset; import java.util.Arrays; import java.util.List; @@ -20,6 +25,8 @@ import java.util.Map; */ @Component public class FileUtils { + Logger log= LoggerFactory.getLogger(getClass()); + final String REDIS_FILE_PREVIEW_PDF_KEY = "converted-preview-pdf-file"; final String REDIS_FILE_PREVIEW_IMGS_KEY = "converted-preview-imgs-file";//压缩包内图片文件集合 @@ -57,23 +64,26 @@ public class FileUtils { * @param url * @return */ - public String typeFromUrl(String url) { + public FileType typeFromUrl(String url) { String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); if (listPictureTypes().contains(fileType.toLowerCase())) { - fileType = "picture"; + return FileType.picture; } if (listArchiveTypes().contains(fileType.toLowerCase())) { - fileType = "compress"; + return FileType.compress; } if (listOfficeTypes().contains(fileType.toLowerCase())) { - fileType = "office"; + return FileType.office; } if (Arrays.asList(simText).contains(fileType.toLowerCase())) { - fileType = "simText"; + return FileType.simText; } - return fileType; + if("pdf".equalsIgnoreCase(fileType)){ + return FileType.pdf; + } + return FileType.other; } /** * 从url中剥离出文件名 @@ -116,6 +126,8 @@ public class FileUtils { list.add("png"); list.add("gif"); list.add("bmp"); + list.add("ico"); + list.add("RAW"); return list; } @@ -235,4 +247,30 @@ public class FileUtils { e.printStackTrace(); } } + /** + * 获取文件后缀 + * @param url + * @return + */ + private String suffixFromUrl(String url) { + String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); + String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); + String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); + return fileType; + } + + public FileAttribute getFileAttribute(String url) { + String decodedUrl=null; + try { + decodedUrl = URLDecoder.decode(url, "utf-8"); + }catch (UnsupportedEncodingException e){ + log.debug("url解码失败"); + } + // 路径转码 + FileType type = typeFromUrl(url); + String suffix = suffixFromUrl(url); + // 抽取文件并返回文件列表 + String fileName = getFileNameFromURL(decodedUrl); + return new FileAttribute(type,suffix,fileName,url,decodedUrl); + } } diff --git a/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java b/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java index 1aba5201..ca6ba647 100644 --- a/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java +++ b/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java @@ -1,5 +1,6 @@ package cn.keking.utils; +import cn.keking.model.FileType; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.junrar.Archive; @@ -82,8 +83,8 @@ public class ZipReader { } String parentName = getLast2FileName(fullName, archiveSeparator, archiveFileName); parentName = (level-1) + "_" + parentName; - String type=fileUtils.typeFromUrl(childName); - if (type.equalsIgnoreCase("picture")){//添加图片文件到图片列表 + FileType type=fileUtils.typeFromUrl(childName); + if (type.equals(FileType.picture)){//添加图片文件到图片列表 imgUrls.add(baseUrl+childName); } FileNode node = new FileNode(originName, childName, parentName, new ArrayList<>(), directory,fileKey); @@ -141,8 +142,8 @@ public class ZipReader { headersToBeExtracted.add(Collections.singletonMap(childName, header)); } String parentName = getLast2FileName(fullName, "\\", archiveFileName); - String type=fileUtils.typeFromUrl(childName); - if (type.equalsIgnoreCase("picture")){//添加图片文件到图片列表 + FileType type=fileUtils.typeFromUrl(childName); + if (type.equals(FileType.picture)){//添加图片文件到图片列表 imgUrls.add(baseUrl+childName); } FileNode node = new FileNode(originName, childName, parentName, new ArrayList<>(), directory,fileKey); diff --git a/jodconverter-web/src/main/java/cn/keking/web/controller/OnlinePreviewController.java b/jodconverter-web/src/main/java/cn/keking/web/controller/OnlinePreviewController.java index 318e51b6..8448382f 100644 --- a/jodconverter-web/src/main/java/cn/keking/web/controller/OnlinePreviewController.java +++ b/jodconverter-web/src/main/java/cn/keking/web/controller/OnlinePreviewController.java @@ -1,20 +1,16 @@ package cn.keking.web.controller; -import com.google.common.collect.Lists; -import cn.keking.param.ReturnResponse; -import cn.keking.utils.*; +import cn.keking.service.FilePreview; +import cn.keking.service.FilePreviewFactory; + import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -31,19 +27,9 @@ import java.util.Map; */ @Controller public class OnlinePreviewController { - @Autowired - private OfficeToPdf officeToPdf; - @Autowired - FileUtils fileUtils; - @Autowired - DownloadUtils downloadUtils; - @Autowired - ZipReader zipReader; - @Autowired - SimTextUtil simTextUtil; - @Value("${file.dir}") - String fileDir; + @Autowired + FilePreviewFactory previewFactory; /** * @param url @@ -51,100 +37,10 @@ public class OnlinePreviewController { * @return */ @RequestMapping(value = "onlinePreview", method = RequestMethod.GET) - public String onlinePreview(String url, Model model, HttpServletRequest req) throws UnsupportedEncodingException { - // 路径转码 - String decodedUrl = URLDecoder.decode(url, "utf-8"); - String type = fileUtils.typeFromUrl(url); - String suffix = suffixFromUrl(url); - // 抽取文件并返回文件列表 - String fileName = fileUtils.getFileNameFromURL(decodedUrl); - model.addAttribute("fileType", suffix); - if (type.equalsIgnoreCase("picture")) { - List imgUrls = Lists.newArrayList(url); - try{ - String fileKey = req.getParameter("fileKey"); - imgUrls.clear(); - imgUrls.addAll(fileUtils.getRedisImgUrls(fileKey)); - }catch (Exception e){ - imgUrls = Lists.newArrayList(url); - } - model.addAttribute("imgurls", imgUrls); - model.addAttribute("currentUrl",url); - return "picture"; - } else if (type.equalsIgnoreCase("simText")) { - ReturnResponse response = simTextUtil.readSimText(decodedUrl, fileName); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - model.addAttribute("ordinaryUrl", response.getMsg()); - return "txt"; - } else if (type.equalsIgnoreCase("pdf")) { - model.addAttribute("pdfUrl", url); - return "pdf"; - } else if (type.equalsIgnoreCase("compress")) { - String fileTree = null; - // 判断文件名是否存在(redis缓存读取) - if (!StringUtils.hasText(fileUtils.getConvertedFile(fileName))) { - ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, fileName); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - String filePath = response.getContent(); - if ("zip".equalsIgnoreCase(suffix) || "jar".equalsIgnoreCase(suffix) || "gzip".equalsIgnoreCase(suffix)) { - fileTree = zipReader.readZipFile(filePath, fileName); - } else if ("rar".equalsIgnoreCase(suffix)) { - fileTree = zipReader.unRar(filePath, fileName); - } - fileUtils.addConvertedFile(fileName, fileTree); - } else { - fileTree = fileUtils.getConvertedFile(fileName); - } - if (null != fileTree) { - model.addAttribute("fileTree", fileTree); - return "compress"; - } else { - model.addAttribute("msg", "压缩文件类型不受支持,尝试在压缩的时候选择RAR4格式"); - return "fileNotSupported"; - } - } else if ("office".equalsIgnoreCase(type)) { - boolean isHtml = suffix.equalsIgnoreCase("xls") - || suffix.equalsIgnoreCase("xlsx"); - String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf"); - // 判断之前是否已转换过,如果转换过,直接返回,否则执行转换 - if (!fileUtils.listConvertedFiles().containsKey(pdfName)) { - String filePath = fileDir + fileName; - if (!new File(filePath).exists()) { - ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, null); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - filePath = response.getContent(); - } - String outFilePath = fileDir + pdfName; - if (StringUtils.hasText(outFilePath)) { - officeToPdf.openOfficeToPDF(filePath, outFilePath); - File f = new File(filePath); - if (f.exists()) { - f.delete(); - } - if (isHtml) { - // 对转换后的文件进行操作(改变编码方式) - fileUtils.doActionConvertedFile(outFilePath); - } - // 加入缓存 - fileUtils.addConvertedFile(pdfName, fileUtils.getRelativePath(outFilePath)); - } - } - model.addAttribute("pdfUrl", pdfName); - return isHtml ? "html" : "pdf"; - } else { - model.addAttribute("msg", "系统还不支持该格式文件的在线预览," + - "如有需要请按下方显示的邮箱地址联系系统维护人员"); - return "fileNotSupported"; - } + public String onlinePreview(String url, Model model, HttpServletRequest req) { + req.setAttribute("fileKey",req.getParameter("fileKey")); + FilePreview filePreview=previewFactory.get(url); + return filePreview.filePreviewHandle(url,model); } /** @@ -167,13 +63,6 @@ public class OnlinePreviewController { } - private String suffixFromUrl(String url) { - String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); - String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); - String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); - return fileType; - } - /** * 根据url获取文件内容 * 当pdfjs读取存在跨域问题的文件时将通过此接口读取 diff --git a/jodconverter-web/src/main/java/com/yudianbank/FilePreviewApplication.java b/jodconverter-web/src/main/java/com/yudianbank/FilePreviewApplication.java deleted file mode 100644 index 87ce7ed9..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/FilePreviewApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.yudianbank; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.scheduling.annotation.EnableScheduling; -import java.util.Properties; - -@SpringBootApplication -@EnableScheduling -@ComponentScan(value = "com.yudianbank.*") -public class FilePreviewApplication { - public static void main(String[] args) { - Properties properties = System.getProperties(); - System.out.println(properties.get("user.dir")); - SpringApplication.run(FilePreviewApplication.class, args); - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/config/RedissonConfig.java b/jodconverter-web/src/main/java/com/yudianbank/config/RedissonConfig.java deleted file mode 100644 index 071b7463..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/config/RedissonConfig.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.yudianbank.config; - -import io.netty.channel.nio.NioEventLoopGroup; -import org.redisson.Redisson; -import org.redisson.api.RedissonClient; -import org.redisson.client.codec.Codec; -import org.redisson.config.Config; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.ClassUtils; - -/** - * Created by kl on 2017/09/26. - * redisson 客户端配置 - */ -@ConfigurationProperties(prefix = "spring.redisson") -@Configuration -public class RedissonConfig { - - private String address; - private int connectionMinimumIdleSize = 10; - private int idleConnectionTimeout=10000; - private int pingTimeout=1000; - private int connectTimeout=10000; - private int timeout=3000; - private int retryAttempts=3; - private int retryInterval=1500; - private int reconnectionTimeout=3000; - private int failedAttempts=3; - private String password = null; - private int subscriptionsPerConnection=5; - private String clientName=null; - private int subscriptionConnectionMinimumIdleSize = 1; - private int subscriptionConnectionPoolSize = 50; - private int connectionPoolSize = 64; - private int database = 0; - private boolean dnsMonitoring = false; - private int dnsMonitoringInterval = 5000; - - private int thread; //当前处理核数量 * 2 - - private String codec="org.redisson.codec.JsonJacksonCodec"; - - @Bean(destroyMethod = "shutdown") - RedissonClient redisson() throws Exception { - Config config = new Config(); - config.useSingleServer().setAddress(address) - .setConnectionMinimumIdleSize(connectionMinimumIdleSize) - .setConnectionPoolSize(connectionPoolSize) - .setDatabase(database) - .setDnsMonitoring(dnsMonitoring) - .setDnsMonitoringInterval(dnsMonitoringInterval) - .setSubscriptionConnectionMinimumIdleSize(subscriptionConnectionMinimumIdleSize) - .setSubscriptionConnectionPoolSize(subscriptionConnectionPoolSize) - .setSubscriptionsPerConnection(subscriptionsPerConnection) - .setClientName(clientName) - .setFailedAttempts(failedAttempts) - .setRetryAttempts(retryAttempts) - .setRetryInterval(retryInterval) - .setReconnectionTimeout(reconnectionTimeout) - .setTimeout(timeout) - .setConnectTimeout(connectTimeout) - .setIdleConnectionTimeout(idleConnectionTimeout) - .setPingTimeout(pingTimeout) - .setPassword(password); - Codec codec=(Codec) ClassUtils.forName(getCodec(), ClassUtils.getDefaultClassLoader()).newInstance(); - config.setCodec(codec); - config.setThreads(thread); - config.setEventLoopGroup(new NioEventLoopGroup()); - config.setUseLinuxNativeEpoll(false); - return Redisson.create(config); - } - - public int getThread() { - return thread; - } - - public void setThread(int thread) { - this.thread = thread; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public int getIdleConnectionTimeout() { - return idleConnectionTimeout; - } - - public void setIdleConnectionTimeout(int idleConnectionTimeout) { - this.idleConnectionTimeout = idleConnectionTimeout; - } - - public int getPingTimeout() { - return pingTimeout; - } - - public void setPingTimeout(int pingTimeout) { - this.pingTimeout = pingTimeout; - } - - public int getConnectTimeout() { - return connectTimeout; - } - - public void setConnectTimeout(int connectTimeout) { - this.connectTimeout = connectTimeout; - } - - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - public int getRetryAttempts() { - return retryAttempts; - } - - public void setRetryAttempts(int retryAttempts) { - this.retryAttempts = retryAttempts; - } - - public int getRetryInterval() { - return retryInterval; - } - - public void setRetryInterval(int retryInterval) { - this.retryInterval = retryInterval; - } - - public int getReconnectionTimeout() { - return reconnectionTimeout; - } - - public void setReconnectionTimeout(int reconnectionTimeout) { - this.reconnectionTimeout = reconnectionTimeout; - } - - public int getFailedAttempts() { - return failedAttempts; - } - - public void setFailedAttempts(int failedAttempts) { - this.failedAttempts = failedAttempts; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public int getSubscriptionsPerConnection() { - return subscriptionsPerConnection; - } - - public void setSubscriptionsPerConnection(int subscriptionsPerConnection) { - this.subscriptionsPerConnection = subscriptionsPerConnection; - } - - public String getClientName() { - return clientName; - } - - public void setClientName(String clientName) { - this.clientName = clientName; - } - - public int getSubscriptionConnectionMinimumIdleSize() { - return subscriptionConnectionMinimumIdleSize; - } - - public void setSubscriptionConnectionMinimumIdleSize(int subscriptionConnectionMinimumIdleSize) { - this.subscriptionConnectionMinimumIdleSize = subscriptionConnectionMinimumIdleSize; - } - - public int getSubscriptionConnectionPoolSize() { - return subscriptionConnectionPoolSize; - } - - public void setSubscriptionConnectionPoolSize(int subscriptionConnectionPoolSize) { - this.subscriptionConnectionPoolSize = subscriptionConnectionPoolSize; - } - - public int getConnectionMinimumIdleSize() { - return connectionMinimumIdleSize; - } - - public void setConnectionMinimumIdleSize(int connectionMinimumIdleSize) { - this.connectionMinimumIdleSize = connectionMinimumIdleSize; - } - - public int getConnectionPoolSize() { - return connectionPoolSize; - } - - public void setConnectionPoolSize(int connectionPoolSize) { - this.connectionPoolSize = connectionPoolSize; - } - - public int getDatabase() { - return database; - } - - public void setDatabase(int database) { - this.database = database; - } - - public boolean isDnsMonitoring() { - return dnsMonitoring; - } - - public void setDnsMonitoring(boolean dnsMonitoring) { - this.dnsMonitoring = dnsMonitoring; - } - - public int getDnsMonitoringInterval() { - return dnsMonitoringInterval; - } - - public void setDnsMonitoringInterval(int dnsMonitoringInterval) { - this.dnsMonitoringInterval = dnsMonitoringInterval; - } - - public String getCodec() { - return codec; - } - - public void setCodec(String codec) { - this.codec = codec; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/extend/ControlDocumentFormatRegistry.java b/jodconverter-web/src/main/java/com/yudianbank/extend/ControlDocumentFormatRegistry.java deleted file mode 100644 index 99632680..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/extend/ControlDocumentFormatRegistry.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.yudianbank.extend; - -import com.google.common.collect.Maps; -import com.sun.star.beans.PropertyValue; -import org.artofsolving.jodconverter.document.DocumentFamily; -import org.artofsolving.jodconverter.document.DocumentFormat; -import org.artofsolving.jodconverter.document.SimpleDocumentFormatRegistry; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * 重写了DefaultDocumentFormatRegistry类,因为要添加自定义行为,比如字符编码。。。 - * @author yudian-it - * @date 2017/12/5 - */ -public class ControlDocumentFormatRegistry extends SimpleDocumentFormatRegistry { - - public ControlDocumentFormatRegistry() { - DocumentFormat pdf = new DocumentFormat("Portable Document Format", "pdf", "application/pdf"); - pdf.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "writer_pdf_Export")); - pdf.setStoreProperties(DocumentFamily.SPREADSHEET, Collections.singletonMap("FilterName", "calc_pdf_Export")); - pdf.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "impress_pdf_Export")); - pdf.setStoreProperties(DocumentFamily.DRAWING, Collections.singletonMap("FilterName", "draw_pdf_Export")); - addFormat(pdf); - - DocumentFormat swf = new DocumentFormat("Macromedia Flash", "swf", "application/x-shockwave-flash"); - swf.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "impress_flash_Export")); - swf.setStoreProperties(DocumentFamily.DRAWING, Collections.singletonMap("FilterName", "draw_flash_Export")); - addFormat(swf); - - // disabled because it's not always available - //DocumentFormat xhtml = new DocumentFormat("XHTML", "xhtml", "application/xhtml+xml"); - //xhtml.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "XHTML Writer File")); - //xhtml.setStoreProperties(DocumentFamily.SPREADSHEET, Collections.singletonMap("FilterName", "XHTML Calc File")); - //xhtml.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "XHTML Impress File")); - //addFormat(xhtml); - - DocumentFormat html = new DocumentFormat("HTML", "html", "text/html"); - // HTML is treated as Text when supplied as input, but as an output it is also - // available for exporting Spreadsheet and Presentation formats - html.setInputFamily(DocumentFamily.TEXT); - html.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "HTML (StarWriter)")); - Map htmlLoadAndStoreProperties = new LinkedHashMap(); - htmlLoadAndStoreProperties.put("FilterName", "HTML (StarCalc)"); - htmlLoadAndStoreProperties.put("FilterOptions", "utf8"); - html.setStoreProperties(DocumentFamily.SPREADSHEET, htmlLoadAndStoreProperties); - html.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "impress_html_Export")); - addFormat(html); - - DocumentFormat odt = new DocumentFormat("OpenDocument Text", "odt", "application/vnd.oasis.opendocument.text"); - odt.setInputFamily(DocumentFamily.TEXT); - odt.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "writer8")); - addFormat(odt); - - DocumentFormat sxw = new DocumentFormat("OpenOffice.org 1.0 Text Document", "sxw", "application/vnd.sun.xml.writer"); - sxw.setInputFamily(DocumentFamily.TEXT); - sxw.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "StarOffice XML (Writer)")); - addFormat(sxw); - - DocumentFormat doc = new DocumentFormat("Microsoft Word", "doc", "application/msword"); - doc.setInputFamily(DocumentFamily.TEXT); - doc.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "MS Word 97")); - addFormat(doc); - - DocumentFormat docx = new DocumentFormat("Microsoft Word 2007 XML", "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - docx.setInputFamily(DocumentFamily.TEXT); - addFormat(docx); - - DocumentFormat rtf = new DocumentFormat("Rich Text Format", "rtf", "text/rtf"); - rtf.setInputFamily(DocumentFamily.TEXT); - rtf.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "Rich Text Format")); - addFormat(rtf); - - DocumentFormat wpd = new DocumentFormat("WordPerfect", "wpd", "application/wordperfect"); - wpd.setInputFamily(DocumentFamily.TEXT); - addFormat(wpd); - - DocumentFormat txt = new DocumentFormat("Plain Text", "txt", "text/plain"); - txt.setInputFamily(DocumentFamily.TEXT); - Map txtLoadAndStoreProperties = new LinkedHashMap(); - txtLoadAndStoreProperties.put("FilterName", "Text (encoded)"); - txtLoadAndStoreProperties.put("FilterOptions", "utf8"); - txt.setLoadProperties(txtLoadAndStoreProperties); - txt.setStoreProperties(DocumentFamily.TEXT, txtLoadAndStoreProperties); - addFormat(txt); - - DocumentFormat wikitext = new DocumentFormat("MediaWiki wikitext", "wiki", "text/x-wiki"); - wikitext.setStoreProperties(DocumentFamily.TEXT, Collections.singletonMap("FilterName", "MediaWiki")); - //addFormat(wikitext); - - DocumentFormat ods = new DocumentFormat("OpenDocument Spreadsheet", "ods", "application/vnd.oasis.opendocument.spreadsheet"); - ods.setInputFamily(DocumentFamily.SPREADSHEET); - ods.setStoreProperties(DocumentFamily.SPREADSHEET, Collections.singletonMap("FilterName", "calc8")); - addFormat(ods); - - DocumentFormat sxc = new DocumentFormat("OpenOffice.org 1.0 Spreadsheet", "sxc", "application/vnd.sun.xml.calc"); - sxc.setInputFamily(DocumentFamily.SPREADSHEET); - sxc.setStoreProperties(DocumentFamily.SPREADSHEET, Collections.singletonMap("FilterName", "StarOffice XML (Calc)")); - addFormat(sxc); - - DocumentFormat xls = new DocumentFormat("Microsoft Excel", "xls", "application/vnd.ms-excel"); - xls.setInputFamily(DocumentFamily.SPREADSHEET); - xls.setStoreProperties(DocumentFamily.SPREADSHEET, Collections.singletonMap("FilterName", "MS Excel 97")); - addFormat(xls); - - DocumentFormat xlsx = new DocumentFormat("Microsoft Excel 2007 XML", "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - xlsx.setInputFamily(DocumentFamily.SPREADSHEET); - addFormat(xlsx); - - DocumentFormat csv = new DocumentFormat("Comma Separated Values", "csv", "text/csv"); - csv.setInputFamily(DocumentFamily.SPREADSHEET); - Map csvLoadAndStoreProperties = new LinkedHashMap(); - csvLoadAndStoreProperties.put("FilterName", "Text - txt - csv (StarCalc)"); - csvLoadAndStoreProperties.put("FilterOptions", "44,34,0"); // Field Separator: ','; Text Delimiter: '"' - csv.setLoadProperties(csvLoadAndStoreProperties); - csv.setStoreProperties(DocumentFamily.SPREADSHEET, csvLoadAndStoreProperties); - addFormat(csv); - - DocumentFormat tsv = new DocumentFormat("Tab Separated Values", "tsv", "text/tab-separated-values"); - tsv.setInputFamily(DocumentFamily.SPREADSHEET); - Map tsvLoadAndStoreProperties = new LinkedHashMap(); - tsvLoadAndStoreProperties.put("FilterName", "Text - txt - csv (StarCalc)"); - tsvLoadAndStoreProperties.put("FilterOptions", "9,34,0"); // Field Separator: '\t'; Text Delimiter: '"' - tsv.setLoadProperties(tsvLoadAndStoreProperties); - tsv.setStoreProperties(DocumentFamily.SPREADSHEET, tsvLoadAndStoreProperties); - addFormat(tsv); - - DocumentFormat odp = new DocumentFormat("OpenDocument Presentation", "odp", "application/vnd.oasis.opendocument.presentation"); - odp.setInputFamily(DocumentFamily.PRESENTATION); - odp.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "impress8")); - addFormat(odp); - - DocumentFormat sxi = new DocumentFormat("OpenOffice.org 1.0 Presentation", "sxi", "application/vnd.sun.xml.impress"); - sxi.setInputFamily(DocumentFamily.PRESENTATION); - sxi.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "StarOffice XML (Impress)")); - addFormat(sxi); - - DocumentFormat ppt = new DocumentFormat("Microsoft PowerPoint", "ppt", "application/vnd.ms-powerpoint"); - ppt.setInputFamily(DocumentFamily.PRESENTATION); - ppt.setStoreProperties(DocumentFamily.PRESENTATION, Collections.singletonMap("FilterName", "MS PowerPoint 97")); - addFormat(ppt); - - DocumentFormat pptx = new DocumentFormat("Microsoft PowerPoint 2007 XML", "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); - pptx.setInputFamily(DocumentFamily.PRESENTATION); - addFormat(pptx); - - DocumentFormat odg = new DocumentFormat("OpenDocument Drawing", "odg", "application/vnd.oasis.opendocument.graphics"); - odg.setInputFamily(DocumentFamily.DRAWING); - odg.setStoreProperties(DocumentFamily.DRAWING, Collections.singletonMap("FilterName", "draw8")); - addFormat(odg); - - DocumentFormat svg = new DocumentFormat("Scalable Vector Graphics", "svg", "image/svg+xml"); - svg.setStoreProperties(DocumentFamily.DRAWING, Collections.singletonMap("FilterName", "draw_svg_Export")); - addFormat(svg); - } - - /** - * 创建默认的导出属性 - * @return - */ - private PropertyValue[] getCommonPropertyValue() { - PropertyValue[] aFilterData = new PropertyValue[11]; - // 不显示文档标题 - aFilterData[0] = new PropertyValue(); - aFilterData[0].Name = "DisplayPDFDocumentTitle"; - aFilterData[0].Value= true; - // 导出文件编码方式 - aFilterData[1] = new PropertyValue(); - aFilterData[1].Name = "Encoding"; - aFilterData[1].Value= "UTF-8"; - // 隐藏工具条 - aFilterData[2] = new PropertyValue(); - aFilterData[2].Name = "HideViewerToolbar"; - aFilterData[2].Value= false; - // 隐藏窗口控制条 - aFilterData[3] = new PropertyValue(); - aFilterData[3].Name = "HideViewerWindowControls"; - aFilterData[3].Value= true; - // 全屏展示 - aFilterData[4] = new PropertyValue(); - aFilterData[4].Name = "OpenInFullScreenMode"; - aFilterData[4].Value= false; - // 第一页左边展示 - aFilterData[5] = new PropertyValue(); - aFilterData[5].Name = "MathToMathType"; - aFilterData[5].Value= true; - // 文档标题内容 - aFilterData[6] = new PropertyValue(); - aFilterData[6].Name = "Watermark"; - aFilterData[6].Value= "KEKING.CN"; - // 导出文件编码方式 - aFilterData[7] = new PropertyValue(); - aFilterData[7].Name = "CharacterSet"; - aFilterData[7].Value= "UTF-8"; - // 导出文件编码方式 - aFilterData[8] = new PropertyValue(); - aFilterData[8].Name = "Encoding"; - aFilterData[8].Value= "UTF-8"; - // 导出文件编码方式 - aFilterData[9] = new PropertyValue(); - aFilterData[9].Name = "CharSet"; - aFilterData[9].Value= "UTF-8"; - // 导出文件编码方式 - aFilterData[10] = new PropertyValue(); - aFilterData[10].Name = "charset"; - aFilterData[10].Value= "UTF-8"; - return aFilterData; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/filters/ChinesePathFilter.java b/jodconverter-web/src/main/java/com/yudianbank/filters/ChinesePathFilter.java deleted file mode 100644 index 44050331..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/filters/ChinesePathFilter.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.yudianbank.filters; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * - * @author yudian-it - * @date 2017/11/30 - */ -public class ChinesePathFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - request.setCharacterEncoding("UTF-8"); - response.setCharacterEncoding("UTF-8"); - StringBuilder pathBuilder = new StringBuilder(); - pathBuilder.append(request.getScheme()).append("://").append(request.getServerName()).append(":") - .append(request.getServerPort()).append(((HttpServletRequest)request).getContextPath()).append("/"); - request.setAttribute("baseUrl", pathBuilder.toString()); - chain.doFilter(request, response); - } - - @Override - public void destroy() { - - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/filters/FilterConfiguration.java b/jodconverter-web/src/main/java/com/yudianbank/filters/FilterConfiguration.java deleted file mode 100644 index 246a4611..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/filters/FilterConfiguration.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.yudianbank.filters; - -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - - -/** - * - * @author yudian-it - * @date 2017/11/30 - */ -@Configuration -public class FilterConfiguration { - - @Bean - public FilterRegistrationBean getChinesePathFilter(){ - ChinesePathFilter filter = new ChinesePathFilter(); - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(filter); - return registrationBean; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/param/ReturnResponse.java b/jodconverter-web/src/main/java/com/yudianbank/param/ReturnResponse.java deleted file mode 100644 index d1438662..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/param/ReturnResponse.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.yudianbank.param; - -import java.io.Serializable; - -/** - * 接口返回值结构 - * @author yudian-it - * @date 2017/11/17 - */ -public class ReturnResponse implements Serializable{ - private static final long serialVersionUID = 313975329998789878L; - /** - * 返回状态 - * 0. 成功 - * 1. 失败 - */ - private int code; - - /** - * 返回状态描述 - * XXX成功 - * XXX失败 - */ - private String msg; - - private T content; - - public ReturnResponse(int code, String msg, T content) { - this.code = code; - this.msg = msg; - this.content = content; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public T getContent() { - return content; - } - - public void setContent(T content) { - this.content = content; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/ConverterUtils.java b/jodconverter-web/src/main/java/com/yudianbank/utils/ConverterUtils.java deleted file mode 100644 index 53a306cc..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/ConverterUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.yudianbank.utils; - -import com.sun.star.document.UpdateDocMode; -import com.yudianbank.extend.ControlDocumentFormatRegistry; -import org.artofsolving.jodconverter.OfficeDocumentConverter; -import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; -import org.artofsolving.jodconverter.office.OfficeManager; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * 创建文件转换器 - * - * @author yudian-it - * @date 2017/11/13 - */ -@Component -public class ConverterUtils { - - @Value("${office.home}") - String officeHome; -// OpenOfficeConnection connection; - OfficeManager officeManager; - - @PostConstruct - public void initOfficeManager() { - //// connection = new SocketOpenOfficeConnection(host,8100); -//// connection.connect(); - DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); - configuration.setOfficeHome(officeHome); - configuration.setPortNumber(8100); - officeManager = configuration.buildOfficeManager(); - officeManager.start(); - // 设置任务执行超时为5分钟 - // configuration.setTaskExecutionTimeout(1000 * 60 * 5L);// - // 设置任务队列超时为24小时 - // configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);// - } - - public OfficeDocumentConverter getDocumentConverter() { - OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager, new ControlDocumentFormatRegistry()); - converter.setDefaultLoadProperties(getLoadProperties()); - return converter; - } - - private Map getLoadProperties() { - Map loadProperties = new HashMap<>(10); - loadProperties.put("Hidden", true); - loadProperties.put("ReadOnly", true); - loadProperties.put("UpdateDocMode", UpdateDocMode.QUIET_UPDATE); - loadProperties.put("CharacterSet", Charset.forName("UTF-8").name()); - return loadProperties; - } - - @PreDestroy - public void destroyOfficeManager(){ - if (null != officeManager && officeManager.isRunning()) { - officeManager.stop(); - } - } - -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/DeleteFileUtil.java b/jodconverter-web/src/main/java/com/yudianbank/utils/DeleteFileUtil.java deleted file mode 100644 index 896ef78d..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/DeleteFileUtil.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.yudianbank.utils; - -import java.io.File; - -public class DeleteFileUtil { - /** - * 删除单个文件 - * - * @param fileName - * 要删除的文件的文件名 - * @return 单个文件删除成功返回true,否则返回false - */ - public static boolean deleteFile(String fileName) { - File file = new File(fileName); - // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 - if (file.exists() && file.isFile()) { - if (file.delete()) { - System.out.println("删除单个文件" + fileName + "成功!"); - return true; - } else { - System.out.println("删除单个文件" + fileName + "失败!"); - return false; - } - } else { - System.out.println("删除单个文件失败:" + fileName + "不存在!"); - return false; - } - } - - - /** - * 删除目录及目录下的文件 - * - * @param dir - * 要删除的目录的文件路径 - * @return 目录删除成功返回true,否则返回false - */ - public static boolean deleteDirectory(String dir) { - // 如果dir不以文件分隔符结尾,自动添加文件分隔符 - if (!dir.endsWith(File.separator)) { - dir = dir + File.separator; - } - File dirFile = new File(dir); - // 如果dir对应的文件不存在,或者不是一个目录,则退出 - if ((!dirFile.exists()) || (!dirFile.isDirectory())) { - System.out.println("删除目录失败:" + dir + "不存在!"); - return false; - } - boolean flag = true; - // 删除文件夹中的所有文件包括子目录 - File[] files = dirFile.listFiles(); - for (int i = 0; i < files.length; i++) { - // 删除子文件 - if (files[i].isFile()) { - flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath()); - if (!flag) - break; - } - // 删除子目录 - else if (files[i].isDirectory()) { - flag = DeleteFileUtil.deleteDirectory(files[i] - .getAbsolutePath()); - if (!flag) - break; - } - } - if (!flag) { - System.out.println("删除目录失败!"); - return false; - } - return true; - } - -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/DownloadUtils.java b/jodconverter-web/src/main/java/com/yudianbank/utils/DownloadUtils.java deleted file mode 100644 index 67b5294b..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/DownloadUtils.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.yudianbank.utils; - -import com.yudianbank.param.ReturnResponse; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import java.io.*; -import java.net.*; -import java.nio.charset.Charset; -import java.util.UUID; - -/** - * @author yudian-it - */ -@Component -public class DownloadUtils { - - @Value("${file.dir}") - String fileDir; - - /** - * 一开始测试的时候发现有些文件没有下载下来,而有些可以;当时也是郁闷了好一阵,但是最终还是不得解 - * 再次测试的时候,通过前台对比url发现,原来参数中有+号特殊字符存在,但是到后之后却变成了空格,突然恍然大悟 - * 应该是转义出了问题,url转义中会把+号当成空格来计算,所以才会出现这种情况,遂想要通过整体替换空格为加号,因为url - * 中的参数部分是不会出现空格的,但是文件名中就不好确定了,所以只对url参数部分做替换 - * 注: 针对URLEncoder.encode(s,charset)会将空格转成+的情况需要做下面的替换工作 - * @param urlAddress - * @param type - * @return - */ - public ReturnResponse downLoad(String urlAddress, String type, String fileName){ - ReturnResponse response = new ReturnResponse<>(0, "下载成功!!!", ""); - URL url = null; - try { - urlAddress = replacePlusMark(urlAddress); - urlAddress = encodeUrlParam(urlAddress); - // 因为tomcat不能处理'+'号,所以讲'+'号替换成'%20%' - urlAddress = urlAddress.replaceAll("\\+", "%20"); - url = new URL(urlAddress); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - UUID uuid = UUID.randomUUID(); - if (null == fileName) { - fileName = uuid+ "."+type; - }else { // 文件后缀不一致时,以type为准(针对simText【将类txt文件转为txt】) - fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type); - } - String realPath = fileDir + fileName; - File dirFile = new File(fileDir); - if (!dirFile.exists()) { - dirFile.mkdirs(); - } - try { - URLConnection connection = url.openConnection(); - InputStream in = connection.getInputStream(); - - FileOutputStream os = new FileOutputStream(realPath); - byte[] buffer = new byte[4 * 1024]; - int read; - while ((read = in.read(buffer)) > 0) { - os.write(buffer, 0, read); - } - os.close(); - in.close(); - response.setContent(realPath); - // 同样针对类txt文件,如果成功msg包含的是转换后的文件名 - response.setMsg(fileName); - - // txt转换文件编码为utf8 - if("txt".equals(type)){ - convertTextPlainFileCharsetToUtf8(realPath); - } - - return response; - } catch (IOException e) { - e.printStackTrace(); - response.setCode(1); - response.setContent(null); - if (e instanceof FileNotFoundException) { - response.setMsg("文件不存在!!!"); - }else { - response.setMsg(e.getMessage()); - } - return response; - } - } - - /** - * 注:可能是原来因为前端通过encodeURI来编码的,因为通过encodeURI编码+会被转成+号(亦即没有转), - * 而通过encodeURIComponent则会转成%2B,这样URLDecoder是可以正确处理的,所以也就没有必要在这里替换了 - * 转换url参数部分的空格为加号(因为在url编解码的过程中出现+转为空格的情况) - * @param urlAddress - * @return - */ - private String replacePlusMark(String urlAddress) { - if (urlAddress.contains("?")) { - String nonParamStr = urlAddress.substring(0,urlAddress.indexOf("?") + 1); - String paramStr = urlAddress.substring(nonParamStr.length()); - return nonParamStr + paramStr.replace(" ", "+"); - } - return urlAddress; - } - - /** - * 对最有一个路径进行转码 - * @param urlAddress - * http://192.168.2.111:8013/demo/Handle中文.zip - * @return - */ - private String encodeUrlParam(String urlAddress) { - String newUrl = ""; - try { - String path = ""; - String param = ""; - if (urlAddress.contains("?")) { - path = urlAddress.substring(0, urlAddress.indexOf("?")); - param = urlAddress.substring(urlAddress.indexOf("?")); - }else { - path = urlAddress; - } - String lastPath = path.substring(path.lastIndexOf("/") + 1); - String leftPath = path.substring(0, path.lastIndexOf("/") + 1); - String encodeLastPath = URLEncoder.encode(lastPath, "UTF-8"); - newUrl += leftPath + encodeLastPath; - if (urlAddress.contains("?")) { - newUrl += param; - } - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return newUrl; - } - - - - /** - * 因为jodConvert2.1不支持ms2013版本的office转换,这里偷懒,尝试看改一下文件类型,让jodConvert2.1去 - * 处理ms2013,看结果如何,如果问题很大的话只能采取其他方式,如果没有问题,暂时使用该版本来转换 - * @param type - * @return - */ - private String dealWithMS2013(String type) { - String newType = null; - switch (type){ - case "docx": - newType = "doc"; - break; - case "xlsx": - newType = "doc"; - break; - case "pptx": - newType = "ppt"; - break; - default: - newType = type; - break; - } - return newType; - } - - /** - * 转换文本文件编码为utf8 - * 探测源文件编码,探测到编码切不为utf8则进行转码 - * @param filePath 文件路径 - */ - private static void convertTextPlainFileCharsetToUtf8(String filePath) throws IOException { - File sourceFile = new File(filePath); - if(sourceFile.exists() && sourceFile.isFile() && sourceFile.canRead()) { - String encoding = null; - try { - FileCharsetDetector.Observer observer = FileCharsetDetector.guessFileEncoding(sourceFile); - // 为准确探测到编码,不适用猜测的编码 - encoding = observer.isFound()?observer.getEncoding():null; - // 为准确探测到编码,可以考虑使用GBK 大部分文件都是windows系统产生的 - } catch (IOException e) { - // 编码探测失败, - e.printStackTrace(); - } - if(encoding != null && !"UTF-8".equals(encoding)){ - // 不为utf8,进行转码 - File tmpUtf8File = new File(filePath+".utf8"); - Writer writer = new OutputStreamWriter(new FileOutputStream(tmpUtf8File),"UTF-8"); - Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile),encoding)); - char[] buf = new char[1024]; - int read; - while ((read = reader.read(buf)) > 0){ - writer.write(buf, 0, read); - } - reader.close(); - writer.close(); - // 删除源文件 - sourceFile.delete(); - // 重命名 - tmpUtf8File.renameTo(sourceFile); - } - } - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/FileCharsetDetector.java b/jodconverter-web/src/main/java/com/yudianbank/utils/FileCharsetDetector.java deleted file mode 100644 index b08f758d..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/FileCharsetDetector.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.yudianbank.utils; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - -import org.mozilla.intl.chardet.nsDetector; -import org.mozilla.intl.chardet.nsICharsetDetectionObserver; - -/** - * 文本文件编码探测工具类 - * - * @author HWliao - * @date 2017-12-24 - */ -public class FileCharsetDetector { - - /** - * 传入一个文件(File)对象,检查文件编码 - * - * @param file File对象实例 - * @return 文件编码,若无,则返回null - * @throws FileNotFoundException - * @throws IOException - */ - public static Observer guessFileEncoding(File file) - throws FileNotFoundException, IOException { - return guessFileEncoding(file, new nsDetector()); - } - - /** - *
-   * 获取文件的编码
-   * @param file
-   *            File对象实例
-   * @param languageHint
-   *            语言提示区域代码 @see #nsPSMDetector ,取值如下:
-   *             1 : Japanese
-   *             2 : Chinese
-   *             3 : Simplified Chinese
-   *             4 : Traditional Chinese
-   *             5 : Korean
-   *             6 : Dont know(default)
-   * 
- * - * @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null - * @throws FileNotFoundException - * @throws IOException - */ - public static Observer guessFileEncoding(File file, int languageHint) - throws FileNotFoundException, IOException { - return guessFileEncoding(file, new nsDetector(languageHint)); - } - - /** - * 获取文件的编码 - * - * @param file - * @param det - * @return - * @throws FileNotFoundException - * @throws IOException - */ - private static Observer guessFileEncoding(File file, nsDetector det) - throws FileNotFoundException, IOException { - // new Observer - Observer observer = new Observer(); - // set Observer - // The Notify() will be called when a matching charset is found. - det.Init(observer); - - BufferedInputStream imp = new BufferedInputStream(new FileInputStream( - file)); - byte[] buf = new byte[1024]; - int len; - boolean done = false; - boolean isAscii = false; - - while ((len = imp.read(buf, 0, buf.length)) != -1) { - // Check if the stream is only ascii. - isAscii = det.isAscii(buf, len); - if (isAscii) { - break; - } - // DoIt if non-ascii and not done yet. - done = det.DoIt(buf, len, false); - if (done) { - break; - } - } - imp.close(); - det.DataEnd(); - - if (isAscii) { - observer.encoding = "ASCII"; - observer.found = true; - } - - if (!observer.isFound()) { - String[] prob = det.getProbableCharsets(); - // // 这里将可能的字符集组合起来返回 - // for (int i = 0; i < prob.length; i++) { - // if (i == 0) { - // encoding = prob[i]; - // } else { - // encoding += "," + prob[i]; - // } - // } - if (prob.length > 0) { - // 在没有发现情况下,去第一个可能的编码 - observer.encoding = prob[0]; - } else { - observer.encoding = null; - } - } - return observer; - } - - /** - * @author liaohongwei - * @Description: 文件字符编码观察者, 但判断出字符编码时候调用 - * @date 2016年6月20日 下午2:27:06 - */ - public static class Observer implements nsICharsetDetectionObserver { - - /** - * @Fields encoding : 字符编码 - */ - private String encoding = null; - /** - * @Fields found : 是否找到字符集 - */ - private boolean found = false; - - @Override - public void Notify(String charset) { - this.encoding = charset; - this.found = true; - } - - public String getEncoding() { - return encoding; - } - - public boolean isFound() { - return found; - } - - @Override - public String toString() { - return "Observer [encoding=" + encoding + ", found=" + found + "]"; - } - } - -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/FileUtils.java b/jodconverter-web/src/main/java/com/yudianbank/utils/FileUtils.java deleted file mode 100644 index 7c59ba8c..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/FileUtils.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.yudianbank.utils; - -import com.google.common.collect.Lists; -import org.redisson.api.RMapCache; -import org.redisson.api.RedissonClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.io.*; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * - * @author yudian-it - * @date 2017/11/13 - */ -@Component -public class FileUtils { - - final String REDIS_FILE_PREVIEW_PDF_KEY = "converted-preview-pdf-file"; - final String REDIS_FILE_PREVIEW_IMGS_KEY = "converted-preview-imgs-file";//压缩包内图片文件集合 - @Autowired - RedissonClient redissonClient; - @Value("${file.dir}") - String fileDir; - - @Value("${converted.file.charset}") - String charset; - - @Value("${simText}") - String[] simText; - /** - * 已转换过的文件集合(redis缓存) - * @return - */ - public Map listConvertedFiles() { - RMapCache convertedList = redissonClient.getMapCache(REDIS_FILE_PREVIEW_PDF_KEY); - return convertedList; - } - - /** - * 已转换过的文件,根据文件名获取 - * @return - */ - public String getConvertedFile(String key) { - RMapCache convertedList = redissonClient.getMapCache(REDIS_FILE_PREVIEW_PDF_KEY); - return convertedList.get(key); - } - - /** - * 查看文件类型(防止参数中存在.点号或者其他特殊字符,所以先抽取文件名,然后再获取文件类型) - * - * @param url - * @return - */ - public String typeFromUrl(String url) { - String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); - String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); - String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); - if (listPictureTypes().contains(fileType.toLowerCase())) { - fileType = "picture"; - } - if (listArchiveTypes().contains(fileType.toLowerCase())) { - fileType = "compress"; - } - if (listOfficeTypes().contains(fileType.toLowerCase())) { - fileType = "office"; - } - if (Arrays.asList(simText).contains(fileType.toLowerCase())) { - fileType = "simText"; - } - return fileType; - } - /** - * 从url中剥离出文件名 - * @param url - * 格式如:http://keking.ufile.ucloud.com.cn/20171113164107_月度绩效表模板(新).xls?UCloudPublicKey=ucloudtangshd@weifenf.com14355492830001993909323&Expires=&Signature=I D1NOFtAJSPT16E6imv6JWuq0k= - * @return - */ - public String getFileNameFromURL(String url) { - // 因为url的参数中可能会存在/的情况,所以直接url.lastIndexOf("/")会有问题 - // 所以先从?处将url截断,然后运用url.lastIndexOf("/")获取文件名 - String noQueryUrl = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?"): url.length()); - String fileName = noQueryUrl.substring(noQueryUrl.lastIndexOf("/") + 1); - return fileName; - } - - /** - * 获取文件后缀 - * @param fileName - * @return - */ - public String getSuffixFromFileName(String fileName) { - String suffix = fileName.substring(fileName.lastIndexOf(".")); - return suffix; - } - - /** - * 从路径中获取 - * @param path - * 类似这种:C:\Users\yudian-it\Downloads - * @return - */ - public String getFileNameFromPath(String path) { - return path.substring(path.lastIndexOf(File.separator) + 1); - } - - public List listPictureTypes(){ - List list = Lists.newArrayList(); - list.add("jpg"); - list.add("jpeg"); - list.add("png"); - list.add("gif"); - list.add("bmp"); - return list; - } - - public List listArchiveTypes(){ - List list = Lists.newArrayList(); - list.add("rar"); - list.add("zip"); - list.add("jar"); - list.add("7-zip"); - list.add("tar"); - list.add("gzip"); - list.add("7z"); - return list; - } - - public List listOfficeTypes() { - List list = Lists.newArrayList(); - list.add("docx"); - list.add("doc"); - list.add("xls"); - list.add("xlsx"); - list.add("ppt"); - list.add("pptx"); - return list; - } - - /** - * 获取相对路径 - * @param absolutePath - * @return - */ - public String getRelativePath(String absolutePath) { - return absolutePath.substring(fileDir.length()); - } - - public void addConvertedFile(String fileName, String value){ - RMapCache convertedList = redissonClient.getMapCache(REDIS_FILE_PREVIEW_PDF_KEY); - convertedList.fastPut(fileName, value); - } - - /** - * 获取redis中压缩包内图片文件 - * @param fileKey - * @return - */ - public List getRedisImgUrls(String fileKey){ - RMapCache convertedList = redissonClient.getMapCache(REDIS_FILE_PREVIEW_IMGS_KEY); - return convertedList.get(fileKey); - } - - /** - * 设置redis中压缩包内图片文件 - * @param fileKey - * @param imgs - */ - public void setRedisImgUrls(String fileKey,List imgs){ - RMapCache convertedList = redissonClient.getMapCache(REDIS_FILE_PREVIEW_IMGS_KEY); - convertedList.fastPut(fileKey,imgs); - } - /** - * 判断文件编码格式 - * @param path - * @return - */ - public String getFileEncodeUTFGBK(String path){ - String enc = Charset.forName("GBK").name(); - File file = new File(path); - InputStream in= null; - try { - in = new FileInputStream(file); - byte[] b = new byte[3]; - in.read(b); - in.close(); - if (b[0] == -17 && b[1] == -69 && b[2] == -65) { - enc = Charset.forName("UTF-8").name(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - System.out.println("文件编码格式为:" + enc); - return enc; - } - - /** - * 对转换后的文件进行操作(改变编码方式) - * @param outFilePath - */ - public void doActionConvertedFile(String outFilePath) { - StringBuffer sb = new StringBuffer(); - try (InputStream inputStream = new FileInputStream(outFilePath); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))){ - String line; - while(null != (line = reader.readLine())){ - if (line.contains("charset=gb2312")) { - line = line.replace("charset=gb2312", "charset=utf-8"); - } - sb.append(line); - } - // 添加sheet控制头 - sb.append(""); - sb.append(""); - sb.append(""); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - // 重新写入文件 - try(FileOutputStream fos = new FileOutputStream(outFilePath); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos))){ - writer.write(sb.toString()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/OfficeToPdf.java b/jodconverter-web/src/main/java/com/yudianbank/utils/OfficeToPdf.java deleted file mode 100644 index b5793c9b..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/OfficeToPdf.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.yudianbank.utils; -import org.artofsolving.jodconverter.OfficeDocumentConverter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import java.io.File; - -/** - * @author yudian-it - */ -@Component -public class OfficeToPdf { - /** - * 获取OpenOffice.org 3的安装目录 - * - * @return OpenOffice.org 3的安装目录 - */ - @Autowired - ConverterUtils converterUtils; - /** - * 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件
- * - * @param inputFilePath - * 源文件路径,如:"e:/test.docx" - * @param outputFilePath - * 目标文件路径,如:"e:/test_docx.pdf" - * @return - */ - public boolean openOfficeToPDF(String inputFilePath, String outputFilePath) { - return office2pdf(inputFilePath, outputFilePath); - } - - - /** - * 转换文件 - * - * @param inputFile - * @param outputFilePath_end - * @param inputFilePath - * @param outputFilePath - * @param converter - */ - public static void converterFile(File inputFile, String outputFilePath_end, - String inputFilePath, String outputFilePath, - OfficeDocumentConverter converter) { - File outputFile = new File(outputFilePath_end); - // 假如目标路径不存在,则新建该路径 - if (!outputFile.getParentFile().exists()) { - outputFile.getParentFile().mkdirs(); - } - converter.convert(inputFile, outputFile); - } - - /** - * 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件 - * - * @param inputFilePath - * 源文件路径,如:"e:/test.docx" - * @param outputFilePath - * 目标文件路径,如:"e:/test_docx.pdf" - * @return - */ - public boolean office2pdf(String inputFilePath, String outputFilePath) { - boolean flag = false; - OfficeDocumentConverter converter = converterUtils.getDocumentConverter(); - if (null != inputFilePath) { - File inputFile = new File(inputFilePath); - // 判断目标文件路径是否为空 - if (null == outputFilePath) { - // 转换后的文件路径 - String outputFilePath_end = getOutputFilePath(inputFilePath); - if (inputFile.exists()) {// 找不到源文件, 则返回 - converterFile(inputFile, outputFilePath_end, inputFilePath, - outputFilePath, converter); - flag = true; - } - } else { - if (inputFile.exists()) {// 找不到源文件, 则返回 - converterFile(inputFile, outputFilePath, inputFilePath, - outputFilePath, converter); - flag = true; - } - } -// officeManager.stop(); - } else { - flag = false; - } - return flag; - } - - /** - * 获取输出文件 - * - * @param inputFilePath - * @return - */ - public static String getOutputFilePath(String inputFilePath) { - String outputFilePath = inputFilePath.replaceAll("." - + getPostfix(inputFilePath), ".pdf"); - return outputFilePath; - } - - /** - * 获取inputFilePath的后缀名,如:"e:/test.pptx"的后缀名为:"pptx" - * - * @param inputFilePath - * @return - */ - public static String getPostfix(String inputFilePath) { - return inputFilePath.substring(inputFilePath.lastIndexOf(".") + 1); - } - -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/PoiExcelToHtml.java b/jodconverter-web/src/main/java/com/yudianbank/utils/PoiExcelToHtml.java deleted file mode 100644 index e08883bf..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/PoiExcelToHtml.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.yudianbank.utils; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.apache.poi.hssf.converter.ExcelToHtmlConverter; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.hwpf.converter.PicturesManager; -import org.apache.poi.hwpf.converter.WordToHtmlConverter; -import org.apache.poi.hwpf.usermodel.Picture; -import org.apache.poi.hwpf.usermodel.PictureType; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.w3c.dom.Document; - - -public class PoiExcelToHtml { -// String path = getClass().getClassLoader().getResource(".").getPath()+File.separator+"static"+File.separator; - public static void excelConvert(URL url) { - try { - String path = ""; - -// http://keking.ufile.ucloud.com.cn/20171101152525_左晓晖2017年9.xls?UCloudPublicKey=ucloudtangshd@weifenf.com14355492830001993909323&Expires=&Signature=1n8ASiYMcfiF30YHxwpzwfqmlM0= -// URL url = new URL("http://keking.ufile.ucloud.com.cn/20171101150322_运费贷信审资料(给予客户收集版).xlsx?UCloudPublicKey=ucloudtangshd@weifenf.com14355492830001993909323&Expires=&Signature=RRVFIICITMNFed1LQgB10WdKHiE="); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - //设置超时间为3秒 - conn.setConnectTimeout(3*1000); - //防止屏蔽程序抓取而返回403错误 - conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); - //得到输入流 - InputStream inputStream = conn.getInputStream(); - HSSFWorkbook excelBook = new HSSFWorkbook(inputStream); - ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()); - excelToHtmlConverter.processWorkbook(excelBook); - List pics = excelBook.getAllPictures(); - if (pics != null) { - for (int i = 0; i < pics.size(); i++) { - Picture pic = (Picture) pics.get(i); - try { - pic.writeImageContent(new FileOutputStream(path + pic.suggestFullFileName())); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - Document htmlDocument = excelToHtmlConverter.getDocument(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - DOMSource domSource = new DOMSource(htmlDocument); - StreamResult streamResult = new StreamResult(outStream); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer serializer = tf.newTransformer(); - serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); - serializer.setOutputProperty(OutputKeys.INDENT, "yes"); - serializer.setOutputProperty(OutputKeys.METHOD, "html"); - serializer.transform(domSource, streamResult); - outStream.close(); - - String content = new String(outStream.toByteArray()); - - } catch (IOException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } catch (TransformerException e) { - e.printStackTrace(); - } - } - - /** - * excel07转html - * filename:要读取的文件所在文件夹 - * filepath:文件名 - * htmlname:生成html名称 - * path:html存放路径 - * */ - public static void excelToHtml () throws Exception{ - String htmlname="exportExcel"+"07Test"+".html"; - - - URL url = new URL("http://keking.ufile.ucloud.com.cn/20171101150322_运费贷信审资料(给予客户收集版).xlsx?UCloudPublicKey=ucloudtangshd@weifenf.com14355492830001993909323&Expires=&Signature=RRVFIICITMNFed1LQgB10WdKHiE="); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - //设置超时间为3秒 - conn.setConnectTimeout(3*1000); - //防止屏蔽程序抓取而返回403错误 - conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); - //得到输入流 - InputStream is = conn.getInputStream(); - - Workbook workbook = null; -// InputStream is = new FileInputStream(filename+"/"+filepath); - try { - String html=""; - workbook = new XSSFWorkbook(is); - for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) { - Sheet sheet = workbook.getSheetAt(numSheet); - if (sheet == null) { - continue; - } - html+="=======================" + sheet.getSheetName() + "=========================

"; - - int firstRowIndex = sheet.getFirstRowNum(); - int lastRowIndex = sheet.getLastRowNum(); - html+=""; - Row firstRow = sheet.getRow(firstRowIndex); - for (int i = firstRow.getFirstCellNum(); i <= firstRow.getLastCellNum(); i++) { - Cell cell = firstRow.getCell(i); - String cellValue = getCellValue(cell, true); - html+=""; - } - - - //行 - for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) { - Row currentRow = sheet.getRow(rowIndex); - html+=""; - if(currentRow!=null){ - - int firstColumnIndex = currentRow.getFirstCellNum(); - int lastColumnIndex = currentRow.getLastCellNum(); - //列 - for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++) { - Cell currentCell = currentRow.getCell(columnIndex); - String currentCellValue = getCellValue(currentCell, true); - html+=""; - } - }else{ - html+=" "; - } - html+=""; - } - html+="
" + cellValue + "
"+currentCellValue + "
"; - - - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - DOMSource domSource = new DOMSource (); - StreamResult streamResult = new StreamResult (outStream); - - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer serializer = tf.newTransformer(); - serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8"); - serializer.setOutputProperty (OutputKeys.INDENT, "yes"); - serializer.setOutputProperty (OutputKeys.METHOD, "html"); - serializer.transform (domSource, streamResult); - outStream.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - } - - /** - * 读取单元格 - * - */ - private static String getCellValue(Cell cell, boolean treatAsStr) { - if (cell == null) { - return ""; - } - - if (treatAsStr) { - cell.setCellType(Cell.CELL_TYPE_STRING); - } - - if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { - return String.valueOf(cell.getBooleanCellValue()); - } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { - return String.valueOf(cell.getNumericCellValue()); - } else { - return String.valueOf(cell.getStringCellValue()); - } - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/ShedulerClean.java b/jodconverter-web/src/main/java/com/yudianbank/utils/ShedulerClean.java deleted file mode 100644 index f22dbb42..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/ShedulerClean.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.yudianbank.utils; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component -public class ShedulerClean { - @Value("${file.dir}") - String fileDir; - -// @Scheduled(cron = "0 0 23 * * ?") //每晚23点执行一次 - public void clean(){ - System.out.println("执行一次清空文件夹"); - DeleteFileUtil.deleteDirectory(fileDir); - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/SimTextUtil.java b/jodconverter-web/src/main/java/com/yudianbank/utils/SimTextUtil.java deleted file mode 100644 index 8b0b727e..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/SimTextUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.yudianbank.utils; - -import com.yudianbank.param.ReturnResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -/** - * 读取类文本文件 - * @author yudian-it - * @date 2017/12/13 - */ -@Component -public class SimTextUtil { - @Value("${file.dir}") - String fileDir; - @Autowired - DownloadUtils downloadUtils; - - public ReturnResponse readSimText(String url, String fileName){ - ReturnResponse response = downloadUtils.downLoad(url, "txt", fileName); - return response; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/WordToHtml.java b/jodconverter-web/src/main/java/com/yudianbank/utils/WordToHtml.java deleted file mode 100644 index 0a719755..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/WordToHtml.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.yudianbank.utils; - -import java.io.*; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.*; -import java.util.function.Function; -import java.util.function.ToDoubleFunction; -import java.util.function.ToIntFunction; -import java.util.function.ToLongFunction; - -import com.github.junrar.Archive; -import com.github.junrar.exception.RarException; -import com.github.junrar.rarfile.FileHeader; -import org.apache.commons.compress.archivers.ArchiveException; -import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -import org.apache.commons.compress.archivers.zip.ZipFile; -import org.apache.poi.xwpf.converter.core.FileImageExtractor; -import org.apache.poi.xwpf.converter.core.FileURIResolver; -import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter; -import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -public class WordToHtml { - /** 这是2007版本 转html 已测试成功的代码 07和03版要用两种代码转 但因为后面说要用 - * 38 * 2007版本word转换成html - * 39 * @throws IOException - * 40 - */ - - public static String Word2007ToHtml(InputStream inputStream) throws IOException { - // 1) 加载word文档生成 XWPFDocument对象 - XWPFDocument document = new XWPFDocument(inputStream); - - // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录) -// File imageFolderFile = new File("/Users/zuoxiaohui/IdeaProjects/yudian-preview-boot/yudian-preview-boot/src/main/resources/picture/"); - File imageFolderFile = new File("/Users/zuoxiaohui/IdeaProjects/yudian-preview-boot/yudian-preview-boot/src/main/resources/static/"); - XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile)); - options.setExtractor(new FileImageExtractor(imageFolderFile)); - options.setIgnoreStylesIfUnused(false); - options.setFragment(true); - - File file = new File("/Users/zuoxiaohui/Test/" + "test.html"); - // 3) 将 XWPFDocument转换成XHTML - OutputStream out = new FileOutputStream(file); - XHTMLConverter.getInstance().convert(document, out, options); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - XHTMLConverter.getInstance().convert(document, baos, options); - String content = baos.toString(); - System.out.println(content); - baos.close(); - return content; - - - } - - public static void main(String[] args) throws IOException, ArchiveException, RarException { - System.out.println(URLEncoder.encode(" ", "UTF-8")); - System.out.println(URLDecoder.decode(" http://keking.ufile.ucloud.com.cn/20171230213253_2017%E5%B9%B4%20%E5%BA%A6%E7%BB%A9%E6%95%88%E8%80%83%E6%A0%B8%E8%A1%A8%E5%8F%8A%E8%AF%84%E4%BC%98%E6%8E%A8%E8%8D%90%E8%A1%A8.xlsxUCloudPublicKey=ucloudtangshd@weifenf.com14355492830001993909323&Expires=&Signature=Pbi/J6UcOZcvGwhAwExe3SpxrGo=", "UTF-8")); - } - -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/utils/ZipReader.java b/jodconverter-web/src/main/java/com/yudianbank/utils/ZipReader.java deleted file mode 100644 index e165e1ea..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/utils/ZipReader.java +++ /dev/null @@ -1,428 +0,0 @@ -package com.yudianbank.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.junrar.Archive; -import com.github.junrar.exception.RarException; -import com.github.junrar.rarfile.FileHeader; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; -import org.apache.commons.compress.archivers.zip.ZipFile; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; - -import java.io.*; -import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * - * @author yudian-it - * @date 2017/11/27 - */ -@Component -public class ZipReader { - - @Autowired - FileUtils fileUtils; - @Value("${file.dir}") - String fileDir; - - ExecutorService executors = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); - - /** - * 读取压缩文件 - * 文件压缩到统一目录fileDir下,并且命名使用压缩文件名+文件名因为文件名 - * 可能会重复(在系统中对于同一种类型的材料压缩文件内的文件是一样的,如果文件名 - * 重复,那么这里会被覆盖[同一个压缩文件中的不同目录中的相同文件名暂时不考虑]) - * 注: - *

- * 文件名命名中的参数的说明: - * 1.archiveName,为避免解压的文件中有重名的文件会彼此覆盖,所以加上了archiveName,因为在ufile中archiveName - * 是不会重复的。 - * 2.level,这里层级结构的列表我是通过一个map来构造的,map的key是文件的名字,值是对应的文件,这样每次向map中 - * 加入节点的时候都会获取父节点是否存在,存在则会获取父节点的value并将当前节点加入到父节点的childList中(这里利用 - * 的是java语言的引用的特性)。 - *

- * @param filePath - */ - public String readZipFile(String filePath,String fileKey) { - String archiveSeparator = "/"; - Map appender = Maps.newHashMap(); - List imgUrls=Lists.newArrayList(); - String baseUrl= (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl",0); - String archiveFileName = fileUtils.getFileNameFromPath(filePath); - try { - ZipFile zipFile = new ZipFile(filePath, fileUtils.getFileEncodeUTFGBK(filePath)); - Enumeration entries = zipFile.getEntries(); - // 排序 - entries = sortZipEntries(entries); - List> entriesToBeExtracted = Lists.newArrayList(); - while (entries.hasMoreElements()){ - ZipArchiveEntry entry = entries.nextElement(); - String fullName = entry.getName(); - int level = fullName.split(archiveSeparator).length; - // 展示名 - String originName = getLastFileName(fullName, archiveSeparator); - String childName = level + "_" + originName; - boolean directory = entry.isDirectory(); - if (!directory) { - childName = archiveFileName + "_" + originName; - entriesToBeExtracted.add(Collections.singletonMap(childName, entry)); - } - String parentName = getLast2FileName(fullName, archiveSeparator, archiveFileName); - parentName = (level-1) + "_" + parentName; - String type=fileUtils.typeFromUrl(childName); - if (type.equalsIgnoreCase("picture")){//添加图片文件到图片列表 - imgUrls.add(baseUrl+childName); - } - FileNode node = new FileNode(originName, childName, parentName, new ArrayList<>(), directory,fileKey); - addNodes(appender, parentName, node); - appender.put(childName, node); - } - // 开启新的线程处理文件解压 - executors.submit(new ZipExtractorWorker(entriesToBeExtracted, zipFile, filePath)); - fileUtils.setRedisImgUrls(fileKey,imgUrls); - return new ObjectMapper().writeValueAsString(appender.get("")); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } - - - - /** - * 排序zipEntries(对原来列表倒序) - * @param entries - */ - private Enumeration sortZipEntries(Enumeration entries) { - List sortedEntries = Lists.newArrayList(); - while(entries.hasMoreElements()){ - sortedEntries.add(entries.nextElement()); - } - Collections.sort(sortedEntries, Comparator.comparingInt(o -> o.getName().length())); - return Collections.enumeration(sortedEntries); - } - - public String unRar(String filePath,String fileKey){ - Map appender = Maps.newHashMap(); - List imgUrls=Lists.newArrayList(); - String baseUrl= (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl",0); - try { - Archive archive = new Archive(new File(filePath)); - List headers = archive.getFileHeaders(); - headers = sortedHeaders(headers); - String archiveFileName = fileUtils.getFileNameFromPath(filePath); - List> headersToBeExtracted = Lists.newArrayList(); - for (FileHeader header : headers) { - String fullName; - if (header.isUnicode()) { - fullName = header.getFileNameW(); - }else { - fullName = header.getFileNameString(); - } - // 展示名 - String originName = getLastFileName(fullName, "\\"); - String childName = originName; - boolean directory = header.isDirectory(); - if (!directory) { - childName = archiveFileName + "_" + originName; - headersToBeExtracted.add(Collections.singletonMap(childName, header)); - } - String parentName = getLast2FileName(fullName, "\\", archiveFileName); - String type=fileUtils.typeFromUrl(childName); - if (type.equalsIgnoreCase("picture")){//添加图片文件到图片列表 - imgUrls.add(baseUrl+childName); - } - FileNode node = new FileNode(originName, childName, parentName, new ArrayList<>(), directory,fileKey); - addNodes(appender, parentName, node); - appender.put(childName, node); - } - executors.submit(new RarExtractorWorker(headersToBeExtracted, archive, filePath)); - fileUtils.setRedisImgUrls(fileKey,imgUrls); - return new ObjectMapper().writeValueAsString(appender.get("")); - } catch (RarException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - private void addNodes(Map appender, String parentName, FileNode node) { - if (appender.containsKey(parentName)) { - appender.get(parentName).getChildList().add(node); - appender.get(parentName).getChildList().sort((final FileNode h1, final FileNode h2) -> h1.getOriginName().compareTo(h2.getOriginName()));//排序 - }else { // 根节点 - FileNode nodeRoot = new FileNode(parentName, parentName, "", new ArrayList<>(), true); - nodeRoot.getChildList().add(node); - appender.put("", nodeRoot); - appender.put(parentName, nodeRoot); - } - } - - private List sortedHeaders(List headers) { - List sortedHeaders = new ArrayList<>(); - Map mapHeaders = new TreeMap<>(); - headers.forEach(header -> mapHeaders.put(header.getFileNameW().length(), header)); - for (Map.Entry entry : mapHeaders.entrySet()){ - for (FileHeader header : headers) { - if (entry.getKey().intValue() == header.getFileNameW().length()) { - sortedHeaders.add(header); - } - } - } - return sortedHeaders; - } - - /** - * 获取倒数第二个文件(夹)名 - * @param fullName - * @param seperator - * 压缩文件解压后,不同的压缩格式分隔符不一样zip是/,而rar是\ - * @param rootName - * 根目录名:如果倒数第二个路径为空,那么赋值为rootName - * @return - */ - private static String getLast2FileName(String fullName, String seperator, String rootName) { - if (fullName.endsWith(seperator)) { - fullName = fullName.substring(0, fullName.length()-1); - } - // 1.获取剩余部分 - int endIndex = fullName.lastIndexOf(seperator); - String leftPath = fullName.substring(0, endIndex == -1 ? 0 : endIndex); - if (null != leftPath && leftPath.length() > 1) { - // 2.获取倒数第二个 - return getLastFileName(leftPath, seperator); - }else { - return rootName; - } - } - - /** - * 获取最后一个文件(夹)的名字 - * @param fullName - * @param seperator - * 压缩文件解压后,不同的压缩格式分隔符不一样zip是/,而rar是\ - * @return - */ - private static String getLastFileName(String fullName, String seperator) { - if (fullName.endsWith(seperator)) { - fullName = fullName.substring(0, fullName.length()-1); - } - String newName = fullName; - if (null != fullName && fullName.contains(seperator)) { - newName = fullName.substring(fullName.lastIndexOf(seperator) + 1); - } - return newName; - } - - /** - * 文件节点(区分文件上下级) - */ - public class FileNode{ - - private String originName; - private String fileName; - private String parentFileName; - private boolean directory; - private String fileKey;//用于图片预览时寻址 - private List childList; - - public FileNode() { - } - - public FileNode(String originName, String fileName, String parentFileName, List childList, boolean directory) { - this.originName = originName; - this.fileName = fileName; - this.parentFileName = parentFileName; - this.childList = childList; - this.directory = directory; - } - public FileNode(String originName, String fileName, String parentFileName, List childList, boolean directory,String fileKey) { - this.originName = originName; - this.fileName = fileName; - this.parentFileName = parentFileName; - this.childList = childList; - this.directory = directory; - this.fileKey=fileKey; - } - public String getFileKey() { - return fileKey; - } - - public void setFileKey(String fileKey) { - this.fileKey = fileKey; - } - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public String getParentFileName() { - return parentFileName; - } - - public void setParentFileName(String parentFileName) { - this.parentFileName = parentFileName; - } - - public List getChildList() { - return childList; - } - - public void setChildList(List childList) { - this.childList = childList; - } - - @Override - public String toString() { - try { - return new ObjectMapper().writeValueAsString(this); - } catch (JsonProcessingException e) { - e.printStackTrace(); - return ""; - } - } - - public String getOriginName() { - return originName; - } - - public void setOriginName(String originName) { - this.originName = originName; - } - - public boolean isDirectory() { - return directory; - } - - public void setDirectory(boolean directory) { - this.directory = directory; - } - } - - /** - * Zip文件抽取线程 - */ - class ZipExtractorWorker implements Runnable { - - private List> entriesToBeExtracted; - private ZipFile zipFile; - private String filePath; - - public ZipExtractorWorker(List> entriesToBeExtracted, ZipFile zipFile, String filePath) { - this.entriesToBeExtracted = entriesToBeExtracted; - this.zipFile = zipFile; - this.filePath = filePath; - } - - @Override - public void run() { - System.out.println("解析压缩文件开始《《《《《《《《《《《《《《《《《《《《《《《"); - for (Map entryMap : entriesToBeExtracted) { - String childName = entryMap.keySet().iterator().next(); - ZipArchiveEntry entry = entryMap.values().iterator().next(); - try { - extractZipFile(childName, zipFile.getInputStream(entry)); - } catch (IOException e) { - e.printStackTrace(); - } - } - try { - zipFile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - if (new File(filePath).exists()) { - new File(filePath).delete(); - } - System.out.println("解析压缩文件结束《《《《《《《《《《《《《《《《《《《《《《《"); - } - - - /** - * 读取压缩文件并写入到fileDir文件夹下 - * @param childName - * @param zipFile - */ - private void extractZipFile(String childName, InputStream zipFile) { - String outPath = fileDir + childName; - try (OutputStream ot = new FileOutputStream(outPath)){ - byte[] inByte = new byte[1024]; - int len; - while ((-1 != (len = zipFile.read(inByte)))){ - ot.write(inByte, 0, len); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - /** - * Rar文件抽取 - */ - class RarExtractorWorker implements Runnable { - private List> headersToBeExtracted; - private Archive archive; - /** - * 用以删除源文件 - */ - private String filePath; - - public RarExtractorWorker(List> headersToBeExtracted, Archive archive, String filePath) { - this.headersToBeExtracted = headersToBeExtracted; - this.archive = archive; - this.filePath = filePath; - } - - @Override - public void run() { - System.out.println("解析压缩文件开始《《《《《《《《《《《《《《《《《《《《《《《"); - for (Map entryMap : headersToBeExtracted) { - String childName = entryMap.keySet().iterator().next(); - extractRarFile(childName, entryMap.values().iterator().next(), archive); - } - try { - archive.close(); - } catch (IOException e) { - e.printStackTrace(); - } - if (new File(filePath).exists()) { - new File(filePath).delete(); - } - System.out.println("解析压缩文件结束《《《《《《《《《《《《《《《《《《《《《《《"); - } - - /** - * 抽取rar文件到指定目录下 - * @param childName - * @param header - * @param archive - */ - private void extractRarFile(String childName, FileHeader header, Archive archive) { - String outPath = fileDir + childName; - try(OutputStream ot = new FileOutputStream(outPath)) { - archive.extractFile(header, ot); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (RarException e) { - e.printStackTrace(); - } - } - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/web/controller/FileController.java b/jodconverter-web/src/main/java/com/yudianbank/web/controller/FileController.java deleted file mode 100644 index 331032bc..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/web/controller/FileController.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.yudianbank.web.controller; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.yudianbank.param.ReturnResponse; -import com.yudianbank.utils.FileUtils; -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.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.io.*; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * - * @author yudian-it - * @date 2017/12/1 - */ -@RestController -public class FileController { - @Value("${file.dir}") - String fileDir; - @Autowired - FileUtils fileUtils; - String demoDir = "demo"; - String demoPath = demoDir + File.separator; - - @RequestMapping(value = "fileUpload", method = RequestMethod.POST) - public String fileUpload(@RequestParam("file") MultipartFile file, - HttpServletRequest request) throws JsonProcessingException { - String fileName = file.getOriginalFilename(); - // 判断该文件类型是否有上传过,如果上传过则提示不允许再次上传 - if (existsTypeFile(fileName)) { - return new ObjectMapper().writeValueAsString(new ReturnResponse(1, "每一种类型只可以上传一个文件,请先删除原有文件再次上传", null)); - } - File outFile = new File(fileDir + demoPath); - if (!outFile.exists()) { - outFile.mkdirs(); - } - try(InputStream in = file.getInputStream(); - OutputStream ot = new FileOutputStream(fileDir + demoPath + fileName)){ - byte[] buffer = new byte[1024]; - int len; - while ((-1 != (len = in.read(buffer)))) { - ot.write(buffer, 0, len); - } - return new ObjectMapper().writeValueAsString(new ReturnResponse(0, "SUCCESS", null)); - } catch (IOException e) { - e.printStackTrace(); - return new ObjectMapper().writeValueAsString(new ReturnResponse(1, "FAILURE", null)); - } - } - - @RequestMapping(value = "deleteFile", method = RequestMethod.GET) - public String deleteFile(String fileName) throws JsonProcessingException { - if (fileName.contains("/")) { - fileName = fileName.substring(fileName.lastIndexOf("/") + 1); - } - File file = new File(fileDir + demoPath + fileName); - if (file.exists()) { - file.delete(); - } - return new ObjectMapper().writeValueAsString(new ReturnResponse(0, "SUCCESS", null)); - } - - @RequestMapping(value = "listFiles", method = RequestMethod.GET) - public String getFiles() throws JsonProcessingException { - List> list = Lists.newArrayList(); - File file = new File(fileDir + demoPath); - if (file.exists()) { - Arrays.stream(file.listFiles()).forEach(file1 -> list.add(ImmutableMap.of("fileName", demoDir + "/" + file1.getName()))); - } - return new ObjectMapper().writeValueAsString(list); - } - - private String getFileName(String name) { - String suffix = name.substring(name.lastIndexOf(".")); - String nameNoSuffix = name.substring(0, name.lastIndexOf(".")); - String uuid = UUID.randomUUID().toString(); - return uuid + "-" + nameNoSuffix + suffix; - } - - /** - * 是否存在该类型的文件 - * @return - * @param fileName - */ - private boolean existsTypeFile(String fileName) { - boolean result = false; - String suffix = fileUtils.getSuffixFromFileName(fileName); - File file = new File(fileDir + demoPath); - if (file.exists()) { - for(File file1 : file.listFiles()){ - String existsFileSuffix = fileUtils.getSuffixFromFileName(file1.getName()); - if (suffix.equals(existsFileSuffix)) { - result = true; - break; - } - } - } - return result; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/web/controller/IndexController.java b/jodconverter-web/src/main/java/com/yudianbank/web/controller/IndexController.java deleted file mode 100644 index 571422e2..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/web/controller/IndexController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.yudianbank.web.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * 页面跳转 - * @author yudian-it - * @date 2017/12/27 - */ -@Controller -public class IndexController { - - @RequestMapping(value = "index", method = RequestMethod.GET) - public String go2Index(){ - return "index"; - } - - @RequestMapping(value = "/", method = RequestMethod.GET) - public String root() { - return "redirect:/index"; - } -} diff --git a/jodconverter-web/src/main/java/com/yudianbank/web/controller/OnlinePreviewController.java b/jodconverter-web/src/main/java/com/yudianbank/web/controller/OnlinePreviewController.java deleted file mode 100644 index 4109afd4..00000000 --- a/jodconverter-web/src/main/java/com/yudianbank/web/controller/OnlinePreviewController.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.yudianbank.web.controller; - -import com.google.common.collect.Lists; -import com.yudianbank.param.ReturnResponse; -import com.yudianbank.utils.*; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLDecoder; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * @author yudian-it - */ -@Controller -public class OnlinePreviewController { - @Autowired - private OfficeToPdf officeToPdf; - @Autowired - FileUtils fileUtils; - @Autowired - DownloadUtils downloadUtils; - @Autowired - ZipReader zipReader; - @Autowired - SimTextUtil simTextUtil; - @Value("${file.dir}") - String fileDir; - - - /** - * @param url - * @param model - * @return - */ - @RequestMapping(value = "onlinePreview", method = RequestMethod.GET) - public String onlinePreview(String url, Model model, HttpServletRequest req) throws UnsupportedEncodingException { - // 路径转码 - String decodedUrl = URLDecoder.decode(url, "utf-8"); - String type = fileUtils.typeFromUrl(url); - String suffix = suffixFromUrl(url); - // 抽取文件并返回文件列表 - String fileName = fileUtils.getFileNameFromURL(decodedUrl); - model.addAttribute("fileType", suffix); - if (type.equalsIgnoreCase("picture")) { - List imgUrls = Lists.newArrayList(url); - try{ - String fileKey = req.getParameter("fileKey"); - imgUrls.clear(); - imgUrls.addAll(fileUtils.getRedisImgUrls(fileKey)); - }catch (Exception e){ - imgUrls = Lists.newArrayList(url); - } - model.addAttribute("imgurls", imgUrls); - model.addAttribute("currentUrl",url); - return "picture"; - } else if (type.equalsIgnoreCase("simText")) { - ReturnResponse response = simTextUtil.readSimText(decodedUrl, fileName); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - model.addAttribute("ordinaryUrl", response.getMsg()); - return "txt"; - } else if (type.equalsIgnoreCase("pdf")) { - model.addAttribute("pdfUrl", url); - return "pdf"; - } else if (type.equalsIgnoreCase("compress")) { - String fileTree = null; - // 判断文件名是否存在(redis缓存读取) - if (!StringUtils.hasText(fileUtils.getConvertedFile(fileName))) { - ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, fileName); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - String filePath = response.getContent(); - if ("zip".equalsIgnoreCase(suffix) || "jar".equalsIgnoreCase(suffix) || "gzip".equalsIgnoreCase(suffix)) { - fileTree = zipReader.readZipFile(filePath, fileName); - } else if ("rar".equalsIgnoreCase(suffix)) { - fileTree = zipReader.unRar(filePath, fileName); - } - fileUtils.addConvertedFile(fileName, fileTree); - } else { - fileTree = fileUtils.getConvertedFile(fileName); - } - if (null != fileTree) { - model.addAttribute("fileTree", fileTree); - return "compress"; - } else { - model.addAttribute("msg", "压缩文件类型不受支持,尝试在压缩的时候选择RAR4格式"); - return "fileNotSupported"; - } - } else if ("office".equalsIgnoreCase(type)) { - boolean isHtml = suffix.equalsIgnoreCase("xls") - || suffix.equalsIgnoreCase("xlsx"); - String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf"); - // 判断之前是否已转换过,如果转换过,直接返回,否则执行转换 - if (!fileUtils.listConvertedFiles().containsKey(pdfName)) { - String filePath = fileDir + fileName; - if (!new File(filePath).exists()) { - ReturnResponse response = downloadUtils.downLoad(decodedUrl, suffix, null); - if (0 != response.getCode()) { - model.addAttribute("msg", response.getMsg()); - return "fileNotSupported"; - } - filePath = response.getContent(); - } - String outFilePath = fileDir + pdfName; - if (StringUtils.hasText(outFilePath)) { - officeToPdf.openOfficeToPDF(filePath, outFilePath); - File f = new File(filePath); - if (f.exists()) { - f.delete(); - } - if (isHtml) { - // 对转换后的文件进行操作(改变编码方式) - fileUtils.doActionConvertedFile(outFilePath); - } - // 加入缓存 - fileUtils.addConvertedFile(pdfName, fileUtils.getRelativePath(outFilePath)); - } - } - model.addAttribute("pdfUrl", pdfName); - return isHtml ? "html" : "pdf"; - } else { - model.addAttribute("msg", "系统还不支持该格式文件的在线预览," + - "如有需要请按下方显示的邮箱地址联系系统维护人员"); - return "fileNotSupported"; - } - } - - /** - * 多图片切换预览 - * - * @param model - * @param req - * @return - * @throws UnsupportedEncodingException - */ - @RequestMapping(value = "picturesPreview", method = RequestMethod.GET) - public String picturesPreview(String urls, Model model, HttpServletRequest req) throws UnsupportedEncodingException { - // 路径转码 - String decodedUrl = URLDecoder.decode(urls, "utf-8"); - // 抽取文件并返回文件列表 - String[] imgs = decodedUrl.split("|"); - List imgurls = Arrays.asList(imgs); - model.addAttribute("imgurls", imgurls); - return "picture"; - } - - - private String suffixFromUrl(String url) { - String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); - String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); - String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); - return fileType; - } - - /** - * 根据url获取文件内容 - * 当pdfjs读取存在跨域问题的文件时将通过此接口读取 - * - * @param urlPath - * @param resp - */ - @RequestMapping(value = "/getCorsFile", method = RequestMethod.GET) - public void getCorsFile(String urlPath, HttpServletResponse resp) { - InputStream inputStream = null; - try { - String strUrl = urlPath.trim(); - URL url = new URL(strUrl); - //打开请求连接 - URLConnection connection = url.openConnection(); - HttpURLConnection httpURLConnection = (HttpURLConnection) connection; - httpURLConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); - inputStream = httpURLConnection.getInputStream(); - byte[] bs = new byte[1024]; - int len; - while (-1 != (len = inputStream.read(bs))) { - resp.getOutputStream().write(bs, 0, len); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (inputStream != null) { - IOUtils.closeQuietly(inputStream); - } - } - } - -}