> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Uso de Java con FRE en Linux

> Use ABBYY FineReader Engine desde Java en Linux: agregue `com.abbyy.FREngine.jar` a su classpath y llame a InitializeEngine y DeinitializeEngine para cargar y descargar el Engine.

<Note>
  En Linux, consulte la ayuda para desarrolladores de la distribución de Linux para obtener la lista completa. Una limitación importante es que los objetos que implementan IEngineLoader no están disponibles en Linux ni en macOS (consulte [Diferencias entre ABBYY FineReader Engine 12 para Windows y Linux](/es/fine-reader/engine/specifications/differences-between-abbyy-finereader-engine-for-windows-and-linux)).
</Note>

<div id="adding-finereader-engine-library-to-a-java-project">
  ## Añadir la biblioteca FineReader Engine a un proyecto Java
</div>

ABBYY FineReader Engine incluye un archivo com.abbyy.FREngine-%BUILD\_ID%.jar, que contiene la biblioteca de clases Java de FineReader Engine. Puede encontrarlo en la carpeta Inc/Java. La ruta de este archivo puede especificarse en el parámetro classpath de la línea de comandos y en la configuración del proyecto de distintos entornos de desarrollo de Java. Ejemplo:

```csharp theme={null}
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
```

\$JDK es la ruta de acceso a Java Development Kit.

<Warning>
  Consulte la lista de Java Development Kits compatibles en [Requisitos del sistema](/es/fine-reader/engine/specifications/system-requirements).
</Warning>

<div id="loading-and-unloading-finereader-engine">
  ## Carga y descarga de FineReader Engine
</div>

Puede usar la clase estática Engine para cargar el objeto [Engine](/es/fine-reader/engine/api-reference/engine-object-iengine-interface).

La clase Engine proporciona métodos que corresponden a las [funciones](/es/fine-reader/engine/api-reference/functions) de ABBYY FineReader Engine para cargar y descargar Engine:

| Función                                                                                          | Método de la clase Engine | Firma del método de la clase Engine                                                                                                                                                                                              |
| ------------------------------------------------------------------------------------------------ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [InitializeEngine](/es/fine-reader/engine/api-reference/functions/initializeengine-function)     | InitializeEngine          | `csharp static public IEngine InitializeEngine( String dllFolder, String customerProjectId, String licensePath, String licensePassword, String dataFolder, String tempFolder, boolean isSharedCPUCoresMode ) throws Exception; ` |
| [DeinitializeEngine](/es/fine-reader/engine/api-reference/functions/deinitializeengine-function) | DeinitializeEngine        | `static public void DeinitializeEngine() throws Exception;`                                                                                                                                                                      |

<Accordion title="Código de ejemplo">
  ```csharp theme={null}
  import com.abbyy.FREngine.*;
  public class Hello {
      public static void main( String[] args )
      {
          try {
              // Cargar Engine con una licencia en línea
              engine = Engine.InitializeEngine( path, customerProjectId, LicensePath, LicensePassword, "", "", false );
              try {
                  // Cargar un perfil predefinido
                  engine.LoadPredefinedProfile( "DocumentConversion_Accuracy" );
                  // Procesar imágenes
                  IFRDocument document = engine.CreateFRDocument();
                  ...
              } finally {
                  engine = null;
                  System.runFinalization();
                  Engine.DeinitializeEngine();
              }
          } catch( Exception ex ) {
              trace( ex.getMessage() );
          }
      }
      private IEngine engine = null;
  ...
  }
  ```
</Accordion>

<Note>
  El archivo com.abbyy.FREngine-%BUILD\_ID%.jar es un archivo autoextraíble que se extrae en su equipo la primera vez que usa la API de Java de FineReader Engine. La carpeta predeterminada en la que se extrae el contenido es Inc/Java . Si necesita usar otra carpeta, llame al método Engine.SetJNIDllFolder antes de cargar Engine mediante cualquiera de los métodos descritos anteriormente. Para saber qué carpeta está configurada actualmente para extraer el archivo, llame a Engine.GetJNIDllFolder .
</Note>

<div id="handling-errors">
  ## Manejo de errores
</div>

ABBYY FineReader Engine puede generar excepciones de los siguientes tipos:

* java.lang.OutOfMemoryError
* com.abbyy.FREngine.EngineException

La excepción com.abbyy.FREngine.EngineException hereda de java.lang.Exception y contiene un método adicional, int getHResult, que devuelve el código HRESULT del error que ocurrió. En una excepción de este tipo, no solo puede obtener el mensaje de error mediante el método getMessage(), sino también el código de error.

```
try {
    ...
} catch( Exception ex ) {
    displayMessage( "Message = " + ex.getMessage() );
    if( ex instanceof EngineException ) {
        displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
    }
}
```

<div id="calling-methods-with-out-parameters">
  ## Llamada a métodos con parámetros de salida
</div>

Hay varios métodos en la API de ABBYY FineReader Engine que tienen parámetros de salida que reciben un nuevo valor después de llamar al método y deben pasarse por referencia. Estos parámetros se marcan en la biblioteca de tipos y en las descripciones de los métodos de esta ayuda para desarrolladores como \[out] o \[in, out].

