메인 콘텐츠로 건너뛰기
이 항목은 Windows용 FRE에 해당합니다.

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 클래스는 엔진을 로드하고 언로드할 때 사용하는 ABBYY FineReader Engine functions에 대응하는 메서드를 제공합니다.
함수Engine 클래스 메서드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 {
            // 온라인 라이선스로 Engine 로드
            engine = Engine.InitializeEngine( dllPath, 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을 통해 엔진을 로드하려면 GetEngineInprocLoader 또는 GetEngineOutprocLoader 메서드를 사용합니다. 자세한 내용은 IEngineLoader 인터페이스 설명을 참조하세요. 로드할 때 GetEngineOutprocLoader 메서드를 사용하는 경우 부모 프로세스가 자동으로 설정되므로 IHostProcessControl::SetClientProcessId 메서드를 호출할 필요가 없습니다.
애플리케이션을 Windows에서 개발했지만 Linux에서 실행할 예정이라면 엔진을 로드할 때 이 메서드들을 사용하지 마세요. 위에서 설명한 InitializeEngine 메서드만 사용해야 합니다. 이는 IEngineLoader를 구현하는 객체를 Linux에서는 사용할 수 없기 때문입니다.
import com.abbyy.FREngine.*;
// 온라인 라이선스로 Engine 로드
engineLoader = Engine.GetEngineInprocLoader();
engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );
...
// Engine 언로드
engine = null;
System.runFinalization();
engineLoader.ExplicitlyUnload();
engineLoader = null;
System.runFinalization();
import com.abbyy.FREngine.*;
// 온라인 라이선스로 Engine 로드
engineLoader = Engine.GetEngineOutprocLoader();
engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );
...
// Engine 언로드
engine = null;
System.runFinalization();
engineLoader.ExplicitlyUnload();
engineLoader = null;
System.runFinalization();
엔진 로더를 통해 생성된 엔진 객체로 작업할 때 Engine 클래스는 인터페이스 포인터를 스레드 간에 마샬링할 수 있도록 해당 COM 함수를 호출하는 메서드를 제공합니다.
메서드시그니처설명
MarshalInterfacelong MarshalInterface();IEngine 인터페이스를 마샬링하기 위해 CoMarshalInterface COM 함수를 호출합니다. 이 메서드는 다른 스레드에서 프록시 객체를 생성하는 데 필요한 데이터를 사용할 수 있도록 엔진이 생성된 스레드에서 호출해야 합니다. 마샬링 데이터에 대한 handle을 반환합니다.
UnmarshalInterfacecsharp IEngine UnmarshalInterface( long handle ); IEngine 인터페이스의 마샬링을 해제, 즉 클라이언트 프로세스가 엔진 자체와 동일한 방식으로 상호 작용할 수 있는 프록시 객체를 생성하기 위해 CoUnmarshalInterface COM 함수를 호출합니다. 입력 파라미터로 마샬링 데이터에 대한 handle(MarshalInterface 메서드에서 반환됨)을 받아 IEngine 인터페이스에 대한 포인터를 반환합니다.
com.abbyy.FREngine-%BUILD_ID%.jar 파일은 자체 압축 해제 아카이브로, FineReader Engine Java API를 처음 사용할 때 컴퓨터에 압축이 풀립니다. 압축이 풀리는 기본 폴더는 Windows의 경우 Inc\Java입니다. 다른 폴더를 사용해야 하는 경우에는 위에서 설명한 방법 중 하나로 엔진을 로드하기 전에 Engine.SetJNIDllFolder 메서드를 호출하십시오. 현재 아카이브 압축 해제에 사용되도록 설정된 폴더를 확인하려면 Engine.GetJNIDllFolder를 호출하십시오.

멀티스레드 Java 애플리케이션에서 엔진 사용

