Passer au contenu principal
Sous Linux, consultez l’aide destinée aux développeurs de la distribution Linux pour obtenir la liste complète. Une limitation importante est que les objets implémentant IEngineLoader ne sont pas disponibles sous Linux ni sur macOS (voir Différences entre ABBYY FineReader Engine 12 pour Windows et Linux).

Ajout de la bibliothèque FineReader Engine à un projet Java

ABBYY FineReader Engine comprend un fichier com.abbyy.FREngine-%BUILD_ID%.jar, qui contient la bibliothèque de classes Java de FineReader Engine. Vous le trouverez dans le dossier Inc/Java. Le chemin d’accès à ce fichier peut être indiqué dans le paramètre classpath sur la ligne de commande et dans les paramètres du projet de différents environnements de développement Java. Exemple :
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
$JDK correspond au chemin d’accès du Kit de développement Java.
Consultez la liste des Kits de développement Java pris en charge dans Exigences système.

Chargement et déchargement de FineReader Engine

Vous pouvez utiliser la classe statique Engine pour charger l’objet Engine. La classe Engine fournit des méthodes correspondant aux fonctions d’ABBYY FineReader Engine permettant de charger et de décharger Engine :
FonctionMéthode de la classe EngineSignature de la méthode de la classe 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 {
            // Charger Engine avec une licence en ligne
            engine = Engine.InitializeEngine( path, customerProjectId, LicensePath, LicensePassword, "", "", false );
            try {
                // Charger un profil prédéfini
                engine.LoadPredefinedProfile( "DocumentConversion_Accuracy" );
                // Traiter les images
                IFRDocument document = engine.CreateFRDocument();
                ...
            } finally {
                engine = null;
                System.runFinalization();
                Engine.DeinitializeEngine();
            }
        } catch( Exception ex ) {
            trace( ex.getMessage() );
        }
    }
    private IEngine engine = null;
...
}
Le fichier com.abbyy.FREngine-%BUILD_ID%.jar est une archive auto-extractible qui est extraite sur votre machine lors de la première utilisation de l’API Java FineReader Engine. Par défaut, son contenu est extrait dans le dossier Inc/Java. Si vous devez utiliser un autre dossier, appelez la méthode Engine.SetJNIDllFolder avant de charger Engine à l’aide de l’une des méthodes décrites ci-dessus. Pour connaître le dossier actuellement défini pour l’extraction de l’archive, appelez Engine.GetJNIDllFolder.

Gestion des erreurs

ABBYY FineReader Engine peut lever des exceptions des types suivants :
  • java.lang.OutOfMemoryError
  • com.abbyy.FREngine.EngineException
L’exception com.abbyy.FREngine.EngineException hérite de java.lang.Exception et comporte une méthode supplémentaire, int getHResult, qui renvoie le code HRESULT de l’erreur survenue. Pour une exception de ce type, vous pouvez non seulement récupérer le message d’erreur à l’aide de la méthode getMessage(), mais aussi le code d’erreur.
try {
    ...
} catch( Exception ex ) {
    displayMessage( "Message = " + ex.getMessage() );
    if( ex instanceof EngineException ) {
        displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
    }
}

Appel de méthodes avec des paramètres de sortie

L’API ABBYY FineReader Engine contient plusieurs méthodes avec des paramètres de sortie qui reçoivent une nouvelle valeur après l’appel de la méthode et doivent être passés par référence. Ces paramètres sont indiqués dans la bibliothèque de types et dans les descriptions des méthodes de cette Aide du développeur par [out] ou [in, out]. Lorsque vous travaillez avec ABBYY FineReader Engine en Java, vous devez utiliser une classe Ref spéciale pour passer un paramètre par référence. Voir les exemples ci-dessous. Exemple dans lequel les paramètres de sortie sont passés par référence à la méthode 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();
Exemple dans lequel les paramètres d’entrée/sortie sont passés par référence à la méthode 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();

Libération des ressources

FineReader Engine prend en charge l’interface AutoCloseable, ce qui vous permet d’utiliser l’instruction try pour gérer les ressources allouées aux objets. Cela signifie qu’une fois le bloc try terminé, toutes les ressources allouées sont fermées automatiquement, sans qu’il soit nécessaire d’appeler explicitement des méthodes de fermeture. Nous vous recommandons d’utiliser l’instruction try pour tous les objets de votre code (voir l’exemple ci-dessous) :
try( IFRDocument document = engine.CreateDocument() )
 {
  // Ajouter une image à un document
  document.AddImageFile( imagePath, null, null );
  ...
  // Enregistrer les résultats au format PDF
  document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
 }

Travailler avec les énumérations

Les méthodes et propriétés qui acceptent une combinaison de constantes d’énumération nécessitent que la valeur int soit passée à la méthode ou à la propriété. Pour obtenir la valeur int d’une constante d’énumération, utilisez la méthode getValue qui est prise en charge par toutes les énumérations. Voici un exemple de code montrant comment définir la propriété BwPictureFormats de l’objet PDFPictureCompressionParams :
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());

Utilisation du wrapper compatible RMI

Il existe une version distincte du wrapper Java qui prend en charge l’invocation de méthodes à distance (RMI). Toutes les classes héritent de UnicastRemoteObject et implémentent l’interface Remote ; toutes les méthodes peuvent lever RemoteException. Le wrapper compatible RMI utilise par défaut la redirection des appels de traitement PDF vers un thread séparé avec PDFium initialisé.
Le wrapper compatible RMI nécessite un Kit de développement Java. Consultez la liste des Kits de développement Java pris en charge dans Exigences système.
Le package com.abbyy.rmi.FREngine contient les interfaces distantes utilisées par l’application cliente ; le package com.abbyy.rmi.server.FREngine est utilisé côté serveur. En raison des limitations de la surcharge de méthodes, vous devrez également utiliser une autre bibliothèque dynamique libFREngine.rmi_server.so au lieu de libFREngine.so. Ces packages suffisent pour une application client-serveur simple. Cependant, FineReader Engine n’est pas thread-safe en soi et nécessite donc un effort supplémentaire de la part du programmeur pour s’assurer qu’une instance d’Engine n’est accédée que par un seul thread de travail à la fois. Consultez les exemples de code fournis avec le package de distribution pour une implémentisation réutilisable complète du pool d’Engines côté serveur et d’un client multi-threadé s’y connectant (rmiPoolServer et threadPoolClient samples, com.abbyy.rmi.pool.FREngine et com.abbyy.rmi.pool.impl.FREngine packages).

Utilisation des événements et des interfaces de rappel

Notez que les événements et les interfaces de rappel implémentés par le client doivent être supprimés de l’environnement d’exécution RMI après utilisation :
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;