diff --git a/jodconverter-web/lib/aspose-cad-19.9.jar b/jodconverter-web/lib/aspose-cad-19.9.jar
new file mode 100644
index 00000000..ebb54c3c
Binary files /dev/null and b/jodconverter-web/lib/aspose-cad-19.9.jar differ
diff --git a/jodconverter-web/pom.xml b/jodconverter-web/pom.xml
index ef297e1c..db519e12 100644
--- a/jodconverter-web/pom.xml
+++ b/jodconverter-web/pom.xml
@@ -183,6 +183,13 @@
pdfbox-tools
2.0.15
+
+ com.aspose
+ aspose-cad
+ 19.9
+ system
+ ${basedir}/lib/aspose-cad-19.9.jar
+
diff --git a/jodconverter-web/src/main/java/cn/keking/model/FileType.java b/jodconverter-web/src/main/java/cn/keking/model/FileType.java
index 9f4959b4..40495086 100644
--- a/jodconverter-web/src/main/java/cn/keking/model/FileType.java
+++ b/jodconverter-web/src/main/java/cn/keking/model/FileType.java
@@ -11,7 +11,8 @@ public enum FileType {
simText("simTextFilePreviewImpl"),
pdf("pdfFilePreviewImpl"),
other("otherFilePreviewImpl"),
- media("mediaFilePreviewImpl");
+ media("mediaFilePreviewImpl"),
+ cad("cadFilePreviewImpl");
private String instanceName;
FileType(String instanceName){
diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java
new file mode 100644
index 00000000..b00a7c34
--- /dev/null
+++ b/jodconverter-web/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java
@@ -0,0 +1,96 @@
+package cn.keking.service.impl;
+
+import cn.keking.config.ConfigConstants;
+import cn.keking.model.FileAttribute;
+import cn.keking.model.ReturnResponse;
+import cn.keking.service.FilePreview;
+import cn.keking.utils.CadToPdf;
+import cn.keking.utils.DownloadUtils;
+import cn.keking.utils.FileUtils;
+import cn.keking.utils.PdfUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+
+import java.util.List;
+
+/**
+ * @author chenjh
+ * @since 2019/11/21 14:28
+ */
+@Service
+public class CadFilePreviewImpl implements FilePreview {
+
+ private String fileDir = ConfigConstants.getFileDir();
+
+ @Autowired
+ private FileUtils fileUtils;
+
+ @Autowired
+ private DownloadUtils downloadUtils;
+
+ @Autowired
+ private CadToPdf cadToPdf;
+
+ @Autowired
+ private PdfUtils pdfUtils;
+
+ public static final String OFFICE_PREVIEW_TYPE_PDF = "pdf";
+ public static final String OFFICE_PREVIEW_TYPE_IMAGE = "image";
+ public static final String OFFICE_PREVIEW_TYPE_ALLIMAGES = "allImages";
+
+ @Override
+ public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
+ // 预览Type,参数传了就取参数的,没传取系统默认
+ String officePreviewType = model.asMap().get("officePreviewType") == null ? ConfigConstants.getOfficePreviewType() : model.asMap().get("officePreviewType").toString();
+ String baseUrl = (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl",0);
+ String suffix=fileAttribute.getSuffix();
+ String fileName=fileAttribute.getName();
+ String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + "pdf";
+ String outFilePath = fileDir + pdfName;
+ // 判断之前是否已转换过,如果转换过,直接返回,否则执行转换
+ if (!fileUtils.listConvertedFiles().containsKey(pdfName) || !ConfigConstants.isCacheEnabled()) {
+ String filePath = fileDir + fileName;
+ ReturnResponse response = downloadUtils.downLoad(fileAttribute, null);
+ if (0 != response.getCode()) {
+ model.addAttribute("fileType", suffix);
+ model.addAttribute("msg", response.getMsg());
+ return "fileNotSupported";
+ }
+ filePath = response.getContent();
+ if (StringUtils.hasText(outFilePath)) {
+ boolean convertResult = cadToPdf.cadToPdf(filePath, outFilePath);
+ if (!convertResult) {
+ model.addAttribute("fileType", suffix);
+ model.addAttribute("msg", "cad文件转换异常,请联系管理员");
+ return "fileNotSupported";
+ }
+ if (ConfigConstants.isCacheEnabled()) {
+ // 加入缓存
+ fileUtils.addConvertedFile(pdfName, fileUtils.getRelativePath(outFilePath));
+ }
+ }
+ }
+ if (baseUrl != null && (OFFICE_PREVIEW_TYPE_IMAGE.equals(officePreviewType) || OFFICE_PREVIEW_TYPE_ALLIMAGES.equals(officePreviewType))) {
+ List imageUrls = pdfUtils.pdf2jpg(outFilePath, pdfName, baseUrl);
+ if (imageUrls == null || imageUrls.size() < 1) {
+ model.addAttribute("msg", "office转图片异常,请联系管理员");
+ model.addAttribute("fileType",fileAttribute.getSuffix());
+ return "fileNotSupported";
+ }
+ model.addAttribute("imgurls", imageUrls);
+ model.addAttribute("currentUrl", imageUrls.get(0));
+ if (OFFICE_PREVIEW_TYPE_IMAGE.equals(officePreviewType)) {
+ return "officePicture";
+ } else {
+ return "picture";
+ }
+ }
+ model.addAttribute("pdfUrl", pdfName);
+ return "pdf";
+ }
+
+
+}
diff --git a/jodconverter-web/src/main/java/cn/keking/utils/CadToPdf.java b/jodconverter-web/src/main/java/cn/keking/utils/CadToPdf.java
new file mode 100644
index 00000000..3fb97826
--- /dev/null
+++ b/jodconverter-web/src/main/java/cn/keking/utils/CadToPdf.java
@@ -0,0 +1,50 @@
+package cn.keking.utils;
+
+import com.aspose.cad.Color;
+import com.aspose.cad.fileformats.cad.CadDrawTypeMode;
+import com.aspose.cad.imageoptions.CadRasterizationOptions;
+import com.aspose.cad.imageoptions.PdfOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+
+/**
+ * @author chenjhc
+ * @since 2019/11/21 14:34
+ */
+@Component
+public class CadToPdf {
+
+ private final Logger logger = LoggerFactory.getLogger(CadToPdf.class);
+
+ public boolean cadToPdf(String inputFilePath, String outputFilePath) {
+ com.aspose.cad.Image cadImage = com.aspose.cad.Image.load(inputFilePath);
+ CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions();
+ cadRasterizationOptions.setLayouts(new String[]{"Model"});
+ cadRasterizationOptions.setNoScaling(true);
+ cadRasterizationOptions.setBackgroundColor(Color.getWhite());
+ cadRasterizationOptions.setPageWidth(cadImage.getWidth());
+ cadRasterizationOptions.setPageHeight(cadImage.getHeight());
+ cadRasterizationOptions.setPdfProductLocation("center");
+ cadRasterizationOptions.setAutomaticLayoutsScaling(true);
+ cadRasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor);
+ PdfOptions pdfOptions = new PdfOptions();
+ pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions);
+ File outputFile = new File(outputFilePath);
+ OutputStream stream = null;
+ try {
+ stream = new FileOutputStream(outputFile);
+ cadImage.save(stream, pdfOptions);
+ cadImage.close();
+ return true;
+ } catch (FileNotFoundException e) {
+ logger.error("PDFFileNotFoundException", e);
+ return false;
+ }
+ }
+}
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 5853e1dc..7ec13634 100644
--- a/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java
+++ b/jodconverter-web/src/main/java/cn/keking/utils/FileUtils.java
@@ -91,9 +91,12 @@ public class FileUtils {
if (Arrays.asList(media).contains(fileType.toLowerCase())) {
return FileType.media;
}
- if("pdf".equalsIgnoreCase(fileType)){
+ if ("pdf".equalsIgnoreCase(fileType)) {
return FileType.pdf;
}
+ if ("dwg".equalsIgnoreCase(fileType)) {
+ return FileType.cad;
+ }
return FileType.other;
}
/**