멀티스레드 Java 애플리케이션에서는 EnginesPool 클래스를 사용할 수 있습니다. 이 클래스는 FineReader Engine 객체의 풀을 생성하고 관리하는 데 필요한 기능을 모두 제공하는 포괄적인 솔루션입니다. 또한 이 클래스는 java.lang.Runnable 인터페이스를 구현합니다.
public class EnginesPool implements Runnable;
EnginesPool 클래스의 메서드는 다음과 같습니다.
메서드시그니처설명
constructorpublic EnginesPool( int enginesCount, int waitingEngineTimeout, String customerProjectId, String licensePath, String licensePassword, String dataFolder, String tempFolder, boolean isSharedCPUCoresMode ) throws Exception;enginesCount개의 엔진으로 새 풀을 생성합니다. waitingEngineTimeout은 EnginesPool.GetEngine의 제한 시간을 설정합니다. 다른 매개변수는 InitializeEngine과 동일합니다.
GetEnginecsharp public IEngine GetEngine() throws Exception; 풀에서 엔진 인스턴스를 가져옵니다. waitingEngineTimeout을 초과하면 예외를 발생시킵니다.
ReleaseEnginecsharp public void ReleaseEngine( IEngine engine, boolean isRecycleRequired ) throws Exception; 엔진 인스턴스를 풀로 반환합니다. isRecycleRequired가 true이면 이 인스턴스를 삭제하고 새 인스턴스로 교체합니다(사용 한도에 도달하지 않았거나 자동 재활용이 비활성화된 경우에도 마찬가지).
SetAutoRecycleUsageCountpublic void SetAutoRecycleUsageCount( int value );이 풀에서 단일 엔진 인스턴스를 자동으로 재활용하기 전까지, 즉 자동으로 삭제되고 새 인스턴스로 교체되기 전까지 몇 번 재사용할 수 있는지 설정합니다. 자동 재활용을 하지 않으려면 개수를 0으로 설정할 수 있습니다(이 경우 ReleaseEngine을 통한 수동 재활용만 가능). 기본값은 0입니다(자동 재활용 안 함).
GetAutoRecycleUsageCountpublic int GetAutoRecycleUsageCount();이 풀의 엔진 인스턴스 재사용 한도를 가져옵니다.
UnloadEnginespublic void UnloadEngines() throws Exception;모든 엔진을 언로드하고 풀을 종료합니다.
EnginesPool 클래스 사용 예는 EnginesPool 코드 예제를 참조하세요.

오류 처리

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 클래스를 사용해야 합니다. 아래 예제를 참조하세요. 다음은 IFRPage::FindPageSplitPosition 메서드에 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();
다음은 ICoordinatesConverter::ConvertCoordinates 메서드에 in/out 매개변수를 참조로 전달하는 예제입니다.
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();
다음 예제는 IPlainText::GetCharacterData 메서드에 배열 out 매개변수를 참조로 전달하는 방법을 보여줍니다.
Ref<int[]> _leftBorders = new Ref<int[]>();
Ref<int[]> _topBorders = new Ref<int[]>();
Ref<int[]> _rightBorders = new Ref<int[]>();
Ref<int[]> _bottomBorders = new Ref<int[]>();
Ref<int[]> _confidences = new Ref<int[]>();
Ref<boolean[]> _isSuspicious = new Ref<boolean[]>();
plainText.GetCharacterData( _pageNumbers, _leftBorders, _topBorders, _rightBorders, _bottomBorders, _confidences, _isSuspicious );
int[] pageNumbers = _pageNumbers.get();
int[] leftBorders = _leftBorders.get();
int[] topBorders = _topBorders.get();
int[] rightBorders = _rightBorders.get();
int[] bottomBorders = _bottomBorders.get();
int[] confidences = _confidences.get();
boolean[]isSuspicious = _isSuspicious.get();
Ref<int[]> _pageNumbers = new Ref<int[]>();

가비지 컬렉션

FineReader Engine은 AutoCloseable 인터페이스를 지원하므로, 객체에 할당된 리소스를 사용할 때 try 문을 사용할 수 있습니다. 즉, try 블록이 끝나면 종료 메서드를 명시적으로 호출하지 않아도 할당된 모든 리소스가 자동으로 닫힙니다. 코드의 모든 객체에 대해 try 문을 사용하는 것을 권장합니다(아래 예제 참조).
try( IFRDocument document = engine.CreateDocument() )
 {
  // 문서에 이미지 추가
  document.AddImageFile( imagePath, null, null );
  ...
  // 결과를 PDF로 저장
  document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
 }
HGLOBAL 작업 ABBYY FineReader Engine API의 일부 메서드는 입력 매개변수로 메모리 블록에 대한 HGLOBAL handle을 받습니다(__int64로 전달됨). HGLOBAL은 Windows 전용 요소이므로 Java wrapper에서는 이러한 메서드가 메모리 블록의 콘텐츠를 대신 byte[]로 받습니다. 이러한 메서드는 다음과 같습니다. 반면 Handle 객체를 반환하는 메서드는 Java wrapper에서도 그대로 Handle 객체를 반환합니다.

열거형 사용하기

열거형 상수의 조합을 받는 메서드와 속성에는 int 값을 메서드나 속성에 전달해야 합니다. 열거형 상수의 int 값을 가져오려면 모든 열거형에서 지원되는 getValue 메서드를 사용하세요. 다음은 PDFPictureCompressionParams 객체의 BwPictureFormats 속성을 설정하는 방법을 보여 주는 샘플 코드입니다:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());
참고 항목 엔진 객체를 로드하는 다양한 방법 Windows용 Java를 사용한 크로스 플랫폼 개발 Windows용