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