跳轉到主要內容
在 Linux 上,完整清單請參閱 Linux 發行版的開發人員說明。另有一項值得注意的限制:實作 IEngineLoader 的物件在 Linux 和 macOS 上皆無法使用 (請參閱 ABBYY FineReader Engine 12 在 Windows 與 Linux 上的差異) 。

將 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
FunctionEngine class methodThe signature of the Engine class method
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 {
            // 使用線上授權載入 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() ) );
    }
}

呼叫含有 out 參數的方法

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

使用支援 RMI 的 wrapper

有一個獨立的 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 集區實作,以及可連線至該集區的多執行緒客戶端,請參閱發行套件隨附的程式碼範例 (rmiPoolServerthreadPoolClient 範例,以及 com.abbyy.rmi.pool.FREngine 和 com.abbyy.rmi.pool.impl.FREngine 套件) 。

使用事件和回呼介面

請注意,由客戶端實作的事件和回呼介面在使用完畢後,應從 RMI 執行階段移除:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;