From c86ca0d8cf02fa719a748268d205a057965ce746 Mon Sep 17 00:00:00 2001 From: gaoxiongzaq Date: Sat, 22 Jul 2023 09:19:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20CAD=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=E6=96=B0=E5=A2=9ECAD=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=92=8CCAD=E8=B6=85=E6=97=B6=E9=99=90?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/config/application.properties | 4 + .../cn/keking/config/ConfigConstants.java | 51 ++++++-- .../keking/config/ConfigRefreshComponent.java | 6 + .../cn/keking/service/FileHandlerService.java | 110 +++++++++--------- 4 files changed, 106 insertions(+), 65 deletions(-) diff --git a/server/src/main/config/application.properties b/server/src/main/config/application.properties index cf2a0287..73f003d0 100644 --- a/server/src/main/config/application.properties +++ b/server/src/main/config/application.properties @@ -142,6 +142,10 @@ pdf2jpg.dpi = ${KK_PDF2JPG_DPI:144} office.type.web = ${KK_OFFICE_TYPE_WEB:web} #Cad类型图片浏览模式:tif(利用前端js插件浏览);svg(转换为svg显示);pdf(转换为pdf后显示,便于打印) cad.preview.type = ${KK_CAD_PREVIEW_TYPE:pdf} +#Cad转换超时设置 +cad.timeout =${KK_CAD_TIMEOUT:90} +#Cad转换线程设置 +cad.thread =${KK_CAD_THREAD:5} #OFFICE转换模块设置 #生成限制 默认不限制 使用方法 (1-5) diff --git a/server/src/main/java/cn/keking/config/ConfigConstants.java b/server/src/main/java/cn/keking/config/ConfigConstants.java index 9a236c13..d1bacc36 100644 --- a/server/src/main/java/cn/keking/config/ConfigConstants.java +++ b/server/src/main/java/cn/keking/config/ConfigConstants.java @@ -58,6 +58,8 @@ public class ConfigConstants { private static Boolean officeExportBookmarks; private static Boolean officeExportNotes; private static Boolean officeDocumentOpenPasswords; + private static String cadTimeout; + private static int cadThread; public static final String DEFAULT_CACHE_ENABLED = "true"; public static final String DEFAULT_TXT_TYPE = "txt,html,htm,asp,jsp,xml,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd"; @@ -89,6 +91,9 @@ public class ConfigConstants { public static final String DEFAULT_DELETE_CAPTCHA = "false"; + public static final String DEFAULT_CAD_TIMEOUT = "90"; + public static final String DEFAULT_CAD_THREAD = "5"; + public static final String DEFAULT_OFFICE_PAQERANQE = "false"; public static final String DEFAULT_OFFICE_WATERMARK = "false"; public static final String DEFAULT_OFFICE_QUALITY = "80"; @@ -469,6 +474,23 @@ public class ConfigConstants { ConfigConstants.deleteSourceFile = deleteSourceFile; } + public static Boolean getDeleteCaptcha() { + return deleteCaptcha; + } + + @Value("${delete.captcha:false}") + public void setDeleteCaptcha(Boolean deleteCaptcha) { + setDeleteCaptchaValue(deleteCaptcha); + } + + public static void setDeleteCaptchaValue(Boolean deleteCaptcha) { + ConfigConstants.deleteCaptcha = deleteCaptcha; + } + + /** + * 以下为cad转换模块设置 + */ + public static String getCadPreviewType() { return cadPreviewType; } @@ -482,17 +504,32 @@ public class ConfigConstants { ConfigConstants.cadPreviewType = cadPreviewType; } - public static Boolean getDeleteCaptcha() { - return deleteCaptcha; + + public static String getCadTimeout() { + return cadTimeout; } - @Value("${delete.captcha:false}") - public void setDeleteCaptcha(Boolean deleteCaptcha) { - setDeleteCaptchaValue(deleteCaptcha); + @Value("${cad.timeout:90}") + public void setCadTimeout(String cadTimeout) { + setCadTimeoutValue(cadTimeout); } - public static void setDeleteCaptchaValue(Boolean deleteCaptcha) { - ConfigConstants.deleteCaptcha = deleteCaptcha; + public static void setCadTimeoutValue(String cadTimeout) { + ConfigConstants.cadTimeout = cadTimeout; + } + + + public static int getCadThread() { + return cadThread; + } + + @Value("${cad.thread:5}") + public void setCadThread(int cadthread) { + setCadThreadValue(cadthread); + } + + public static void setCadThreadValue(int cadthread) { + ConfigConstants.cadThread = cadthread; } /** diff --git a/server/src/main/java/cn/keking/config/ConfigRefreshComponent.java b/server/src/main/java/cn/keking/config/ConfigRefreshComponent.java index d512d56f..3c70e1a2 100644 --- a/server/src/main/java/cn/keking/config/ConfigRefreshComponent.java +++ b/server/src/main/java/cn/keking/config/ConfigRefreshComponent.java @@ -70,6 +70,8 @@ public class ConfigRefreshComponent { boolean officExportBookmarks; boolean officeExportNotes; boolean officeDocumentOpenPasswords; + String cadTimeout; + int cadThread; while (true) { FileReader fileReader = new FileReader(configFilePath); BufferedReader bufferedReader = new BufferedReader(fileReader); @@ -110,6 +112,8 @@ public class ConfigRefreshComponent { officExportBookmarks = Boolean.parseBoolean(properties.getProperty("office.exportbookmarks", ConfigConstants.DEFAULT_OFFICE_EXPORTBOOKMARKS)); officeExportNotes = Boolean.parseBoolean(properties.getProperty("office.exportnotes", ConfigConstants.DEFAULT_OFFICE_EXPORTNOTES)); officeDocumentOpenPasswords = Boolean.parseBoolean(properties.getProperty("office.documentopenpasswords", ConfigConstants.DEFAULT_OFFICE_EOCUMENTOPENPASSWORDS)); + cadTimeout = properties.getProperty("cad.timeout", ConfigConstants.DEFAULT_CAD_TIMEOUT); + cadThread = Integer.parseInt(properties.getProperty("cad.thread", ConfigConstants.DEFAULT_CAD_THREAD)); prohibitArray = prohibit.split(","); ConfigConstants.setCacheEnabledValueValue(cacheEnabled); @@ -145,6 +149,8 @@ public class ConfigRefreshComponent { ConfigConstants.setOfficeDocumentOpenPasswordsValue(officeDocumentOpenPasswords); ConfigConstants.setDeleteSourceFileValue(deleteSourceFile); ConfigConstants.setDeleteCaptchaValue(deleteCaptcha); + ConfigConstants.setCadTimeoutValue(cadTimeout); + ConfigConstants.setCadThreadValue(cadThread); setWatermarkConfig(properties); bufferedReader.close(); fileReader.close(); diff --git a/server/src/main/java/cn/keking/service/FileHandlerService.java b/server/src/main/java/cn/keking/service/FileHandlerService.java index 3995b9c2..48d78673 100644 --- a/server/src/main/java/cn/keking/service/FileHandlerService.java +++ b/server/src/main/java/cn/keking/service/FileHandlerService.java @@ -54,7 +54,6 @@ public class FileHandlerService { private final Logger logger = LoggerFactory.getLogger(FileHandlerService.class); private final String fileDir = ConfigConstants.getFileDir(); private final CacheService cacheService; - private final InterruptionTokenSource source = new com.aspose.cad.InterruptionTokenSource(); //CAD延时 @Value("${server.tomcat.uri-encoding:UTF-8}") private String uriEncoding; @@ -148,7 +147,7 @@ public class FileHandlerService { /** cad定义线程池 */ - private static final ExecutorService pool = Executors.newFixedThreadPool(1); + private static final ExecutorService pool = Executors.newFixedThreadPool(ConfigConstants.getCadThread()); /** * 对转换后的文件进行操作(改变编码方式) * @@ -304,82 +303,77 @@ public class FileHandlerService { * @return 转换是否成功 */ public String cadToPdf(String inputFilePath, String outputFilePath ,String cadPreviewType) throws Exception { + final InterruptionTokenSource source = new InterruptionTokenSource();//CAD延时 Callable call = () -> { - File outputFile = new File(outputFilePath); - LoadOptions opts = new LoadOptions(); - opts.setSpecifiedEncoding(CodePages.SimpChinese); - Image cadImage = Image.load(inputFilePath, opts); - CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions(); - cadRasterizationOptions.setBackgroundColor(Color.getWhite()); - cadRasterizationOptions.setPageWidth(1400); - cadRasterizationOptions.setPageHeight(650); - cadRasterizationOptions.setAutomaticLayoutsScaling(true); - cadRasterizationOptions.setNoScaling(false); - cadRasterizationOptions.setDrawType(1); - 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; - } - OutputStream stream = null; - try { - stream = new FileOutputStream(outputFile); - switch (cadPreviewType) { + File outputFile = new File(outputFilePath); + LoadOptions opts = new LoadOptions(); + opts.setSpecifiedEncoding(CodePages.SimpChinese); + Image cadImage = Image.load(inputFilePath, opts); + CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions(); + cadRasterizationOptions.setBackgroundColor(Color.getWhite()); + cadRasterizationOptions.setPageWidth(1400); + cadRasterizationOptions.setPageHeight(650); + cadRasterizationOptions.setAutomaticLayoutsScaling(true); + cadRasterizationOptions.setNoScaling(false); + cadRasterizationOptions.setDrawType(1); + SvgOptions SvgOptions = null; + PdfOptions pdfOptions = null; + TiffOptions TiffOptions = null; + switch (cadPreviewType) { //新增格式方法 case "svg": - cadImage.save(stream, SvgOptions); + SvgOptions = new SvgOptions(); + SvgOptions.setVectorRasterizationOptions(cadRasterizationOptions); + SvgOptions.setInterruptionToken(source.getToken()); break; case "pdf": - cadImage.save(stream, pdfOptions); + pdfOptions = new PdfOptions(); + pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions); + pdfOptions.setInterruptionToken(source.getToken()); break; case "tif": - cadImage.save(stream, TiffOptions); + TiffOptions = new TiffOptions(TiffExpectedFormat.TiffJpegRgb); + TiffOptions.setVectorRasterizationOptions(cadRasterizationOptions); + TiffOptions.setInterruptionToken(source.getToken()); break; } - } catch (IOException e) { - logger.error("PDFFileNotFoundException,inputFilePath:{}", inputFilePath, e); - return "null"; - } finally { - if (stream != null) { //关闭 - stream.close(); - } - if (cadImage != null) { //关闭 - cadImage.close(); + 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("PDFFileNotFoundException,inputFilePath:{}", inputFilePath, e); + return null; + } finally { + //关闭 + if (cadImage != null) { //关闭 + cadImage.dispose(); + } + source.interrupt(); //结束任务 } - source.interrupt(); //结束任务 - source.dispose(); - } - return "true"; + return "true"; }; Future result = pool.submit(call); try { // 如果在超时时间内,没有数据返回:则抛出TimeoutException异常 - result.get(60, TimeUnit.SECONDS); + result.get(Long.parseLong(ConfigConstants.getCadTimeout()), TimeUnit.SECONDS); } catch (InterruptedException e) { System.out.println("InterruptedException发生"); - return "null"; + return null; } catch (ExecutionException e) { System.out.println("ExecutionException发生"); - return "null"; + return null; } catch (TimeoutException e) { System.out.println("TimeoutException发生,意味着线程超时报错"); - return "null"; + return null; } finally { - source.interrupt(); //结束任务 source.dispose(); } return "true";