Browse Source

新功能点,加入CAD图纸.dwg文件预览

陈精华 5 years ago
parent
commit
c1a7cd8c46

BIN
jodconverter-web/lib/aspose-cad-19.9.jar


+ 7 - 0
jodconverter-web/pom.xml

@@ -183,6 +183,13 @@
             <artifactId>pdfbox-tools</artifactId>
             <version>2.0.15</version>
         </dependency>
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-cad</artifactId>
+            <version>19.9</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/aspose-cad-19.9.jar</systemPath>
+        </dependency>
     </dependencies>
     <build>
         <resources>

+ 2 - 1
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){

+ 96 - 0
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<String> 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<String> 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";
+    }
+
+
+}

+ 50 - 0
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;
+        }
+    }
+}

+ 4 - 1
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;
     }
     /**