Patrones de diseño utilizados por el marco JODConverter

JODConverter 是Java OpenDocument文件转换器库,可以进行许多文件格式的转换。它依赖于OpenOffice或LibreOffice 提供的服务来进行转换,它能将Microsoft Office文档(Word,Excel,PowerPoint)转换为PDF格式

JODConverter se utiliza en el proyecto. Comprenda brevemente el código fuente, hay varios patrones de diseño, este artículo comparte el patrón del constructor.

Introducción al patrón de diseño

El modo de constructor es simplemente crear un objeto. Entonces, ¿qué es un patrón de diseño para crear un objeto? Si hay muchos atributos en una clase, puede pasar parámetros a través del constructor o establecerlos mediante el método set al crear el objeto. Para evitar que la lista de parámetros del constructor sea demasiado larga, lo que afecta la legibilidad y facilidad de uso del código, podemos resolverlo a través del constructor con el método set (). Pasar más parámetros a través del constructor es un dolor de cabeza. También es un dolor de cabeza si existe cierta dependencia entre los atributos de la clase o si las restricciones se establecen mediante el método set. Entonces hay un modo de constructor para resolver el problema de los objetos con muchos parámetros.

Demostración de código

La versión utilizada localmente es:


        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-core</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.libreoffice</groupId>
            <artifactId>ridl</artifactId>
            <version>5.4.2</version>
        </dependency>

Según el ejemplo del documento oficial , el proceso de funcionamiento general es el siguiente: Primero, cree un servicio OfficeManager. Inicie, llame a JodConverter.convert para convertir el archivo y finalmente detenga el servicio.

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");

// Create an office manager using the default configuration.
// The default port is 2002. Note that when an office manager
// is installed, it will be the one used by default when
// a converter is created.
final LocalOfficeManager officeManager = LocalOfficeManager.install(); 
try {
    
    

    // Start an office process and connect to the started instance (on port 2002).
    officeManager.start();

    // Convert
    JodConverter
             .convert(inputFile)
             .to(outputFile)
             .execute();
} finally {
    
    
    // Stop the office process
    OfficeUtils.stopQuietly(officeManager);
}

En el ejemplo, se crea una configuración predeterminada de LocalOfficeManager mediante el método LocalOfficeManager.install (). Luego, la creación de un LocalOfficeManager requiere la siguiente configuración.

   private String[] pipeNames; 
   private int[] portNumbers; //服务端口
   private File officeHome; // libreaoffice or openoffice 安装路径
   private ProcessManager processManager;
   private String[] runAsArgs;
   private File templateProfileDir; //转换的临时文件存放路径
   private boolean killExistingProcess;
   private long processTimeout;  //转换任务超时
   private long processRetryInterval;
   private int maxTasksPerProcess;
   private boolean disableOpengl;

La estructura de código principal de LocalOfficeManager es la siguiente. Conserve principalmente el código del modo constructor.

public final class LocalOfficeManager extends AbstractOfficeManagerPool {
    
    

  
  /**
   * Creates a new builder instance.
   *
   * @return A new builder instance.
   */
  public static Builder builder() {
    
    
    return new Builder();
  }

 

  private LocalOfficeManager(
      final OfficeUrl[] officeUrls, final OfficeProcessManagerPoolConfig config) {
    
    
    super(officeUrls.length, config);

    this.officeUrls = Arrays.copyOf(officeUrls, officeUrls.length);
  }

 

  /**
   * LocalOfficeManager 构造类
   *
   * @see LocalOfficeManager
   */
  public static final class Builder extends AbstractOfficeManagerPoolBuilder<Builder> {
    
    

    // LocalOfficeManager 对象参数值
    private String[] pipeNames;
    private int[] portNumbers;
    private File officeHome;
    private ProcessManager processManager;
    private String[] runAsArgs;
    private File templateProfileDir;
    private boolean killExistingProcess = OfficeProcessConfig.DEFAULT_KILL_EXISTING_PROCESS;

