Abbyy FlexiCapture Engine + IS-Builder = Автоматизация ввода и обработки документов

8 3

ABBYY FlexiCapture – это решение для потокового ввода данных и обработки документов. Автоматически извлекает информацию из бумажных документов и форм и сохраняет ее для различных информационных систем предприятия. ABBYY FlexiCapture Engine – инструментарий для разработчика, который включает в себя функционал ABBYY FlexiCapture и предоставляет SDK для разработки приложений.

Пакет ABBYY FlexiCapture Engine включает в себя следующие компоненты:

  • платформу распознавания, библиотеки ABBYY FlexiCapture без интерфейсов взаимодействия с пользователем;
  • SDK: Заголовочные файлы для различных языков программирования(С, С++, С#, Delphi,VB, VB.Net), библиотеки с COM моделью подключения, справка, примеры использования;
  • сервер лицензий.

 

ABBYY FlexiCapture Engine предоставляет 2 модели взаимодействия:

  1. Обработка с использование проект FlexiCapture

В данной модели используется специальная структура, называемая проектом FlexiCapture. Проект включает в себя гибкие формы распознавания, классификатор, описания типов распознаваемых документов, настройки распознавания. На вход соответственно подаётся сам проект, и изображения, которые нужно распознать. На выходе мы получаем распознаваемые данные.

  1. Обработка с использованием процессора FlexiCapture

Отличие данной модели от предыдущей лишь в том, что в данном случае мы не используем некую статическую структуру в виде проекта. Модель дает нам самим выбирать гибкие формы, классификаторы, настройки для распознавания конкретного изображения.

Рассмотрим взаимодействие IS-Builder с ABBYY FlexiCapture Engine на примере более простой  модели, на основе проекта FlexiCapture. Организовывать работы мы будем через COM интерфейсы.

Шаг 1. Загрузка FlexiCapture Engine

Для загрузки FlexiCapture Engine нам необходимо получить объект EngineLoader. Данный объект предоставляет методы для загрузки и инициализации самого FlexiCapture Engine. Для получения этого объекта существуют следующие программные идентификаторы: FCEngine.InprocLoader и FCEngine.OutprocLoader. В первом варианте загрузчик загружает непосредственно в основной процесс, во втором в отдельный рабочий процесс. Второй вариант интересен тем, что можно управлять приоритетом и временем жизни процесса, а также создавать пул из рабочих процессов, каждый их которых будет работать параллельно и независимо друг от друга. Второй вариант наиболее интересен для серверных решений. Для простоты рассмотрим первый вариант. Для загрузки нам также потребуется ключ разработчика, и путь, где будут храниться пользовательские настройки приложения.

Loader = CreateObject("FCEngine.InprocLoader")
Engine = Loader.Load(SDKKey; AppData)

В итоге мы получили объект Engine.

Шаг 2. Открытие проекта FlexiCapture

Для загрузки проекта можно воспользоваться методом IEngine.OpenProject. В метод передаётся один единственный параметр это путь к заголовочному файлу проекта с расширением *.fcproj.

Project = Engine.OpenProject(ProjectPath)

Шаг 3. Добавление изображений

В данном шаге нам нужно произвести следующие действия: создать батч, открыть его, после чего добавить изображения. Кроме этого на данном этапе можно выбрать тип пакета, если он существует в проекте. На данном этапе нам необходимы следующие данные: имя батча, имя типа создаваемого батча (необязательно), пути к файлам изображений.

Посмотреть, как это делается можно на примере ниже.

BatchTypes = Project.BatchTypes  // Получаем все типы батчей
BatchType = nil
I = 0

// Выбираем первый попавшийся тип с нужным именем типа
while I < BatchTypes.Count
  if BatchTypes.Element(I).Name == BatchTypeName
    BatchType = BatchTypes.Element(I)
    I = BatchTypes.Count
  endif
  I = I + 1
endwhile

// Создаем новый батч с конкретным типом или с типом по умолчанию
if Assigned(BatchType)
  Batch = Project.Batches.AddNewEx(BatchType; BatchName)
else
  Batch = Project.Batches.AddNew(BatchName)
endif

Batch.Open // Открываем батч

// Добавляем изображения в пакет
foreach DocFilePath in DocFilesList // IStringList
  Batch.AddImage(DocFilePath)
endforeach

В итоге мы получили батч с добавленными изображениями готовыми к распознаванию. При большом объеме изображений можно также использовать метод IBatch.AddImages. В него передается коллекция путей к файлам изображений, можно указать конкретные параметры для каждого изображения, а также задать уникальные идентификаторы.

Шаг 4. Распознавание

Для запуска распознавания существует метод IBatch.Recognize. На вход он принимает следующие аргументы: коллекция идентификаторов добавленных документов, режим распознавания, коллекция описаний секций документов. Первый и последний параметры нас особо не интересуют. Существуют 3 режима распознавания:

Сначала производится выбор подходящего гибкого описания, затем производится полное распознавание документов, и затем определение регионов, выборка и заполнение полей.

В отличии от предыдущего режима, для тех изображений у которых уже применено какое-то гибкое описание новое наложение не производится. Все документы по прежнему распознаются полностью.

  1. RM_ReApplyDocumentDefinitions. Сначала производится выбор подходящего гибкого описания, затем производится полное распознавание документов, и затем определение регионов, выборка и заполнение полей.
  2. RM_ReRecognizeAll. В отличии от предыдущего режима, для тех изображений у которых уже применено какое-то гибкое описание новое наложение не производится. Все документы по прежнему распознаются полностью.
  3. RM_ReRecognizeMinimal. В этом режиме распознавание и наложение гибких описаний происходит только для изменившихся или новых документов.

 

Так как у нас все документы всегда новые, то будем использовать режим RM_ReApplyDocumentDefinitions.

RM_ReApplyDocumentDefinitions = 0
Batch.Recognize(nil; RM_ReApplyDocumentDefinitions; nil)

Шаг 5. Экспорт результатов

Экспорт результатов производится при помощи метода IBatch.Export. На вход он принимает 2 параметра: коллекцию идентификаторов изображений, параметры экспорта.

Начнем с коллекции идентификаторов изображений. Важно отметить, что экспортировать результаты можно только у тех изображений, к которым FlexiCapture смог применить гибкое описание. При попытке экспорта результатов изображения без гибкого описания срабатывает исключение. Кодом ниже мы получаем такую коллекцию.

RecognizedDocs = Engine.CreateLongsCollection  // Создаем пустую коллекцию
I = 0
while I < Batch.Documents.Count
  Doc = Batch.Documents.Element(I) // Получаем изображения по очереди
  if Assigned(Doc.DocumentDefinition)
    RecognizedDocs.Add(Doc.ID)  // Сохраняем ID, если описание наложено
  endif
  I = I + 1
endwhile

Далее можно настроить параметры экспорта. FlexiCapture Engine предлагает нам 2 варианта экспорта результатов: в файл или предоставить действия скрипту заданному в гибком описании. Также поддерживается несколько различных форматов файлов:TXT, CSV, DBF, XML, XLS. По каждому из форматов файлов имеются свои конкретные настройки. Для примера рассмотрим экспорт в XML файл. Необходимо заполнить следующие поля:

  • RootPath – путь к папке, в которую будут сохраняться результаты;
  • FileNamePattern – шаблон наименования файлов. Шаблон строится из допустимых символов алфавита, а также предопределённых тегов(имя проекта, батча, имя исходного файла, идентификатор, время и др.);
  • FileFormat – формат файла(TXT, CSV, DBF, XML, XLS), задаётся числовыми константами, которые можно найти в справке по FCE;
  • XMLParams – параметры экспорта в XML.
ExportParams = Engine.CreateExportParams(EDT_File)
ExportParams.IgnoreRuleErrors = True  // Игнорируем ошибки наложения
FileExportParams = ExportParams.FileExportParams
FileExportParams.RootPath = RecognizeFolderName
// Имя соответствует исходному файлу
FileExportParams.FileNamePattern = ""
FileExportParams.FileFormat = FEF_XML
FileExportParams.XMLParams.EncodingType = TET_UTF8

Ну и собственно выгружаем результаты.

if RecognizedDocs.Count > 0
  Batch.Export(RecognizedDocs; ExportParams)
endif

В результате у нас в папке создадутся XML для каждого изображения. XML файлы содержат распознанные данные, название наложенного гибкого описания. Также в настройках можно настроить выгрузку типов полей, ошибок распознавания, позиций полей на координатной сетке изображения.

Шаг 6. Выгрузка FlexiCapture Engine

На данном шаге нужно выгрузить всё, что мы создали и загрузили, а это:

  • закрыть батч, удалить его, если не хотим оставлять в проекте;
  • закрыть проект;
  • выгрузить Engine.
Batch.Close
Project.Batches.DeleteAll
Project.Close
Loader.Unload

Выводы

С данным инструментом мне довелось познакомиться на проекте Conterra FIM (http://www.orienge.com/fim), в котором FlexiCapture Engine используется для распознавания входящих инвойсов.

ABBYY FlexiCapture Engine – довольно мощный инструмент для обработки и распознавания данных на изображениях. В статье был показан лишь пример работы с ним. Кроме распознавания, в нём присутствуют средства по верификации данных и обработке изображений. Взамен богатой функциональности приходится платить высокой ценой. Цена лицензии на данный момент колеблется от 4.900 €. 

Дмитрий Тарасов
Пакет ABBYY FlexiCapture Engine включает в себя следующие компоненты: платформу распознавания, библиотеки ABBYY FlexiCapture без интерфейсов взаимодействия с пользователем; SDK: Заголовочные файлы для различных языков программирования(С, С++, С#, Delphi,VB, VB.Net), библиотеки с COM моделью подключения, справка, примеры использования; сервер лицензий.
Работать с ABBYY FlexiCapture Engine можно только через COM? Получается, что эти компоненты необходимо устанавливать на всех рабочих местах, где будет осуществляться распознавание? Нет никаких готовых веб-сервисов, только если свой разрабатывать?
Цена лицензии на данный момент колеблется от 4.900 €. 
ABBYY FlexiCapture Engine нужен только на этапе разработки? Когда все необходимые компоненты разработаны, достаточно будет приобрести только ABBYY FlexiCapture без инструментария разработчика и каким-нибудь образом прикрутить к нему уже разработанные компоненты?
Никита Данилов
Работать с ABBYY FlexiCapture Engine можно только через COM? Получается, что эти компоненты необходимо устанавливать на всех рабочих местах, где будет осуществляться распознавание? Нет никаких готовых веб-сервисов, только если свой разрабатывать?
Необязательно, можно обращаться напрямую к функциям из библиотек. Да на всех рабочих местах. Есть обычный Flexi Capture и веб-сервисы, через которые можно работать через SOAP, но функционал значительно урезан, через soap нельзя управлять процессом распознавания, можно его только инициировать.
 
ABBYY FlexiCapture Engine нужен только на этапе разработки? Когда все необходимые компоненты разработаны, достаточно будет приобрести только ABBYY FlexiCapture без инструментария разработчика и каким-нибудь образом прикрутить к нему уже разработанные компоненты?
Для использования также ставится FC Engine, но по другой лицензии, именуемой Runtime. сам Abbyy Flexi Capture ставить не нужно и к ниму никак прикрутить не получится так как он никаких интерфейсов не предоставляет.
Дмитрий Тарасов

Понятно, спасибо за разъяснения. А в российском DIRECTUM мы подобный функционал в готовом виде увидим?

Авторизуйтесь, чтобы написать комментарий