메인 콘텐츠로 건너뛰기
Linux의 경우 전체 목록은 Linux 배포판의 개발자 도움말를 참조하세요. 한 가지 눈에 띄는 제한 사항은 IEngineLoader를 구현하는 객체를 Linux 또는 macOS에서는 사용할 수 없다는 점입니다(Windows용 ABBYY FineReader Engine 12와 Linux용 ABBYY FineReader Engine 12의 차이점 참조).

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 클래스는 엔진을 로드하고 언로드하는 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.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.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 지원 래퍼 사용

원격 메서드 호출(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 자체는 스레드 안전하지 않으므로, 하나의 엔진 인스턴스에는 한 번에 하나의 작업자 스레드만 접근하도록 보장하기 위해 프로그래머가 추가로 신경 써야 합니다. 서버 측 엔진 풀과 여기에 연결되는 멀티스레드 클라이언트의 완전한 재사용 가능 구현은 배포 패키지에 포함된 코드 샘플(rmiPoolServerthreadPoolClient 샘플, com.abbyy.rmi.pool.FREngine 및 com.abbyy.rmi.pool.impl.FREngine 패키지)을 참조하세요.

이벤트 및 콜백 인터페이스 사용

클라이언트에서 구현한 이벤트와 콜백 인터페이스는 사용 후 RMI 런타임에서 제거해야 합니다.
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;