跳转到主要内容
对于 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 类提供的方法与 ABBYY FineReader Engine 用于加载和卸载 Engine 的函数相对应:
函数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 {
            // 使用 Online License 加载 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] 或 [in, out]。 在 Java 中使用 ABBYY FineReader Engine 时,需要使用专用的 Ref 类以引用方式传递参数。请参阅以下示例。 以下示例演示如何将输出参数以引用方式传递给 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();
以下示例演示如何将输入/输出参数以引用方式传递给 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 的包装器

有一个单独的 Java 包装器版本,支持远程方法调用 (RMI) 。所有类均继承自 UnicastRemoteObject 并支持 Remote 接口;所有方法均可能抛出 RemoteException。支持 RMI 的包装器默认将 PDF 处理调用重定向到已初始化 PDFium 的独立线程。
支持 RMI 的包装器需要 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.FREnginecom.abbyy.rmi.pool.impl.FREngine 包) 。

使用事件和回调接口

请注意,客户端实现的事件和回调接口在使用完毕后应从 RMI 运行时中移除:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;