    // 默认参数值
    private long processTimeout = OfficeProcessManagerConfig.DEFAULT_PROCESS_TIMEOUT;
    private long processRetryInterval = OfficeProcessManagerConfig.DEFAULT_PROCESS_RETRY_INTERVAL;
    private int maxTasksPerProcess = OfficeProcessManagerConfig.DEFAULT_MAX_TASKS_PER_PROCESS;
    private boolean disableOpengl = OfficeProcessManagerConfig.DEFAULT_DISABLE_OPENGL;
    
    // Private ctor so only LocalOfficeManager can initialize an instance of this builder.
    private Builder() {
    
    
      super();
    }
      
      
      //返回创建好的LocalOfficeManager
      public LocalOfficeManager build() {
    
    

      // 设置默认参数
      if (officeHome == null) {
    
    
        officeHome = LocalOfficeUtils.getDefaultOfficeHome();
      }
		// 设置默认参数
      if (workingDir == null) {
    
    
        workingDir = new File(System.getProperty("java.io.tmpdir"));
      }
	  // 设置默认参数
      if (processManager == null) {
    
    
        processManager = LocalOfficeUtils.findBestProcessManager();
      }

      // Build the office URLs
      final OfficeUrl[] officeUrls = LocalOfficeUtils.buildOfficeUrls(portNumbers, pipeNames);
          
	  //OfficeProcessManagerPoolConfig 是创建LocalOfficeManager对象需要传的参数
      //参数都是通过 LocalOfficeManager.builder().officeHome("/user/aaa")方式传个builder。
      final OfficeProcessManagerPoolConfig config =
          new OfficeProcessManagerPoolConfig(officeHome, workingDir, processManager);
      config.setRunAsArgs(runAsArgs);
      config.setTemplateProfileDir(templateProfileDir);
      config.setKillExistingProcess(killExistingProcess);
      config.setProcessTimeout(processTimeout);
      config.setProcessRetryInterval(processRetryInterval);
      config.setMaxTasksPerProcess(maxTasksPerProcess);
      config.setDisableOpengl(disableOpengl);
      config.setTaskExecutionTimeout(taskExecutionTimeout);
      config.setTaskQueueTimeout(taskQueueTimeout);
	 //LocalOfficeManager 需要OfficeProcessManagerPoolConfig,OfficeUrl两个构造参数。 
      final LocalOfficeManager manager = new LocalOfficeManager(officeUrls, config);
      if (install) {
    
    
        InstalledOfficeManagerHolder.setInstance(manager);
      }
      return manager;
    }


    /**
     * 设置参数。返回是当前builder对象
     * @return This builder instance.
     */
    public Builder pipeNames(final String... pipeNames) {
    
    

      Validate.isTrue(
          pipeNames != null && pipeNames.length > 0, "The pipe name list must not be empty");
      this.pipeNames = ArrayUtils.clone(pipeNames);
      return this;
    }

    /**
    * 设置参数。返回是当前builder对象
     * Specifies the port numbers that will be use to communicate with office. An instance of office
     * will be launched for each port number.
     *
     * @param portNumbers The port numbers to use.
     * @return This builder instance.
     */
    public Builder portNumbers(final int... portNumbers) {
    
    

      Validate.isTrue(
          portNumbers != null && portNumbers.length > 0, "The port number list must not be empty");
      this.portNumbers = ArrayUtils.clone(portNumbers);
      return this;
    }
     ......//省略不是主要的
  }
}

Se puede ver que hay una clase interna Builder en LocalOfficeManager La clase Builder es casi como la Entity VO habitual, incluidos los parámetros y los métodos establecidos. El método set aquí devuelve el objeto actual.

El método de construcción LocalOfficeManager es privado y no puede ser directamente nuevo externamente. El método de construcción también es privado y no puede ser directamente nuevo. El método de construcción de todas las clases Builder es donde se crean realmente los objetos.

Por ejemplo, no desea utilizar el método predeterminado para crear LocalOfficeManager. Se puede crear mediante ajuste de cadena.

//指定officehome和应用端口
OfficeManager officeManager =   LocalOfficeManager.builder().officeHome(officeHome).portNumbers(123,456).install().build();

El método Builder.buid no se basa en el juicio y es relativamente simple.

Dirección del sitio web oficial

Supongo que te gusta

Origin blog.csdn.net/samz5906/article/details/106506902
Recomendado
Clasificación