在 Java 中使用 ABBYY FineReader Engine
Java 独立于平台,没有特殊工具用于和 COM 这种依靠平台的技术进行集成。相反,Java 提供了一个真正独立于平台但级别较低的接口用于和任何本地平台集成 – Java 本地接口 (JNI)。用 JNI 创建包装器并不简单:必须为打算使用的每个接口和方法写入包装器,这会产生大量代码。FineReader Engine 通过提供适合 Engine 库的即时可用 Java 类别避免上述问题。您可直接从 Java 应用程序中使用这些 Java 类别。
如果您在 Windows 操作系统上开发应用程序但打算在 Linux 或 Mac OS 上运行,无需对代码进行任何更改,使用来自分发包的 .jar 文件即可。
除个别例外情况外,三个平台的 API 是相同的。有关完整列表另请参阅 Linux 发行版本的开发人员帮助。 一个明显限制是实施 IEngineLoader 的对象在 Linux 和 Mac OS 上不可用(请参见ABBYY FineReader Engine 12 在 Windows 和 Linux 之间的区别)。
添加 FineReader Engine 库到 Java 项目
ABBYY FineReader Engine 包括一个 com.abbyy.FREngine-%BUILD_ID%.jar 文件,其包含适合带有 Java 类别库的 FineReader Engine。您可以在 Inc/Java 文件夹中找到它。在不同的 Java 开发环境中,该文件的路径可以在命令行和项目设置中的 classpath 参数中指定。示例:
$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 类别方法的签名 |
---|---|---|
InitializeEngine | InitializeEngine |
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; |
示例代码
注: 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 中有几种方法有外参数,它们在方法调用后会收到新值,必须以引用方式传递。这些参数在类型库和本“Developer's Help”的方法说明中被标记为 [out] or [in, out]。
当在 Java 中使用 ABBYY FineReader Engine 时,您必须使用特殊的 Ref 类别来通过引用传递参数。请参见以下示例。
外参数以引用方式传递到 IFRPage::FindPageSplitPosition 方法的示例:
外参数的示例代码
输入/输出参数被引用传递到 ICoordinatesConverter::ConvertCoordinates 方法的示例:
输入/输出参数的示例代码
收集垃圾
ABBYY 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 包装版本支持“远程方法调用” (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 的服务器端池和连接到它的多线程客户端进行完整的可重复使用实施 (rmiPoolServer 和 threadPoolClient 示例,com.abbyy.rmi.pool.FREngine 和 com.abbyy.rmi.pool.impl.FREngine 数据包)。
使用事件和回调界面
注意,客户端实施的事件和回调界面应该在使用以下对象后从 RMI 运行时间删除:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true ); callback = null;
03.07.2024 8:50:25