Saltar al contenido principal
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).

Añadir la biblioteca FineReader Engine a un proyecto Java

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:
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
$JDK es la ruta de acceso a Java Development Kit.
Consulte la lista de Java Development Kits compatibles en Requisitos del sistema.

Carga y descarga de FineReader Engine

Puede usar la clase estática Engine para cargar el objeto Engine. La clase Engine proporciona métodos que corresponden a las funciones de ABBYY FineReader Engine para cargar y descargar Engine:
FunciónMétodo de la clase EngineFirma del método de la clase Engine
InitializeEngineInitializeEnginecsharp static public IEngine InitializeEngine( String dllFolder, String customerProjectId, String licensePath, String licensePassword, String dataFolder, String tempFolder, boolean isSharedCPUCoresMode ) throws Exception;
DeinitializeEngineDeinitializeEnginestatic public void DeinitializeEngine() throws Exception;
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;
...
}
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 .

Manejo de errores

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() ) );
    }
}

Llamada a métodos con parámetros de salida

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:
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();
Ejemplo en el que los parámetros de entrada/salida se pasan por referencia al método ICoordinatesConverter::ConvertCoordinates:
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();

Recolección de basura

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):
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 );
 }

Trabajar con enumeraciones

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 del objeto PDFPictureCompressionParams:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());

Uso del wrapper compatible con RMI

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.
El wrapper compatible con RMI requiere Java Development Kit. Consulte la lista de Java Development Kits compatibles en Requisitos del sistema.
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 y threadPoolClient, paquetes com.abbyy.rmi.pool.FREngine y com.abbyy.rmi.pool.impl.FREngine).

Uso de eventos e interfaces de devolución de llamada

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;