Pular para o conteúdo principal
O ABBYY FineReader Engine permite adicionar palavras com espaços a um dicionário. Esse recurso pode ser muito útil para verificar palavras como “New York”. Recomendamos usar um dicionário de palavras com espaços durante o reconhecimento em nível de campo, quando é possível reconhecer os campos (pequenos trechos de imagem que contêm fragmentos curtos de texto) com base em informações específicas sobre o tipo de dados que eles podem conter. A palavra “New York”, por exemplo, pode ser útil ao reconhecer endereços. Para reconhecer palavras com espaços, faça o seguinte:
  1. Adicione o caractere “espaço” ao alfabeto do idioma atual.
  2. Adicione ao dicionário as palavras com espaços necessárias.
  3. Defina a propriedade OneWordPerLine do objeto RecognizerParams como TRUE.
Abaixo está uma descrição detalhada dessa operação:
  1. Crie um novo idioma de texto com base em um idioma predefinido. Para isso, crie um objeto TextLanguage usando o método CreateTextLanguage do objeto LanguageDatabase e copie os atributos do idioma predefinido.
  2. Adicione o caractere “espaço” ao objeto BaseLanguage dentro do objeto TextLanguage, usando a propriedade LetterSet do objeto BaseLanguage.
  3. Crie um novo dicionário e adicione a ele todas as palavras com espaços necessárias. Você pode usar o objeto Dictionary para isso.
  4. Crie um objeto UserDictionaryDescription. Atribua o caminho do novo dicionário à propriedade FileName desse objeto.
  5. Adicione o objeto UserDictionaryDescription à coleção DictionaryDescriptions do objeto BaseLanguage.
  6. No objeto RecognizerParams de todos os blocos de texto, atribua o objeto TextLanguage criado anteriormente à propriedade TextLanguage e o valor TRUE à propriedade OneWordPerLine.
Abaixo, você pode ver um exemplo em que o caractere “espaço” foi adicionado ao alfabeto do idioma inglês, e a palavra “New York” foi adicionada ao dicionário.
// Criar um objeto LanguageDatabase
FREngine::ILanguageDatabasePtr pLanguageDatabase = Engine->CreateLanguageDatabase();
// Criar um novo objeto TextLanguage
FREngine::ITextLanguagePtr pTextLanguage = pLanguageDatabase->CreateTextLanguage();
// Copiar todos os atributos do idioma inglês predefinido
FREngine::ITextLanguagePtr pEnglishLanguage =
          Engine->PredefinedLanguages->Find( "English" )->TextLanguage;
pTextLanguage->CopyFrom( pEnglishLanguage );
pTextLanguage->InternalName = L"SampleTL";
// Vincular o novo dicionário ao primeiro (e único) objeto BaseLanguage em TextLanguage
FREngine::IBaseLanguagePtr pBaseLanguage = pTextLanguage->BaseLanguages->Item(0);
// Alterar o nome interno do dicionário para um nome definido pelo usuário
pBaseLanguage->InternalName = L"SampleBL"; 
// Adicionar o caractere de espaço
_bstr_t alphabet = pBaseLanguage->GetLetterSet( FREngine::BLLS_Alphabet );
pBaseLanguage->put_LetterSet( FREngine::BLLS_Alphabet, alphabet + L" " );
 
// Criar um novo dicionário
_bstr_t dictionaryFile = L"D:\\sample.amd";
FREngine::IDictionaryPtr pDictionary =
pLanguageDatabase->CreateNewDictionary( dictionaryFile, FREngine::LI_EnglishUnitedStates );
pDictionary->Name = L"Sample";
// Adicionar palavras com espaço ao dicionário
pDictionary->AddWord( "New York", 100 );
// Obter a coleção de descrições de dicionário e remover todos os itens
FREngine::IDictionaryDescriptionsPtr pDictionaryDescriptions =
 pBaseLanguage->DictionaryDescriptions;
pDictionaryDescriptions->DeleteAll();
// Criar uma descrição de dicionário do usuário e adicioná-la à coleção
FREngine::IDictionaryDescriptionPtr dic =
 pDictionaryDescriptions->AddNew(FREngine::DT_UserDictionary);
