JavaプロジェクトへのFineReader Engineライブラリの追加
ABBYY FineReader Engineには、FineReader Engine用のJavaクラスライブラリが含まれたcom.abbyy.FREngine-%BUILD_ID%.jarファイルが用意されています。このファイルは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 の関数 に対応するメソッドが用意されています。
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 が 1 つあります。このメソッドは、発生したエラーの HRESULT コードを返します。この型の例外では、getMessage() メソッドを使用してエラーメッセージを取得できるだけでなく、エラーコードも取得できます。
try {
...
} catch( Exception ex ) {
displayMessage( "Message = " + ex.getMessage() );
if( ex instanceof EngineException ) {
displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
}
}
out-parameter を含むメソッドの呼び出し
ABBYY FineReader Engine API には、メソッド呼び出し後に新しい値を受け取り、参照渡しする必要がある out-parameter を持つメソッドがいくつかあります。これらのパラメーターは、型ライブラリおよびこの開発者向けヘルプのメソッドの説明で [out] または [in, out] として示されています。
Java で ABBYY FineReader Engine を使用する場合、パラメーターを参照渡しするには特別な Ref クラスを使用する必要があります。以下の例を参照してください。
out-parameter を 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 parameter を ICoordinatesConverter::ConvertCoordinates メソッドに参照渡しする例:
in/out parameter のサンプルコード
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 文を使用することをお勧めします (以下の例を参照) :
列挙定数の組み合わせを受け取るメソッドやプロパティでは、そのメソッドまたはプロパティに int 値を渡す必要があります。列挙定数の int 値を取得するには、すべての列挙型でサポートされている getValue メソッドを使用します。
以下は、PDFPictureCompressionParams オブジェクトの BwPictureFormats プロパティを設定する方法を示すコード例です:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());
リモートメソッド呼び出し (RMI) をサポートする Java ラッパーの別バージョンが用意されています。すべてのクラスは UnicastRemoteObject を継承して Remote インターフェイスをサポートしており、すべてのメソッドが RemoteException をスローする可能性があります。RMI 対応ラッパーでは、既定で、PDF 処理の呼び出しが初期化済みの PDFium を使用する別スレッドにリダイレクトされます。
RMI 対応ラッパーを使用するには Java Development Kit が必要です。サポートされている Java Development Kit の一覧については、システム要件 を参照してください。
com.abbyy.rmi.FREngine パッケージにはクライアントアプリケーションで使用するリモートインターフェイスが含まれており、com.abbyy.rmi.server.FREngine パッケージはサーバー側で使用されます。また、メソッドのオーバーロードに関する制限により、libFREngine.so の代わりに別の動的ライブラリ libFREngine.rmi_server.so も使用する必要があります。
これらのパッケージは、シンプルなクライアントサーバーアプリケーションであれば十分です。ただし、FineReader Engine 自体はスレッドセーフではないため、1 つの Engine インスタンスに同時にアクセスするワーカースレッドが常に 1 つだけになるよう、開発者側で追加の対応を行う必要があります。サーバー側の Engine プールの完全で再利用可能な実装と、それに接続するマルチスレッドクライアントについては、配布パッケージに含まれているコードサンプル (rmiPoolServer および threadPoolClient サンプル、com.abbyy.rmi.pool.FREngine パッケージ、com.abbyy.rmi.pool.impl.FREngine パッケージ) を参照してください。
クライアント側で実装したイベントおよびコールバックインターフェイスは、使用後にRMIランタイムから削除する必要があることに注意してください。
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;