package com.product.file.util; import com.alibaba.druid.util.StringUtils; import com.product.core.config.Global; import com.product.core.exception.BaseException; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.file.config.FileCode; import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.ExternalOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeException; import org.artofsolving.jodconverter.office.OfficeManager; import java.io.File; import java.util.Properties; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Copyright © 6c * @Date: 2021-03-01 13:59 * @Author: 6c * @Description: */ public class PdfConcurrenceUtil { private static BlockingQueue officeManagerQueue = new LinkedBlockingQueue<>(); // 安装地址 private static String openOfficeHome; // 端口号信息,逗号分割 private static String portInfo; // 单个任务执行超时时间,单位:毫秒 private static long taskTimeout; // 单个任务排队超时时间,单位:毫秒 private static long queueTimeout; static { SpringMVCContextHolder.getSystemLogger().info("初始化->"); //init(); } private PdfConcurrenceUtil() {} /** * 初始化转换服务 */ public static boolean init() { if(!Global.getPropertyToBoolean("open.office.isEnable", "true")) {//不启用oepn office转换 return true; } SpringMVCContextHolder.getSystemLogger().info("初始化转换服务->"); openOfficeHome = Global.getSystemConfig("open.office.home",""); portInfo = Global.getSystemConfig("open.office.port.info",""); taskTimeout = StringUtils.isEmpty(Global.getSystemConfig("open.office.task.timeout","")) ? 1000 * 60 *5 : Long.parseLong(Global.getSystemConfig("open.office.task.timeout","")); queueTimeout = StringUtils.isEmpty(Global.getSystemConfig("open.office.queue.timeout","")) ? 1000 * 60 *5 : Long.parseLong(Global.getSystemConfig("open.office.queue.timeout","")); String[] portArr = portInfo.split(","); for (String port : portArr) { if (StringUtils.isEmpty(port)) { continue; } try { OfficeManager officeManager = start(Integer.parseInt(port)); if (officeManager != null) { officeManagerQueue.put(officeManager); } else { SpringMVCContextHolder.getSystemLogger().error(String.format("端口%s启动失败", port)); } } catch (InterruptedException e) { SpringMVCContextHolder.getSystemLogger().error(String.format("%s,port:%s", FileCode.INIT_TRANSFER_SERVER_FAIL.getText(), port) + e.getMessage()); } } SpringMVCContextHolder.getSystemLogger().info("当前转换队列中端口数:" + officeManagerQueue.size()); return true; } /** * 开启新的openoffice的进程 * @param port * @return */ private static OfficeManager start(int port) { try { SpringMVCContextHolder.getSystemLogger().info("curPort: " + port); OfficeManager officeManager = reconnect(port); if (officeManager == null) { DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); configuration.setOfficeHome(openOfficeHome); configuration.setPortNumbers(port); configuration.setTaskExecutionTimeout(taskTimeout); configuration.setTaskQueueTimeout(queueTimeout); SpringMVCContextHolder.getSystemLogger().info( "1.启动"+port); officeManager = configuration.buildOfficeManager(); SpringMVCContextHolder.getSystemLogger().info("2.启动"+port); officeManager.start(); // 启动服务 SpringMVCContextHolder.getSystemLogger().info( "3.启动成功"+ port); } return officeManager; } catch (Exception e) { e.printStackTrace(); SpringMVCContextHolder.getSystemLogger().error(String.format("%s:%s", FileCode.INIT_TRANSFER_SERVER_FAIL.getText(), port) + e.getMessage()); } return null; } /** * 尝试连接openoffice的已存在的服务器 * @param port * @return */ private static OfficeManager reconnect(int port) { try { ExternalOfficeManagerConfiguration externalProcessOfficeManager = new ExternalOfficeManagerConfiguration(); externalProcessOfficeManager.setConnectOnStart(true); externalProcessOfficeManager.setPortNumber(port); OfficeManager officeManager = externalProcessOfficeManager.buildOfficeManager(); officeManager.start(); return officeManager; } catch (OfficeException e) { SpringMVCContextHolder.getSystemLogger().info(String.format("%s,port:%s", FileCode.NO_EXISTS_TRANSFER_PORT.getText(), port)); return null; } } /** * 销毁进程 */ private static void destory() { for (OfficeManager officeManager : officeManagerQueue) { stop(officeManager); } } /** * 使用完需要关闭该进程 * @param officeManager */ private static void stop(OfficeManager officeManager) { SpringMVCContextHolder.getSystemLogger().info("关闭OpenOffice服务"); try { if (officeManager != null) officeManager.stop(); } catch (Exception e) { SpringMVCContextHolder.getSystemLogger().error("关闭OpenOffice服务出错" + e); } } /** * 转换pdf * @param input * @param output * @return */ @Deprecated public static File convertToPdf(String input, String output) throws Exception { File inputFile = null; File outFile = null; OfficeManager officeManager = null; try { officeManager = officeManagerQueue.take(); inputFile = new File(input); outFile = new File(output); SpringMVCContextHolder.getSystemLogger().info("开始转换文档:" + input + "=>" + output); OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); converter.convert(inputFile, outFile); // 转换文档 }catch (Exception e) { outFile = null; throw e; } finally { SpringMVCContextHolder.getSystemLogger().info("结束转换文档"); if (officeManager != null) { try { officeManagerQueue.put(officeManager); } catch (InterruptedException e) { e.printStackTrace(); } } } return outFile; } /** * 转换pdf * @param input * @param output * @return */ public static File convertToPdf(String input, String output,String officeType) throws Exception { File inputFile = null; File outFile = null; OfficeManager officeManager = null; try { if(Global.getPropertyToBoolean("open.office.isEnable", "false")) {//启用oepn office转换 officeManager = officeManagerQueue.take(); inputFile = new File(input); outFile = new File(output); SpringMVCContextHolder.getSystemLogger().info("开始转换文档:" + input + "=>" + output); OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); converter.convert(inputFile, outFile); // 转换文档 }else{ outFile = new File(AsposeUtil.OfficeToPdf(input, output,officeType)); } }catch (Exception e) { outFile = null; throw e; } finally { SpringMVCContextHolder.getSystemLogger().info("结束转换文档"); if (officeManager != null) { try { officeManagerQueue.put(officeManager); } catch (InterruptedException e) { e.printStackTrace(); } } } return outFile; } }