// Especificar o caminho para o dicionário que contém palavras com espaços
FREngine::IUserDictionaryDescriptionPtr userDic =
 dic->GetAsUserDictionaryDescription();
userDic->FileName = dictionaryFile;
FREngine::ILayoutPtr pLayout;
...
// Especificar as propriedades do objeto RecognizerParams para todos os blocos de texto
// Percorrer os blocos
for( int i = pLayout->Blocks->Count - 1; i >= 0; i-- ) {
  FREngine::BlockTypeEnum blockType = pLayout->Blocks->Item( i )->Type;
  // Localizar o bloco de texto
  if( blockType != FREngine::BT_Text ) {
    pLayout->Blocks->DeleteAt(i);
  } else {
    pLayout->Blocks->Item(i)->GetAsTextBlock()->RecognizerParams->
 TextLanguage = pTextLanguage;
    pLayout->Blocks->Item(i)->GetAsTextBlock()->RecognizerParams->
 OneWordPerLine = VARIANT_TRUE;
  }
}
...
// Cria um objeto LanguageDatabase
FREngine.ILanguageDatabase languageDatabase = engineLoader.Engine.CreateLanguageDatabase();
// Cria um novo objeto TextLanguage
FREngine.ITextLanguage textLanguage = languageDatabase.CreateTextLanguage();
// Copia todos os atributos do idioma inglês predefinido
FREngine.ITextLanguage englishLanguage = engineLoader.Engine.PredefinedLanguages.Find( "English" ).TextLanguage;
textLanguage.CopyFrom( englishLanguage );
textLanguage.InternalName = "SampleTL";
// Associa o novo dicionário ao primeiro (e único) objeto BaseLanguage em TextLanguage
FREngine.IBaseLanguage baseLanguage = textLanguage.BaseLanguages[0];
// Altera o nome interno do dicionário para um nome definido pelo usuário
baseLanguage.InternalName = "SampleBL";
// Adiciona o caractere de espaço
string alphabet = baseLanguage.get_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet );
baseLanguage.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, alphabet + " " );
// Cria um novo dicionário
string dictionaryFilePath = "D:\\sample.amd";
FREngine.IDictionary dictionary = languageDatabase.CreateNewDictionary( dictionaryFilePath, FREngine.LanguageIdEnum.LI_EnglishUnitedStates );
dictionary.Name = "Sample";
// Adiciona palavras com espaço ao dicionário
dictionary.AddWord( "New York", 100 );
// Obtém a coleção de descrições de dicionário e remove todos os itens
FREngine.IDictionaryDescriptions dictionaryDescriptions = baseLanguage.DictionaryDescriptions;
dictionaryDescriptions.DeleteAll();
// Cria uma descrição de dicionário do usuário e a adiciona à coleção
FREngine.IDictionaryDescription dic = dictionaryDescriptions.AddNew(FREngine.DictionaryTypeEnum.DT_UserDictionary);
// Especifica o caminho para o dicionário que contém palavras com espaços
FREngine.IUserDictionaryDescription userDic = dic.GetAsUserDictionaryDescription();
userDic.FileName = dictionaryFilePath;
FREngine.ILayout layout;
...
// Especifica as propriedades do objeto RecognizerParams de todos os blocos de texto
// Percorre os blocos
for( int i = layout.Blocks.Count - 1; i >= 0; i-- ) {
    FREngine.IBlockTypeEnum blockType = layout.Blocks[i].Type;
    // Localiza o bloco de texto
    if( blockType != FREngine.BlockTypeEnum.BT_Text ) {
        layout.Blocks.DeleteAt(i);
    } else {
        layout.Blocks[i].GetAsTextBlock().RecognizerParams.TextLanguage = textLanguage;
        layout.Blocks[i].GetAsTextBlock().RecognizerParams.OneWordPerLine = true;
    }
}
...

Veja também

Trabalhando com idiomas Trabalhando com dicionários Reconhecimento em nível de campo