將 FineReader Engine 程式庫新增至 Java 專案
ABBYY FineReader Engine 包含 com.abbyy.FREngine-%BUILD_ID%.jar 檔案,其中含有 FineReader Engine 的 Java 類別程式庫。您可以在 Inc/Java 資料夾中找到此檔案。您可以在命令列的 classpath 參數中,以及各種 Java 開發環境的專案設定中指定此檔案的路徑。範例:
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
$JDK 為 Java Development Kit 的路徑。
支援的 Java Development Kit 清單請參閱系統需求。
載入與解除載入 FineReader Engine
您可以使用靜態 Engine 類別來載入 Engine 物件。
Engine 類別提供的方法,對應到用於載入及解除載入 Engine 的 ABBYY FineReader Engine functions:
| Function | Engine class method | The signature of the Engine class method |
|---|
| InitializeEngine | InitializeEngine | csharp static public IEngine InitializeEngine( String dllFolder, String customerProjectId, String licensePath, String licensePassword, String dataFolder, String tempFolder, boolean isSharedCPUCoresMode ) throws Exception; |
| DeinitializeEngine | DeinitializeEngine | static public void DeinitializeEngine() throws Exception; |
import com.abbyy.FREngine.*;
public class Hello {
public static void main( String[] args )
{
try {
// 使用線上授權載入 Engine
engine = Engine.InitializeEngine( path, customerProjectId, LicensePath, LicensePassword, "", "", false );
try {
// 載入預先定義設定檔
engine.LoadPredefinedProfile( "DocumentConversion_Accuracy" );
// 處理影像
IFRDocument document = engine.CreateFRDocument();
...
} finally {
engine = null;
System.runFinalization();
Engine.DeinitializeEngine();
}
} catch( Exception ex ) {
trace( ex.getMessage() );
}
}
private IEngine engine = null;
...
}
com.abbyy.FREngine-%BUILD_ID%.jar 檔案是一個自解壓縮封存檔,當您第一次使用 FineReader Engine Java API 時,會在您的電腦上解壓縮。解壓縮內容的預設資料夾為 Inc/Java。如果您需要使用其他資料夾,請在以上述任一方法載入 Engine 之前,先呼叫 Engine.SetJNIDllFolder 方法。若要確認目前設定用於解壓縮封存檔的資料夾,請呼叫 Engine.GetJNIDllFolder。
ABBYY FineReader Engine 可能會拋出下列型別的例外狀況:
- java.lang.OutOfMemoryError
- com.abbyy.FREngine.EngineException
com.abbyy.FREngine.EngineException 例外狀況繼承自 java.lang.Exception,並包含一個額外的方法 int getHResult,該方法會回傳所發生錯誤的 HRESULT 代碼。對於這種類型的例外狀況,您不僅可以使用 getMessage() 方法取得錯誤訊息,也可以取得錯誤代碼。
try {
...
} catch( Exception ex ) {
displayMessage( "Message = " + ex.getMessage() );
if( ex instanceof EngineException ) {
displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
}
}
ABBYY FineReader Engine API 中有數個方法含有 out 參數,這些參數會在方法呼叫後取得新值,且必須以參考傳遞。這些參數會在型別程式庫中,以及本開發人員說明的方法描述中標示為 [out] 或 [in, out]。
在 Java 中使用 ABBYY FineReader Engine 時,您必須使用特殊的 Ref 類別,才能以參考方式傳遞參數。請參閱下列範例。
將 out 參數以參考方式傳遞至 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();
將 in/out 參數以參考方式傳遞至 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();
FineReader Engine 支援 AutoCloseable 介面,讓您可使用 try 陳述式來存取為物件配置的資源。也就是說,當 try 區塊執行完畢時,所有已配置的資源都會自動關閉,無需明確呼叫關閉方法。我們建議您在程式碼中對所有物件都使用 try 陳述式 (請參閱下方範例) :
try( IFRDocument document = engine.CreateDocument() )
{
// 將影像新增至文件
document.AddImageFile( imagePath, null, null );
...
// 將結果儲存為 PDF
document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
}
接受列舉常數組合的方法和屬性,需要將 int 值傳遞給方法/屬性。若要取得列舉常數的 int 值,請使用所有列舉均支援的 getValue 方法。
以下是範例程式碼,示範如何設定 PDFPictureCompressionParams 物件的 BwPictureFormats 屬性:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());
有一個獨立的 Java wrapper 版本支援遠端方法呼叫 (RMI) 。所有類別都繼承自 UnicastRemoteObject,並支援 Remote 介面;所有方法都可能擲回 RemoteException。依預設,支援 RMI 的 wrapper 會將 PDF 處理呼叫重新導向至已初始化 PDFium 的另一個執行緒。
支援 RMI 的 wrapper 需要 Java Development Kit。支援的 Java Development Kit 清單請參閱系統需求。
com.abbyy.rmi.FREngine 套件包含客戶端應用程式使用的遠端介面;com.abbyy.rmi.server.FREngine 套件則用於伺服器端。由於方法多載的限制,您還需要使用另一個動態程式庫 libFREngine.rmi_server.so,而非 libFREngine.so。
對於簡單的客戶端-伺服器應用程式,這些套件已足夠。不過,FineReader Engine 本身並非執行緒安全,因此需要程式設計人員額外處理,以確保任何一個 Engine 執行個體在同一時間只會由一個工作執行緒存取。如需可重複使用的完整伺服器端 Engine 集區實作,以及可連線至該集區的多執行緒客戶端,請參閱發行套件隨附的程式碼範例 (rmiPoolServer 和 threadPoolClient 範例,以及 com.abbyy.rmi.pool.FREngine 和 com.abbyy.rmi.pool.impl.FREngine 套件) 。
請注意,由客戶端實作的事件和回呼介面在使用完畢後,應從 RMI 執行階段移除:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;