![PassportReader - торт!](https://habrastorage.org/storage2/e87/8ee/c25/e878eec25b6ad7e68105fd81a30424fe.jpg)
Ключевое свойство нового продукта с точки зрения разработчика – исключительно простой программный интерфейс и работа «из коробки», без необходимости какой-либо предварительной настройки. В этой статье покажем, как выглядит использование продукта.
Мы уже рассказывали про наше универсальное решение для ввода данных ABBYY FlexiCapture Engine – про сложности с настройкой под конкретные типы документов и то, как мы с этим боремся, реализуя технологию самообучения. Несмотря на значительный прогресс в этой области, начальная настройка решения со стороны разработчика всё равно требует некоторых действий. Работающее решение сейчас получить легко, но получение оптимального решения по-прежнему требует опыта, знаний и времени.
С другой стороны, существует множество типовых широко распространённых классов документов, для которых есть возможность выполнить всю настройку заранее и создать специализированное решение, оптимизированное на работу с узким классом документов и не требующее вообще никакой предварительной настройки разработчиком. Примером такого решения и является ABBYY PassportReader SDK.
Основные типы документов, с которыми работает PassportReader SDK, это: паспорт или удостоверение личности, водительское удостоверение и загранпаспорт. Для Российской Федерации дополнительно доступно свидетельство о рождении. Для стран СНГ некоторые документы пока отсутствуют.
Данные типы документов востребованы, и, вместе с тем, довольно сложны для обработки, так как часто имеют сложный фон в виде тонкого рисунка линий – гильош; надписи, контрастные только по цвету, но не по яркости; специальные шрифты. Кроме этого, многие из перечисленных типов документов существуют в виде нескольких вариантов (старого и нового образцов, биометрический и обычный загранпаспорт и т.п.). Все это сводится к тому, что самостоятельное получение качественного результата на подобных документах с использованием универсального инструмента типа FlexiCapture Engine является не совсем тривиальной задачей. И тут на сцену выходит PassportReader SDK.
Начинаем работать
Вся работа с продуктом в простейшем случае сводится к созданию объекта engine-а и вызову метода Recognize:
var engine = new ABBYY.PassportReaderSdk.RecognitionEngine();
try {
var result = engine.Recognize( fileName, "Passport_RU" );
...
} finally {
engine.Close();
}
NB. RecognitionEngine реализует интерфейс IDisposable и может использоваться стандартным образом в конструкциях, требующих этого интерфейса. Так, в примере выше, можно было бы вместо try...finally использовать блок using , что было бы полностью эквивалентно.
NB. Изображение можно прочитать из файла или отсканировать встроенными в PassportReader SDK средствами с использованием метода engine.Scan()
С извлечёнными полями можно работать непосредственно:
string lastName = result.FieldValue( "LastName", "" );
string firstName = result.FieldValue( "FirstName", "" );
string middleName = result.FieldValue( "MiddleName", "" );
string dateOfBirth = result.FieldValue( "DateOfBirth", "" );
string placeOfBirth = result.FieldValue( "PlaceOfBirth", "" );
NB. Схема данных для всех типов документов унифицирована – одинаковые по смыслу поля имеют одинаковые названия независимо от типа документа. То есть если нам нужны фамилия, имя, отчество, дата и место рождения, то код выше будет одинаково работать со всеми типами документов.
Либо получить результат в виде XML и сохранить в файл:
string xmlBody = result.GetXml( ... );
string xml = string.Format( "<?xml version='1.0' encoding='UTF-8'?>{0}", xmlBody );
System.IO.File.WriteAllText( fileName, xml, Encoding.UTF8 );
NB. Полученный XML-документ соответствует схеме XMLResult.xsd, которая ставится вместе с продуктом
Это, собственно, почти всё. Кроме описанной выше базовой функциональности для каждого поля можно получить прямоугольник найденного поля на изображении и уверенность распознавания отдельных символов.
Описанной функциональности достаточно для реализации примера см. скриншот ниже. Пример представляет собой готовое к использованию приложение, позволяющее загрузить или отсканировать изображение документа, распознать его, отредактировать и сохранить результат в XML или CSV, с возможностью при необходимости запустить внешнее приложении для дальнейшей обработки результата. Пример поставляется с исходным кодом и у разработчика есть возможность легко доработать его под свои нужды.
![](https://habrastorage.org/storage2/eca/c7e/6cf/ecac7e6cf585159b8a95db3113515860.png)
Даже без доработки в пример включены простейшие средства для интеграции с внешними системами:
![](https://habrastorage.org/storage2/64a/7e9/aab/64a7e9aab413f7eb022dcd9524ed272c.png)
На момент написания данной статьи в PassportReader SDK доступны документы для следующих стран:
![](https://habrastorage.org/storage2/886/03d/665/88603d665d54b73d22f9686c8c3b004d.png)
Технические детали
С точки зрения реализации PassportReader SDK представляет собой обёртку на .Net вокруг сильно урезанной версии FlexiCapture Engine (удалены ненужные словари, в несколько раз уменьшен размер дистрибутива). Обёртка выполняет всю настройку среды и подготовку изображений, и представляет пользователю предельно простой программный интерфейс.
Хотя родная среда для PassportReader SDK – это .Net, все интерфейсы объявлены с атрибутом ComVisible. Поэтому PassportReader SDK можно использовать напрямую из сред разработки, умеющих работать с COM. В продукт включены примеры использования на C++ и Delphi.
NB. При этом есть некоторые нюансы, вносимые идеологией .Net. Например, для того чтобы COM-объект создавался, соответствующая сборка должна быть зарегистрирована в GAC или лежать в той же директории, что и EXE-шник вызывающего приложения. То есть требования в точности те же, что и для сборок .Net.
Существует две версии PassportReader SDK: обычная и серверная. Обычная версия не поддерживает многопоточность и требует, чтобы вся работа с PR выполнялась из одного потока. Серверная версия поддерживает работу из нескольких потоков. При этом работа выполняется параллельно с использованием всех доступных ядер процессора.
PassportReader SDK – это обёртка вокруг FlexiCapture Engine. Поэтому всё, что может PassportReader SDK, реализуемо и с помощью FlexiCapture Engine. Тот факт, что FlexiCapture Engine может намного больше, даже и упоминать не буду — очевидно же.
Актуальную информацию о продукте можно найти на сайте ABBYY.
Алексей Калюжный,
департамент продуктов для разработчиков