Пакет ABBYY FlexiCapture Engine включает в себя следующие компоненты:
ABBYY FlexiCapture Engine предоставляет 2 модели взаимодействия:
В данной модели используется специальная структура, называемая проектом FlexiCapture. Проект включает в себя гибкие формы распознавания, классификатор, описания типов распознаваемых документов, настройки распознавания. На вход соответственно подаётся сам проект, и изображения, которые нужно распознать. На выходе мы получаем распознаваемые данные.
Отличие данной модели от предыдущей лишь в том, что в данном случае мы не используем некую статическую структуру в виде проекта. Модель дает нам самим выбирать гибкие формы, классификаторы, настройки для распознавания конкретного изображения.
Рассмотрим взаимодействие IS-Builder с ABBYY FlexiCapture Engine на примере более простой модели, на основе проекта FlexiCapture. Организовывать работы мы будем через COM интерфейсы.
Для загрузки FlexiCapture Engine нам необходимо получить объект EngineLoader. Данный объект предоставляет методы для загрузки и инициализации самого FlexiCapture Engine. Для получения этого объекта существуют следующие программные идентификаторы: FCEngine.InprocLoader и FCEngine.OutprocLoader. В первом варианте загрузчик загружает непосредственно в основной процесс, во втором в отдельный рабочий процесс. Второй вариант интересен тем, что можно управлять приоритетом и временем жизни процесса, а также создавать пул из рабочих процессов, каждый их которых будет работать параллельно и независимо друг от друга. Второй вариант наиболее интересен для серверных решений. Для простоты рассмотрим первый вариант. Для загрузки нам также потребуется ключ разработчика, и путь, где будут храниться пользовательские настройки приложения.
Loader = CreateObject("FCEngine.InprocLoader")
Engine = Loader.Load(SDKKey; AppData)
В итоге мы получили объект Engine.
Для загрузки проекта можно воспользоваться методом IEngine.OpenProject. В метод передаётся один единственный параметр это путь к заголовочному файлу проекта с расширением *.fcproj.
Project = Engine.OpenProject(ProjectPath)
В данном шаге нам нужно произвести следующие действия: создать батч, открыть его, после чего добавить изображения. Кроме этого на данном этапе можно выбрать тип пакета, если он существует в проекте. На данном этапе нам необходимы следующие данные: имя батча, имя типа создаваемого батча (необязательно), пути к файлам изображений.
Посмотреть, как это делается можно на примере ниже.
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. В него передается коллекция путей к файлам изображений, можно указать конкретные параметры для каждого изображения, а также задать уникальные идентификаторы.
Для запуска распознавания существует метод IBatch.Recognize. На вход он принимает следующие аргументы: коллекция идентификаторов добавленных документов, режим распознавания, коллекция описаний секций документов. Первый и последний параметры нас особо не интересуют. Существуют 3 режима распознавания:
Сначала производится выбор подходящего гибкого описания, затем производится полное распознавание документов, и затем определение регионов, выборка и заполнение полей.
В отличии от предыдущего режима, для тех изображений у которых уже применено какое-то гибкое описание новое наложение не производится. Все документы по прежнему распознаются полностью.
Так как у нас все документы всегда новые, то будем использовать режим RM_ReApplyDocumentDefinitions.
RM_ReApplyDocumentDefinitions = 0
Batch.Recognize(nil; RM_ReApplyDocumentDefinitions; nil)
Экспорт результатов производится при помощи метода 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 файл. Необходимо заполнить следующие поля:
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 файлы содержат распознанные данные, название наложенного гибкого описания. Также в настройках можно настроить выгрузку типов полей, ошибок распознавания, позиций полей на координатной сетке изображения.
На данном шаге нужно выгрузить всё, что мы создали и загрузили, а это:
Batch.Close
Project.Batches.DeleteAll
Project.Close
Loader.Unload
С данным инструментом мне довелось познакомиться на проекте Conterra FIM (http://www.orienge.com/fim), в котором FlexiCapture Engine используется для распознавания входящих инвойсов.
ABBYY FlexiCapture Engine – довольно мощный инструмент для обработки и распознавания данных на изображениях. В статье был показан лишь пример работы с ним. Кроме распознавания, в нём присутствуют средства по верификации данных и обработке изображений. Взамен богатой функциональности приходится платить высокой ценой. Цена лицензии на данный момент колеблется от 4.900 €.
Понятно, спасибо за разъяснения. А в российском DIRECTUM мы подобный функционал в готовом виде увидим?
Авторизуйтесь, чтобы написать комментарий