Vai al contenuto principale
Per Linux, consultare la Guida per sviluppatori della distribuzione Linux per l’elenco completo. Una limitazione rilevante è che gli oggetti che implementano IEngineLoader non sono disponibili su Linux o macOS (vedere Differenze tra ABBYY FineReader Engine 12 per Windows e Linux).

Aggiunta della libreria FineReader Engine a un progetto Java

ABBYY FineReader Engine include il file com.abbyy.FREngine-%BUILD_ID%.jar, che contiene la libreria di classi Java per FineReader Engine. È possibile trovarlo nella cartella Inc/Java. Il percorso di questo file può essere specificato nel parametro classpath nella riga di comando e nelle impostazioni del progetto nei vari ambienti di sviluppo Java. Esempio:
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
$JDK è il percorso del Java Development Kit.
Consultare l’elenco dei Java Development Kit supportati in Requisiti di sistema.

Caricamento e scaricamento di FineReader Engine

È possibile utilizzare la classe statica Engine per caricare l’oggetto Engine. La classe Engine fornisce metodi corrispondenti alle funzioni di ABBYY FineReader Engine per il caricamento e lo scaricamento dell’Engine:
FunzioneMetodo della classe EngineFirma del metodo della 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 {
            // Carica l'Engine con la licenza online
            engine = Engine.InitializeEngine( path, customerProjectId, LicensePath, LicensePassword, "", "", false );
            try {
                // Carica un profilo predefinito
                engine.LoadPredefinedProfile( "DocumentConversion_Accuracy" );
                // Elabora le immagini
                IFRDocument document = engine.CreateFRDocument();
                ...
            } finally {
                engine = null;
                System.runFinalization();
                Engine.DeinitializeEngine();
            }
        } catch( Exception ex ) {
            trace( ex.getMessage() );
        }
    }
    private IEngine engine = null;
...
}
Il file com.abbyy.FREngine-%BUILD_ID%.jar è un archivio auto-estraente che viene decompresso sul computer al primo utilizzo dell’API Java di FineReader Engine. La cartella predefinita in cui vengono estratti i contenuti è Inc/Java. Se è necessario utilizzare una cartella diversa, chiamare il metodo Engine.SetJNIDllFolder prima di caricare l’Engine con uno dei metodi descritti sopra. Per verificare quale cartella è attualmente impostata per l’estrazione dell’archivio, chiamare Engine.GetJNIDllFolder.

Gestione degli errori

ABBYY FineReader Engine può generare eccezioni dei seguenti tipi:
  • java.lang.OutOfMemoryError
  • com.abbyy.FREngine.EngineException
L’eccezione com.abbyy.FREngine.EngineException eredita da java.lang.Exception e contiene un metodo aggiuntivo int getHResult, che restituisce il codice HRESULT dell’errore verificatosi. Per un’eccezione di questo tipo, è possibile non solo recuperare il messaggio di errore tramite il metodo getMessage(), ma anche ottenere il codice di errore.
try {
    ...
} catch( Exception ex ) {
    displayMessage( "Message = " + ex.getMessage() );
    if( ex instanceof EngineException ) {
        displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
    }
}

Chiamata di metodi con parametri out

Nell’API di ABBYY FineReader Engine esistono diversi metodi con parametri out che ricevono un nuovo valore dopo la chiamata al metodo e devono essere passati per riferimento. Questi parametri sono contrassegnati nella type library e nelle descrizioni dei metodi in questa Guida per sviluppatori come [out] o [in, out]. Quando si lavora con ABBYY FineReader Engine in Java, è necessario utilizzare una classe Ref apposita per passare un parametro per riferimento. Vedere gli esempi di seguito. Esempio in cui i parametri out vengono passati per riferimento al metodo 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();
Esempio in cui i parametri in/out vengono passati per riferimento al metodo 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();

Garbage collection

FineReader Engine supporta l’utilizzo dell’interfaccia AutoCloseable, che consente di usare l’istruzione try per accedere alle risorse allocate per gli oggetti. Ciò significa che, una volta raggiunta la fine del blocco try, tutte le risorse allocate verranno chiuse automaticamente, senza dover chiamare esplicitamente i metodi di chiusura. Si consiglia di utilizzare l’istruzione try per tutti gli oggetti nel codice (vedere l’esempio di seguito):
try( IFRDocument document = engine.CreateDocument() )
 {
  // Aggiunge un'immagine a un documento
  document.AddImageFile( imagePath, null, null );
  ...
  // Salva i risultati in PDF
  document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
 }

Utilizzo delle enumerazioni

I metodi e le proprietà che accettano una combinazione di costanti di enumerazione richiedono che il valore int venga passato al metodo o alla proprietà. Per ottenere il valore int di una costante di enumerazione, utilizzare il metodo getValue, supportato da tutte le enumerazioni. Di seguito è riportato un esempio di codice che mostra come impostare la proprietà BwPictureFormats dell’oggetto PDFPictureCompressionParams:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());

Utilizzo del wrapper compatibile con RMI

Esiste una versione separata del wrapper Java che supporta la chiamata remota di metodi (RMI). Tutte le classi ereditano da UnicastRemoteObject e supportano l’interfaccia Remote; tutti i metodi possono generare RemoteException. Per impostazione predefinita, il wrapper compatibile con RMI reindirizza le chiamate di elaborazione PDF a un thread separato con PDFium inizializzato.
Il wrapper compatibile con RMI richiede il Java Development Kit. Consultare l’elenco dei Java Development Kit supportati in Requisiti di sistema.
Il pacchetto com.abbyy.rmi.FREngine contiene le interfacce remote utilizzate dall’applicazione client; il pacchetto com.abbyy.rmi.server.FREngine viene utilizzato lato server. A causa delle limitazioni dell’overloading dei metodi, sarà necessario utilizzare anche la libreria dinamica libFREngine.rmi_server.so al posto di libFREngine.so. Questi pacchetti sono sufficienti per una semplice applicazione client-server. Tuttavia, FineReader Engine non è thread-safe di per sé e richiede pertanto un impegno aggiuntivo da parte del programmatore per garantire che ogni istanza di Engine sia accessibile da un solo thread di lavoro alla volta. Consultare gli esempi di codice forniti con il pacchetto di distribuzione per un’implementazione riutilizzabile completa del pool lato server di Engine e di un client multi-thread che vi si connette (esempi rmiPoolServer e threadPoolClient, pacchetti com.abbyy.rmi.pool.FREngine e com.abbyy.rmi.pool.impl.FREngine).

Utilizzo di eventi e interfacce callback

Si noti che gli eventi implementati dal client e le interfacce callback devono essere rimossi dal Runtime RMI al termine dell’utilizzo:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;