Al trabajar con ABBYY FineReader Engine en Java, debe utilizar una clase Ref especial para pasar un parámetro por referencia. Consulte los ejemplos a continuación.

Ejemplo en el que los parámetros de salida se pasan por referencia al método [IFRPage::FindPageSplitPosition](/es/fine-reader/engine/api-reference/document-related-objects/frpage/findpagesplitposition-method):

<Accordion title="Código de ejemplo para parámetros de salida">
  ```
  Ref<PageSplitDirectionEnum> _ps = new Ref<PageSplitDirectionEnum>();
  Ref<Integer> _start = new Ref<Integer>();
  Ref<Integer> _end = new Ref<Integer>();
  page.FindPageSplitPosition( null, null, _ps, _start, _end );
  PageSplitDirectionEnum ps = _ps.get();
  Integer start = _start.get();
  Integer end = _end.get();
  ```
</Accordion>

Ejemplo en el que los parámetros de entrada/salida se pasan por referencia al método [ICoordinatesConverter::ConvertCoordinates](/es/fine-reader/engine/api-reference/image-related-objects/coordinatesconverter/convertcoordinates-method):

<Accordion title="Código de ejemplo para parámetros de entrada/salida">
  ```
  Ref<Integer> _x = new Ref<Integer>( 100 );
  Ref<Integer> _y = new Ref<Integer>( 200 );
  cnv.ConvertCoordinates( ImageTypeEnum.IT_Modified, ImageTypeEnum.IT_Base, _x, _y );
  Integer x = _x.get();
  Integer y = _y.get();
  ```
</Accordion>

<div id="collecting-garbage">
  ## Recolección de basura
</div>

FineReader Engine admite el uso de la interfaz AutoCloseable, lo que le permite usar la instrucción try para acceder a los recursos asignados a los objetos. Esto significa que, una vez que el bloque try finaliza, todos los recursos asignados se cerrarán automáticamente, sin necesidad de llamar explícitamente a métodos de cierre. Recomendamos usar la instrucción try con todos los objetos en su código (consulte el ejemplo a continuación):

<Accordion title="Código de ejemplo">
  ```csharp theme={null}
  try( IFRDocument document = engine.CreateDocument() )
   {
    // Agregar una imagen a un documento
    document.AddImageFile( imagePath, null, null );
    ...
    // Guardar los resultados en PDF
    document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
   }
  ```
</Accordion>

<div id="working-with-enumerations">
  ## Trabajar con enumeraciones
</div>

Los métodos y las propiedades que aceptan una combinación de constantes de enumeración requieren que se pase el valor `int` al método o la propiedad. Para obtener el valor `int` de una constante de enumeración, use el método `getValue`, compatible con todas las enumeraciones.

A continuación se muestra un ejemplo de código que ilustra cómo establecer la propiedad [BwPictureFormats](/es/fine-reader/engine/api-reference/parameter-objects/export-parameters/pdfpicturecompressionparams#bwpictureformats) del objeto [PDFPictureCompressionParams](/es/fine-reader/engine/api-reference/parameter-objects/export-parameters/pdfpicturecompressionparams):

```
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());
```

<div id="using-the-rmi-capable-wrapper">
  ## Uso del wrapper compatible con RMI
</div>

Existe una versión independiente del wrapper de Java que admite la invocación remota de métodos (RMI). Todas las clases heredan de UnicastRemoteObject y admiten la interfaz Remote; todos los métodos pueden generar RemoteException. De forma predeterminada, el wrapper compatible con RMI redirige las llamadas de procesamiento de PDF a un hilo independiente con PDFium inicializado.

<Warning>
  El wrapper compatible con RMI requiere Java Development Kit. Consulte la lista de Java Development Kits compatibles en [Requisitos del sistema](/es/fine-reader/engine/specifications/system-requirements).
</Warning>

El paquete com.abbyy.rmi.FREngine contiene las interfaces remotas que utiliza la aplicación cliente; el paquete com.abbyy.rmi.server.FREngine se utiliza en el lado del servidor. Debido a las limitaciones de la sobrecarga de métodos, también deberá usar otra biblioteca dinámica, libFREngine.rmi\_server.so, en lugar de libFREngine.so.

Estos paquetes son suficientes para una aplicación cliente-servidor sencilla. Sin embargo, FineReader Engine no es intrínsecamente seguro para subprocesos y, por lo tanto, requiere un esfuerzo adicional por parte del programador para garantizar que solo un hilo de trabajo acceda a cada instancia de Engine a la vez. Consulte los ejemplos de código proporcionados con el paquete de distribución para obtener una implementación reutilizable completa, en el lado del servidor, del grupo de Engines y de un cliente multihilo que se conecta a él (ejemplos [rmiPoolServer](/es/fine-reader/engine/guided-tour/samples#rmipoolserver) y [threadPoolClient](/es/fine-reader/engine/guided-tour/samples#threadpoolclient), paquetes com.abbyy.rmi.pool.FREngine y com.abbyy.rmi.pool.impl.FREngine).

<div id="using-events-and-callback-interfaces">
  ### Uso de eventos e interfaces de devolución de llamada
</div>

Ten en cuenta que los eventos y las interfaces de devolución de llamada implementados por el cliente deben eliminarse del entorno de ejecución de RMI después de usarlos:

```
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;
```
