Pular para o conteúdo principal
No Linux, consulte a Ajuda do Desenvolvedor da distribuição Linux para ver a lista completa. Uma limitação importante é que os objetos que implementam IEngineLoader não estão disponíveis no Linux nem no macOS (consulte Diferenças entre ABBYY FineReader Engine 12 para Windows e Linux).

Adicionando a biblioteca FineReader Engine a um projeto Java

O ABBYY FineReader Engine inclui um arquivo com.abbyy.FREngine-%BUILD_ID%.jar, que contém a biblioteca de classes Java do FineReader Engine. Você pode encontrá-lo na pasta Inc/Java. O caminho para esse arquivo pode ser especificado no parâmetro classpath da linha de comando e nas configurações do projeto em diferentes ambientes de desenvolvimento Java. Exemplo:
$JDK/bin/javac -classpath <path>/com.abbyy.FREngine-%BUILD_ID%.jar Hello.java
$JDK representa o caminho para o Java Development Kit.
Consulte a lista de Java Development Kits suportados em Requisitos do sistema.

Carregando e descarregando o FineReader Engine

Você pode usar a classe estática Engine para carregar o objeto Engine. A classe Engine fornece métodos que correspondem às funções do ABBYY FineReader Engine para carregar e descarregar o Engine:
FunçãoMétodo da classe EngineAssinatura do método da classe 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 {
            // Carrega o Engine com Licença Online
            engine = Engine.InitializeEngine( path, customerProjectId, LicensePath, LicensePassword, "", "", false );
            try {
                // Carrega um perfil predefinido
                engine.LoadPredefinedProfile( "DocumentConversion_Accuracy" );
                // Processa imagens
                IFRDocument document = engine.CreateFRDocument();
                ...
            } finally {
                engine = null;
                System.runFinalization();
                Engine.DeinitializeEngine();
            }
        } catch( Exception ex ) {
            trace( ex.getMessage() );
        }
    }
    private IEngine engine = null;
...
}
O arquivo com.abbyy.FREngine-%BUILD_ID%.jar é um arquivo autoextraível que é extraído na sua máquina na primeira vez em que você usa a API Java do FineReader Engine. A pasta padrão em que o conteúdo é extraído é Inc/Java . Se você precisar usar outra pasta, chame o método Engine.SetJNIDllFolder antes de carregar o Engine usando qualquer um dos métodos descritos acima. Para descobrir qual pasta está definida no momento para extrair o arquivo, chame o Engine.GetJNIDllFolder .

Tratamento de erros

O ABBYY FineReader Engine pode lançar exceções dos seguintes tipos:
  • java.lang.OutOfMemoryError
  • com.abbyy.FREngine.EngineException
A exceção com.abbyy.FREngine.EngineException herda de java.lang.Exception e contém um método adicional, int getHResult, que retorna o código HRESULT do erro ocorrido. Para uma exceção desse tipo, você pode não apenas recuperar a mensagem de erro usando o método getMessage(), mas também obter o código do erro.
try {
    ...
} catch( Exception ex ) {
    displayMessage( "Message = " + ex.getMessage() );
    if( ex instanceof EngineException ) {
        displayMessage( "HResult = " + Integer.toString( ( ( EngineException )ex ).getHResult() ) );
    }
}

Chamando métodos com parâmetros de saída

A API do ABBYY FineReader Engine inclui vários métodos com parâmetros de saída, que recebem um novo valor após a chamada do método e devem ser passados por referência. Esses parâmetros são marcados na biblioteca de tipos e nas descrições dos métodos nesta Ajuda do Desenvolvedor como [out] ou [in, out]. Ao trabalhar com o ABBYY FineReader Engine em Java, você precisa usar a classe especial Ref para passar um parâmetro por referência. Veja os exemplos abaixo. Exemplo em que os parâmetros de saída são passados por referência para o método 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();
Exemplo em que os parâmetros de entrada/saída são passados por referência para o método 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();

Coleta de lixo

O FineReader Engine oferece suporte ao uso da interface AutoCloseable, o que permite usar a instrução try para gerenciar os recursos alocados aos objetos. Isso significa que, quando o bloco try chega ao fim, todos os recursos alocados são fechados automaticamente, sem a necessidade de chamar explicitamente os métodos de fechamento. Recomendamos que você use a instrução try para todos os objetos no seu código (veja o exemplo abaixo):
try( IFRDocument document = engine.CreateDocument() )
 {
  // Adicionar imagem a um documento
  document.AddImageFile( imagePath, null, null );
  ...
  // Salvar resultados em PDF
  document.Export( pdfExportPath, FileExportFormatEnum.FEF_PDF, pdfParams );
 }

Trabalhando com enumerações

Métodos e Properties que aceitam uma combinação de constantes de enumeração exigem que o valor int seja passado ao método/à propriedade. Para obter o valor int de uma constante de enumeração, use o método getValue, compatível com todas as enumerações. Veja abaixo um exemplo de código que mostra como definir a propriedade BwPictureFormats do objeto PDFPictureCompressionParams:
IPDFExportParams pep = engine.CreatePDFExportParams();
IPDFPictureCompressionParams ppcp = pep.getPictureCompressionParams();
ppcp.setBwPictureFormats(BwPictureFormatsEnum.BWPF_Auto.getValue());

Usando o wrapper com suporte a RMI

Há uma versão separada do wrapper Java com suporte à invocação remota de métodos (RMI). Todas as classes herdam de UnicastRemoteObject e oferecem suporte à interface Remote; todos os métodos podem lançar RemoteException. Por padrão, o wrapper com suporte a RMI redireciona as chamadas de processamento de PDF para uma thread separada com o PDFium inicializado.
O wrapper com suporte a RMI requer o Java Development Kit. Consulte a lista de Java Development Kits compatíveis em Requisitos do sistema.
O pacote com.abbyy.rmi.FREngine contém as interfaces remotas usadas pelo aplicativo cliente; o pacote com.abbyy.rmi.server.FREngine é usado no lado do servidor. Devido às limitações da sobrecarga de métodos, você também precisará usar outra biblioteca dinâmica, libFREngine.rmi_server.so, em vez de libFREngine.so. Esses pacotes são suficientes para uma aplicação cliente-servidor simples. No entanto, o FineReader Engine não é thread-safe por si só e, portanto, exige um esforço adicional por parte do programador para garantir que cada instância de Engine seja acessada por apenas uma thread de trabalho por vez. Consulte os exemplos de código fornecidos com o pacote de distribuição para ver uma implementação reutilizável completa do pool de Engines no lado do servidor e de um cliente multithread que se conecta a ele (exemplos rmiPoolServer e threadPoolClient, pacotes com.abbyy.rmi.pool.FREngine e com.abbyy.rmi.pool.impl.FREngine).

Uso de eventos e interfaces de callback

Observe que os eventos e as interfaces de callback implementados pelo cliente devem ser removidos do Runtime RMI após serem usados:
java.rmi.server.UnicastRemoteObject.unexportObject( callback, true );
callback = null;