Aggiunta della libreria FineReader Engine a un progetto Java
ABBYY FineReader Engine include un 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 della riga di comando e nelle impostazioni del progetto nei vari ambienti di sviluppo Java. Esempio:
È possibile utilizzare la classe statica Engine per caricare l’oggetto Engine.La classe Engine fornisce metodi che corrispondono alle funzioni di ABBYY FineReader Engine per caricare e scaricare Engine:
Per caricare Engine tramite COM, utilizzare i metodi GetEngineInprocLoader o GetEngineOutprocLoader. Per i dettagli, vedere la descrizione dell’interfaccia IEngineLoader. Se si utilizza il metodo GetEngineOutprocLoader per il caricamento, non è necessario chiamare il metodo IHostProcessControl::SetClientProcessId, poiché il processo padre verrà impostato automaticamente.
Se si sviluppa l’applicazione su Windows ma si intende eseguirla su Linux, non utilizzare questi metodi per caricare Engine. Utilizzare solo il metodo InitializeEngine descritto sopra. Questa limitazione è dovuta al fatto che gli oggetti che implementano IEngineLoader non sono disponibili su Linux.
Codice di esempio con InprocLoader
import com.abbyy.FREngine.*;// Caricamento di Engine con licenza onlineengineLoader = Engine.GetEngineInprocLoader();engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );...// Scaricamento di Engineengine = null;System.runFinalization();engineLoader.ExplicitlyUnload();engineLoader = null;System.runFinalization();
Codice di esempio con OutprocLoader
import com.abbyy.FREngine.*;// Caricamento di Engine con licenza onlineengineLoader = Engine.GetEngineOutprocLoader();engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );...// Scaricamento di Engineengine = null;System.runFinalization();engineLoader.ExplicitlyUnload();engineLoader = null;System.runFinalization();
Per lavorare con l’oggetto Engine creato tramite un loader del motore, la classe Engine fornisce metodi che chiamano le corrispondenti funzioni COM per eseguire il marshalling del puntatore all’interfaccia tra thread:
Metodo
Firma
Commento
MarshalInterface
long MarshalInterface();
Chiama la funzione COM CoMarshalInterface per eseguire il marshalling dell’interfaccia IEngine. Questo metodo deve essere chiamato nel thread in cui è stato creato il motore, per garantire che siano disponibili i dati necessari per creare un oggetto proxy in un altro thread. Restituisce l’handle dei dati di marshalling.
UnmarshalInterface
csharp IEngine UnmarshalInterface( long handle );
Chiama la funzione COM CoUnmarshalInterface per eseguire l’unmarshalling dell’interfaccia IEngine, cioè creare un oggetto proxy con cui il processo client potrà interagire nello stesso modo in cui interagisce con il motore stesso. Accetta come parametro di input l’handle dei dati di marshalling (restituito dal metodo MarshalInterface) e restituisce un puntatore all’interfaccia IEngine.
Il file com.abbyy.FREngine-%BUILD_ID%.jar è un archivio autoestraente che viene decompresso sul computer al primo utilizzo della Java API di FineReader Engine. La cartella predefinita in cui viene decompresso il contenuto è Inc\Java per Windows. Se è necessario utilizzare un’altra cartella, chiamare il metodo Engine.SetJNIDllFolder prima di caricare Engine con uno dei metodi descritti sopra. Per sapere quale cartella è attualmente impostata per la decompressione dell’archivio, chiamare Engine.GetJNIDllFolder.
Utilizzo di Engine nelle applicazioni Java multithread
Per le applicazioni Java multithread, è possibile usare la classe EnginesPool, che offre una soluzione completa per creare e gestire un pool di oggetti FineReader Engine. Questa classe implementa l’interfaccia java.lang.Runnable.
public class EnginesPool implements Runnable;
I metodi della classe EnginesPool sono elencati di seguito.
Metodo
Signature
Commento
constructor
public EnginesPool( int enginesCount, int waitingEngineTimeout, String customerProjectId, String licensePath, String licensePassword, String dataFolder, String tempFolder, boolean isSharedCPUCoresMode ) throws Exception;
Crea un nuovo pool di enginesCount istanze di Engine. Il parametro waitingEngineTimeout definisce il timeout per EnginesPool.GetEngine. Gli altri parametri sono gli stessi di InitializeEngine
GetEngine
csharp public IEngine GetEngine() throws Exception;
Ottiene un’istanza di Engine dal pool. Genera un’eccezione se viene superato il timeout waitingEngineTimeout.
Restituisce un’istanza di Engine al pool. Se isRecycleRequired è true, elimina questa istanza e la sostituisce con una nuova (anche se il limite di utilizzo non è stato raggiunto o il riciclo automatico è disabilitato).
SetAutoRecycleUsageCount
public void SetAutoRecycleUsageCount( int value );
Imposta il numero di volte in cui una singola istanza di Engine in questo pool può essere riutilizzata prima di essere riciclata, cioè eliminata e sostituita automaticamente con una nuova. Il valore può essere impostato su 0 per non eseguire mai il riciclo automatico (sarà possibile solo il riciclo manuale, tramite ReleaseEngine). Il valore predefinito è 0 (nessun riciclo automatico).
GetAutoRecycleUsageCount
public int GetAutoRecycleUsageCount();
Restituisce il limite di riutilizzo di un’istanza di Engine per questo pool.
UnloadEngines
public void UnloadEngines() throws Exception;
Scarica tutti gli Engine e deinizializza il pool.
Vedi l’esempio di codice EnginesPool per un esempio di utilizzo della classe EnginesPool.
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 ottenere il messaggio di errore tramite il metodo getMessage(), ma anche recuperarne il codice.
Nell’API di ABBYY FineReader Engine sono presenti diversi metodi con parametri out a cui viene assegnato un nuovo valore dopo la chiamata del metodo e che devono essere passati per riferimento. Questi parametri sono contrassegnati nella libreria dei tipi 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 speciale classe Ref per passare un parametro per riferimento. Vedi gli esempi riportati di seguito.Esempio in cui i parametri out vengono passati per riferimento al metodo IFRPage::FindPageSplitPosition:
Codice di esempio per i parametri out
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();
FineReader Engine supporta l’interfaccia AutoCloseable, che consente di utilizzare 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 seguente):
Codice di esempio
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 di HGLOBALAlcuni metodi dell’API di ABBYY FineReader Engine accettano come parametro di input un handle HGLOBAL a un blocco di memoria (passato come __int64). Poiché HGLOBAL è un’entità specifica di Windows, nel wrapper Java questi metodi ricevono invece il contenuto del blocco di memoria come byte[]. Ecco l’elenco di questi metodi:
I metodi e le proprietà che accettano una combinazione di costanti di enumerazione richiedono che al metodo o alla proprietà venga passato il valore int. Per ottenere il valore int di una costante di enumerazione, usare 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());