From 6504ae2f45b2bd119270cb54d269269e8bb89e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 25 Mar 2024 02:26:50 +0000 Subject: [PATCH] =?UTF-8?q?!280=20=E4=BC=98=E5=8C=96CAD=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=20*=20=E8=B0=83=E6=95=B4=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20*=20=E7=BB=9F=E4=B8=80=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=A7=84=E8=8C=83=20*=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20=E8=BD=AC=E4=B9=89=E5=90=8E=20=E6=B5=81=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20*=20=E4=BF=AE=E5=A4=8D=20=E8=BD=AC=E4=B9=89=E5=90=8E=20?= =?UTF-8?q?=E6=B5=81=E6=8E=A5=E5=85=A5=E6=96=B9=E6=B3=95=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20*=20CAD=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20*=20=E4=BC=98=E5=8C=96CAD=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=20=E8=B0=83=E6=95=B4CAD=E4=B8=AD=E6=96=AD=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/keking/service/FileHandlerService.java | 152 ++++++++++-------- .../service/impl/CadFilePreviewImpl.java | 2 +- .../main/java/cn/keking/utils/WebUtils.java | 14 +- 3 files changed, 90 insertions(+), 78 deletions(-) diff --git a/server/src/main/java/cn/keking/service/FileHandlerService.java b/server/src/main/java/cn/keking/service/FileHandlerService.java index 146310f47..4aa8b56a9 100644 --- a/server/src/main/java/cn/keking/service/FileHandlerService.java +++ b/server/src/main/java/cn/keking/service/FileHandlerService.java @@ -14,7 +14,6 @@ import com.aspose.cad.fileformats.cad.CadDrawTypeMode; import com.aspose.cad.fileformats.tiff.enums.TiffExpectedFormat; import com.aspose.cad.imageoptions.*; -import com.aspose.cad.internal.Exceptions.TimeoutException; import com.itextpdf.text.pdf.PdfReader; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.pdfbox.pdmodel.PDDocument; @@ -318,6 +317,9 @@ public List pdf2jpg(String fileNameFilePath, String pdfFilePath, String */ public String cadToPdf(String inputFilePath, String outputFilePath, String cadPreviewType, FileAttribute fileAttribute) throws Exception { final InterruptionTokenSource source = new InterruptionTokenSource();//CAD延时 + final SvgOptions SvgOptions = new SvgOptions(); + final PdfOptions pdfOptions = new PdfOptions(); + final TiffOptions TiffOptions = new TiffOptions(TiffExpectedFormat.TiffJpegRgb); if (fileAttribute.isCompressFile()) { //判断 是压缩包的创建新的目录 int index = outputFilePath.lastIndexOf("/"); //截取最后一个斜杠的前面的内容 String folder = outputFilePath.substring(0, index); @@ -327,86 +329,90 @@ public String cadToPdf(String inputFilePath, String outputFilePath, String cadPr path.mkdirs(); } } - Callable call = () -> { - File outputFile = new File(outputFilePath); + File outputFile = new File(outputFilePath); + try { LoadOptions opts = new LoadOptions(); opts.setSpecifiedEncoding(CodePages.SimpChinese); - Image cadImage = Image.load(inputFilePath, opts); - RasterizationQuality rasterizationQuality = new RasterizationQuality(); - rasterizationQuality.setArc(RasterizationQualityValue.High); - rasterizationQuality.setHatch(RasterizationQualityValue.High); - rasterizationQuality.setText(RasterizationQualityValue.High); - rasterizationQuality.setOle(RasterizationQualityValue.High); - rasterizationQuality.setObjectsPrecision(RasterizationQualityValue.High); - rasterizationQuality.setTextThicknessNormalization(true); - CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions(); - cadRasterizationOptions.setBackgroundColor(Color.getWhite()); - cadRasterizationOptions.setPageWidth(cadImage.getWidth()); - cadRasterizationOptions.setPageHeight(cadImage.getHeight()); - cadRasterizationOptions.setUnitType(cadImage.getUnitType()); - cadRasterizationOptions.setAutomaticLayoutsScaling(false); - cadRasterizationOptions.setNoScaling(false); - cadRasterizationOptions.setQuality(rasterizationQuality); - cadRasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor); - cadRasterizationOptions.setExportAllLayoutContent(true); - cadRasterizationOptions.setVisibilityMode(VisibilityMode.AsScreen); - SvgOptions SvgOptions = null; - PdfOptions pdfOptions = null; - TiffOptions TiffOptions = null; - switch (cadPreviewType) { //新增格式方法 - case "svg": - SvgOptions = new SvgOptions(); - SvgOptions.setVectorRasterizationOptions(cadRasterizationOptions); - SvgOptions.setInterruptionToken(source.getToken()); - break; - case "pdf": - pdfOptions = new PdfOptions(); - pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions); - pdfOptions.setInterruptionToken(source.getToken()); - break; - case "tif": - TiffOptions = new TiffOptions(TiffExpectedFormat.TiffJpegRgb); - TiffOptions.setVectorRasterizationOptions(cadRasterizationOptions); - TiffOptions.setInterruptionToken(source.getToken()); - break; - } - try (OutputStream stream = new FileOutputStream(outputFile)) { - switch (cadPreviewType) { + final Image cadImage = Image.load(inputFilePath, opts); + try { + RasterizationQuality rasterizationQuality = new RasterizationQuality(); + rasterizationQuality.setArc(RasterizationQualityValue.High); + rasterizationQuality.setHatch(RasterizationQualityValue.High); + rasterizationQuality.setText(RasterizationQualityValue.High); + rasterizationQuality.setOle(RasterizationQualityValue.High); + rasterizationQuality.setObjectsPrecision(RasterizationQualityValue.High); + rasterizationQuality.setTextThicknessNormalization(true); + CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions(); + cadRasterizationOptions.setBackgroundColor(Color.getWhite()); + cadRasterizationOptions.setPageWidth(cadImage.getWidth()); + cadRasterizationOptions.setPageHeight(cadImage.getHeight()); + cadRasterizationOptions.setUnitType(cadImage.getUnitType()); + cadRasterizationOptions.setAutomaticLayoutsScaling(false); + cadRasterizationOptions.setNoScaling(false); + cadRasterizationOptions.setQuality(rasterizationQuality); + cadRasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor); + cadRasterizationOptions.setExportAllLayoutContent(true); + cadRasterizationOptions.setVisibilityMode(VisibilityMode.AsScreen); + switch (cadPreviewType) { //新增格式方法 case "svg": - cadImage.save(stream, SvgOptions); + SvgOptions.setVectorRasterizationOptions(cadRasterizationOptions); + SvgOptions.setInterruptionToken(source.getToken()); break; case "pdf": - cadImage.save(stream, pdfOptions); + pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions); + pdfOptions.setInterruptionToken(source.getToken()); break; case "tif": - cadImage.save(stream, TiffOptions); + TiffOptions.setVectorRasterizationOptions(cadRasterizationOptions); + TiffOptions.setInterruptionToken(source.getToken()); break; } - } catch (IOException e) { - logger.error("PDFFileNotFoundException,inputFilePath:{}", inputFilePath, e); - return null; - } finally { - //关闭 - if (cadImage != null) { //关闭 + Callable call = () -> { + try (OutputStream stream = new FileOutputStream(outputFile)) { + switch (cadPreviewType) { + case "svg": + cadImage.save(stream, SvgOptions); + break; + case "pdf": + cadImage.save(stream, pdfOptions); + break; + case "tif": + cadImage.save(stream, TiffOptions); + break; + } + } catch (IOException e) { + logger.error("CADFileNotFoundException,inputFilePath:{}", inputFilePath, e); + return null; + } finally { + cadImage.dispose(); + source.interrupt(); //结束任务 + source.dispose(); + } + return "true"; + }; + Future result = pool.submit(call); + try { + result.get(Long.parseLong(ConfigConstants.getCadTimeout()), TimeUnit.SECONDS); + // 如果在超时时间内,没有数据返回:则抛出TimeoutException异常 + } catch (InterruptedException e) { + logger.error("CAD转换文件异常:", e); + return null; + } catch (ExecutionException e) { + logger.error("CAD转换在尝试取得任务结果时出错:", e); + return null; + } catch (TimeoutException e) { + logger.error("CAD转换时间超时:", e); + return null; + } finally { + source.interrupt(); //结束任务 + source.dispose(); cadImage.dispose(); + // pool.shutdownNow(); } - source.interrupt(); //结束任务 + } finally { + source.dispose(); + cadImage.dispose(); } - return "true"; - }; - Future result = pool.submit(call); - try { - // 如果在超时时间内,没有数据返回:则抛出TimeoutException异常 - result.get(Long.parseLong(ConfigConstants.getCadTimeout()), TimeUnit.SECONDS); - } catch (InterruptedException e) { - System.out.println("InterruptedException发生"); - return null; - } catch (ExecutionException e) { - System.out.println("ExecutionException发生"); - return null; - } catch (TimeoutException e) { - System.out.println("TimeoutException发生,意味着线程超时报错"); - return null; } finally { source.dispose(); } @@ -473,7 +479,13 @@ public FileAttribute getFileAttribute(String url, HttpServletRequest req) { } originFileName = KkFileUtils.htmlEscape(originFileName); //文件名处理 boolean isHtmlView = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx") || suffix.equalsIgnoreCase("csv") || suffix.equalsIgnoreCase("xlsm") || suffix.equalsIgnoreCase("xlt") || suffix.equalsIgnoreCase("xltm") || suffix.equalsIgnoreCase("et") || suffix.equalsIgnoreCase("ett") || suffix.equalsIgnoreCase("xlam"); - String cacheFilePrefixName = originFileName.substring(0, originFileName.lastIndexOf(".")) + suffix + "."; //这里统一文件名处理 下面更具类型 各自添加后缀 + String cacheFilePrefixName = null; + try { + cacheFilePrefixName = originFileName.substring(0, originFileName.lastIndexOf(".")) + suffix + "."; //这里统一文件名处理 下面更具类型 各自添加后缀 + } catch (Exception e) { + logger.error("获取文件名后缀错误:", e); + // e.printStackTrace(); + } String cacheFileName = this.getCacheFileName(type, originFileName, cacheFilePrefixName, isHtmlView, isCompressFile); outFilePath = fileDir + cacheFileName; originFilePath = fileDir + originFileName; diff --git a/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java index e5f30141c..155821c33 100644 --- a/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java @@ -58,7 +58,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri e.printStackTrace(); } if (imageUrls == null) { - return otherFilePreview.notSupportedFile(model, fileAttribute, "office转图片异常,请联系管理员"); + return otherFilePreview.notSupportedFile(model, fileAttribute, "CAD转换异常,请联系管理员"); } //是否保留CAD源文件 if (!fileAttribute.isCompressFile() && ConfigConstants.getDeleteSourceFile()) { diff --git a/server/src/main/java/cn/keking/utils/WebUtils.java b/server/src/main/java/cn/keking/utils/WebUtils.java index 9387be725..2209b94c4 100644 --- a/server/src/main/java/cn/keking/utils/WebUtils.java +++ b/server/src/main/java/cn/keking/utils/WebUtils.java @@ -83,7 +83,7 @@ public static String urlEncoderencode(String urlStr) { } if (!UrlEncoderUtils.hasUrlEncoded(fullFileName)) { //判断文件名是否转义 try { - urlStr = URLEncoder.encode(urlStr, "UTF-8").replaceAll("\\+", "%20").replaceAll("%3A", ":").replaceAll("%2F", "/").replaceAll("%3F", "?").replaceAll("%26", "&"); + urlStr = URLEncoder.encode(urlStr, "UTF-8").replaceAll("\\+", "%20").replaceAll("%3A", ":").replaceAll("%2F", "/").replaceAll("%3F", "?").replaceAll("%26", "&").replaceAll("%3D", "="); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } @@ -290,14 +290,14 @@ public static String decodeBase64String(String source, Charset charsets) { try { return new String(Base64Utils.decodeFromString(source.replaceAll(" ", "+").replaceAll("\n", "")), charsets); } catch (Exception e) { - if (e.getMessage().toLowerCase().contains(BASE64_MSG)) { - LOGGER.error("url解码异常,接入方法错误未使用BASE64"); - }else { - LOGGER.error("url解码异常,其他错误", e); - } + if (e.getMessage().toLowerCase().contains(BASE64_MSG)) { + LOGGER.error("url解码异常,接入方法错误未使用BASE64"); + }else { + LOGGER.error("url解码异常,其他错误", e); + } return null; } - } + } /** * 获取 url 的 host