Специальная программа для малого и среднего бизнеса

Описание Smart Document Engine SDK

Описание Document Smart Engine

Smart Document Engine — это многоплатформенный автономный SDK для распознавания структурированных документов, стандартных бланков и форм, от счетов на оплату до актов, накладных и передаточных документов.

Поддерживается 70 типов документов.

Поддерживаемые операционные системы

Поддерживаются следующие операционные системы:

  • Windows;
  • Linux (включая РЕД ОС, OS ALT Linux, OS Astra Linux);
  • Mac OS;
  • ОС “Эльбрус”.
  • iOS;
  • Android;
  • OS Astra Linux;
  • ОС Аврора.

Жизненный цикл

Жизненный цикл DocEngine состоит из следующих этапов:

  1. создание экземпляра DocEngine, см. Создание экземпляра DocEngine;
  2. настройка сессии распознавания:
  1. создание объекта обработки настроек сессии, см. Создание объекта обработки настроек сессии;
  2. создание объекта Image (изображения документа), см. Создание объекта изображения документа;
  3. обработка  изображения, см. Обработка изображения документа;
  4. парсинг результатов распознавания, см. Парсинг результатов распознавания.

Создание экземпляра DocEngine 

Создайте экземпляр DocEngine:

// C++
std::unique_ptr<se::doc::DocEngine> engine(se::doc::DocEngine::Create(
    configuration_bundle_path));

// Java
import com.smartengines.doc.*
DocEngine engine = DocEngine.Create(configuration_bundle_path);

Параметры:

  • configuration_bundle_path — путь к конфигурационному бандлу-файлу, в котором прописаны настройки DocEngine (файл с расширением .se);
  • булевое значение, активация “ленивой” конфигурации (true по умолчанию). Необязательный параметр. 
    • если активирована “ленивая” конфигурация, некоторые внутренние структуры будут инициализироваться только по мере необходимости;
    • если “ленивая” конфигурация отключена, все внутренние структуры  и компоненты будут инициализироваться с помощью метода  Create().

ПОДСКАЗКА

Отключите “ленивую” конфигурацию в следующих случаях:
• при работе с серверными приложениями, для которых время отклика первого распознавания приоритетней общего потребления памяти;
• для измерения максимального объема памяти, используемой приложением

Конфигурирование может занять значительное время, но его достаточно выполнить один раз за жизненный цикл. 

Сконфигурированный экземпляр объекта DocEngine используется для инициализации сессии распознавания – создания экземпляров объекта DocSession, содержащего методы распознавания.

ВНИМАНИЕ!

DocEngine::Create() является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Конфигурационные бандлы подробно описаны в разделе  Конфигурационные бандл файлы

Настройка сессии распознавания

Создание объекта настроек сессии

Создайте объект DocSessionSettings на основе сконфигурированного экземпляра DocEngine:

// C++
std::unique_ptr<se::doc::DocSessionSettings> settings(
      engine->CreateSessionSettings());

// Java
import com.smartengines.doc.*
DocSessionSettings settings = engine.CreateSessionSettings();

ВНИМАНИЕ!

DocEngine::CreateSessionSettings()является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Настройка типов распознаваемых документов

Настройте типы распознаваемых документов в соответствии с примером:

// C++
settings->AddEnabledDocumentTypes("rus.2ndfl.*"); // Задает распознавание 2-НДФЛ 

// Java
settings.AddEnabledDocumentTypes("rus.2ndfl.*"); // Задает распознавание 2-НДФЛ

Инициализация сессии

При поставке продукта Smart Document Engine клиенту передается персональная подпись. Она содержится в файле README.html в директории /doc

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

Это подтверждает право вызывающего на использование библиотеки и разблокирует ее.

Проверка подписи осуществляется в оффлайн режиме. Библиотека не обращается ни к каким внешним ресурсам.

Инициализируйте сессию (объект DocSession):

// C++
const char* signature = "... YOUR SIGNATURE HERE ..." //Подпись, используемая для запуска Smart Document Engine;
std::unique_ptr<se::doc::DocSession> session(
   engine->SpawnSession(*settings, signature));

// Java
import com.smartengines.doc.*
String signature = "... YOUR SIGNATURE HERE ..." //Подпись, используемая для запуска Smart Document Engine;

DocSession session = engine.SpawnSession(settings, signature);

Создание объекта настроек обработки изображения

Создайте объект настроек обработки изображения:

// C++
std::unique_ptr<se::doc::DocProcessingSettings> proc_settings(
    session->CreateProcessingSettings());

// Java
import com.smartengines.doc.*
DocProcessingSettings proc_settings = session.CreateProcessingSettings();

Создание объекта изображения документа

Создайте объект изображения (Image) для последующей обработки: 

// C++
std::unique_ptr<se::common::Image> image(
    se::common::Image::FromFile(image_path)); // Загрузка из файла

// Java
import com.smartengines.doc.*
Image image = Image.FromFile(image_path); // Загрузка из файла

ВНИМАНИЕ!

Image::FromFile() является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Регистрирование объекта Image внутри сессии

Зарегистрируйте объект Image внутри сессии как исходное изображения:

// C++
int image_id = session->RegisterImage(*image);
proc_settings->SetCurrentSourceID(image_id);

// Java
int image_id = session.RegisterImage(image);
proc_settings.Process(proc_settings);

Обработка изображения документа

Вызовите метод Process(…) для обработки изображения документа: 

// C++
session->Process(*proc_settings);

// Java
session.Process(proc_settings);

Парсинг результата распознавания

Получение текущего результата из сессии

Получите текущий результат из сессии:

// C++
const se::doc::DocResult& result = session->GetCurrentResult();

// Java
import com.smartengines.doc.*
DocResult result = session.GetCurrentResult();

Получение результата распознавания 

Используйте объект класса DocResult для получения результатов распознавания:

// C++
// Прохождение по циклу найденных документов
for (auto doc_it = result.DocumentsBegin();
     doc_it != result.DocumentsEnd();
     ++doc_it) {
    const se::doc::Document& doc = doc_it.GetDocument();
   
    // Прохождение по циклу текстовых полей 
    for (auto it = doc.TextFieldsBegin();
         it != doc.TextFieldsEnd();
         ++it) {
        // Получение значений текстовых полей (в виде строки в кодировке UTF-8)
        std::string field_value = it.GetField().GetOcrString().GetFirstString().GetCStr();
    }
}

// Java
import com.smartengines.doc.*
// Прохождение по циклу найденных документов
for (DocumentsIterator doc_it = result.DocumentsBegin();
     !doc_it.Equals(result.DocumentsEnd());
     doc_it.Advance()) {
    Document doc = doc_it.GetDocument();
    // Прохождение по циклу текстовых полей
    for (DocTextFieldsIterator it = doc.TextFieldsBegin();
         !it.Equals(doc.TextFieldsEnd());
         it.Advance()) {
        // Получение значений текстовых полей (в виде строки в кодировке UTF-8)
        String field_value = it.GetField().GetOcrString().GetFirstString().GetCStr();
    }
}

Экспорт результатов распознавания в PDF

  1. До инициации сессии SpawnSession, активируйте функцию создания файла .pdf с помощью опции enablePDF  сессии DocSessionSettings:

// C++
settings->SetOption("enablePDF", "true");

// Java
settings.SetOption("enablePDF", "true");

  1. Получите изменяемый текущий результат:

 // C++
se::doc::DocResult& result = session->GetMutableCurrentResult();

// Java
import com.smartengines.doc.*
DocResult result = session.GetMutableCurrentResult();

  1. Проверьте возможность создания буфера для передачи результатов распознавания в формате PDF/A:

// C++
bool pdf_is_available = result.CanBuildPDFABuffer();

// Java
Boolean pdf_is_available = result.CanBuildPDFABuffer();

  1. Если необходимо, задайте возможность добавления текста (значение по умолчанию — «image_only»)

// C++
result.SetAddTextMode("image_with_text");

// Java

result.SetAddTextMode("image_with_text");

  1. Измените режим добавления текста, если вам нужно точное геометрическое соответствие символов (значение по умолчанию — “words”). Использование этой опции увеличит размер полученного файла.

// C++
result.SetAddTextMode("chars");

// Java
result.SetAddTextMode("chars");

  1. Создайте буфер для передачи результатов распознавания в формате PDF/A:

// C++
result.BuildPDFABuffer();

// Java
result.BuildPDFABuffer();

  1. Получите размер созданного буфера PDF/A и скопируйте его в буфер PDF/B:

// C++
const size_t pdf_size = result.GetPDFABufferSize();
unsigned char* pdfb = new unsigned char[pdf_size];
result.GetPDFABuffer(pdfb, pdf_size);

// Java
int pdf_size = result.GetPDFABufferSize();
byte[] pdfb = new byte[pdf_size];
result.GetPDFABuffer(pdfb);

Описание SDK

Структура пакета поставки

Состав базового пакета поставки Smart Document Engine: 

  • обертка для C#/Java/Python/PHP;
  • исходный код обертки obj-C или/и React/Flutter для мобильных платформ;
  • автогенераторы для сборки оберток для продуктовой среды клиента (точная версия клиента на Python 3 или PHP. Рекомендуется использовать при возникновении проблем);
  • документация;
  • примеры.

Структура директорий:

Директория Содержимое Описание
secommon Файлы пространств имен
C++ se::common
Общие, например, Point, OcrString, Image, и т.д.
см. Общие классы
Файлы интеграции: например, модуль
Java com.smartengines.common (скомпилирован в один файл)
docengine пространства имен C++ se::doc  Основные классы Smart Document Engine.
См. Основные классы
Файлы интеграции: например, модуль
Java com.smartengines.doc 
(скомпилирован в один файл)
doc Документация См. Документация

samples

Полностью скомпилированный и готовый к использованию тестовый пример кода  
data-zip Конфигурационные бандл файлы в формате:
bundle_something.se 
Конфигурационные бандл файлы
См. Конфигурационные бандл файлы

Общие классы

Общие классы, например, Point, OcrString, Image и т.д., находятся в пространстве имен se::common в директории secommon:

Это следующие заголовочные файлы C++:

Заголовочный файл (Header) Описание
#include <secommon/se_export_defs.h>   Содержит определения экспорта в библиотеках Smart Engines
#include <secommon/se_exceptions_defs.h>   Содержит определения исключений в библиотеках Smart Engines
#include <secommon/se_geometry.h>   Содержит классы и процедуры, описывающие геометрию (Point, Rectangle, и т.п..)
#include <secommon/se_image.h>   Содержит классы и процедуры обработки изображений  
#include <secommon/se_string.h>   Содержит классы строк (MutableString, OcrString, и т.д..)
#include <secommon/se_string _iterator.h>   Содержит определение итераторов, ориентированных на строку
#include <secommon/se_serialization.h>   Содержит вспомогательные классы, связанные с сериализацией объектов (не используется в Smart Document Engine)
#include <secommon/se_common.h>   Вспомогательный заголовок, который включает в себя все вышеперечисленное.

Аналогичные Java API содержатся в модуле com.smartengines.common:

// Java
import com.smartengines.common.*; // Импорт всех классов se::common classes

Основные классы

Основные классы Smart Document Engine содержатся в пространстве имен  se::doc в директории docengine:

Заголовочный файл (Header)

Описание

#include <docengine/doc_document_info.h>

Предоставляет информацию о типе документа  (текстовое описание документа)

#include <docengine/doc_engine.h>  

Содержит определение класса docengine 

#include <docengine/doc_session_settings.h> 

Содержит определение класса DocSessionSettings

#include <docengine/doc_session.h>  

Содержит определение класса DocSession 

#include <docengine/doc_video_session.h>

Содержит определение класса DocVideoSession

#include <docengine/doc_processing_settings.h>

Содержит определение класса DocProcessingSettings

#include <docengine/doc_result.h>  

Содержит определения классов DocResult, DocTemplateDetectionResult и DocTemplateSegmentationResult

#include <docengine/doc_document.h>

Содержит определение класса Document 

#include <docengine/doc_documents_iterator.h>

Содержит итераторы документов

#include <docengine/doc_fields.h>  

Содержит определения классов, описывающих поля Smart Document Engine

#include <docengine/doc_fields_iterator.h> 

Содержит итераторы полей

#include <docengine/doc_feedback.h>  

Содержит интерфейс обратной связи DocFeedback и связанные с ним контейнеры

#include <docengine/doc_external_processor.h>

Содержит интерфейс обработки внешнего документа

#include <docengine/doc_graphical_structure.h>

Содержит определение класса DocGraphicalStructure 

#include <docengine/doc_tags_collection.h>

Содержит определение класса DocTagsCollection class 

#include <docengine/doc_view.h>

Содержит определение класса DocView 

#include <docengine/doc_views_iterator.h>

Содержит итераторы образов документов (DocView)

#include <docengine/doc_views_collection.h>

Содержит определение класса DocViewsCollection

#include <docengine/doc_basic_object.h>

Содержит определение класса DocBasicObject

#include <docengine/doc_basic_objects_iterator.h>

Содержит итераторы основных объектов документов (DocBasicObject)

#include <docengine/doc_objects.h>

Содержит определения классов графических объектов

#include <docengine/doc_objects_collection.h>

Содержит определение класса массива документов (DocObjectsCollection)

#include <docengine/doc_objects_collection_iterator.h>

Содержит итераторы массива объектов документов (DocObjectsCollection)

#include <docengine/doc_forward_declarations.h>  

Сервисный заголовочный файл. Содержит объявления классов 

Аналогичные классы Java API содержатся в модуле com.smartengines.doc::

// Java
import com.smartengines.doc.*; // Импорт всех классов se::doc

Документация

Все классы, методы, их параметры и значения параметров описаны в комментариях к коду, а также в справочном руководстве docengine.pdf, содержащемся в директории с документацией. 

Вся документация содержится в папке doc. Структура папки doc:

  • DOCUMENTS_REFERENCE.html — содержит список стран, документы которых поддерживаются Smart Document Engine, список поддерживаемых документов и их описание;
  • README.html — краткое описание SDK Smart Document Engine;
  • docengine.pdf — описание классов, методов и т.д.;
  • NOTICE.txt — содержит информацию об используемом стороннем программном обеспечении;
  • WHATSNEW.txt — содержит описание обновлений;
  • WHATSNEW_FORENSICS.txt — содержит описание обновлений функций проверки подлинности. 

Обработка исключений

C++ API может выдавать исключения подклассов se::common::BaseException при неверном вводе данных, некорректных вызовах и других ошибках. Поддерживаются следующие подклассы исключений:

Исключение Описание
FileSystemException Выдается при попытке чтения из несуществующего файла или другой ошибке ввода-вывода, связанной с файловой системой
InternalException Выдается, если возникает неизвестная ошибка или ошибка возникает во внутренних компонентах системы.
InvalidArgumentException Выдается, если метод вызывается с недопустимыми входными параметрами
InvalidKeyException Выдается при попытке  доступа к ассоциативному контейнеру о с недействительным или несуществующим ключом или доступа к списку с недопустимым индексом или индексом, выходящим за пределы допустимого диапазона
InvalidStateException Выдается, если в системе возникает ошибка из-за неправильного внутреннего состояния системных объектов
MemoryException Выдается при попытке выделения объектов при недостаточном объеме оперативной памяти.
NotSupportedException Выдается при попытке доступа к методу, который с учетом текущего состояния или переданных аргументов не поддерживается в текущей версии библиотеки или не поддерживается вообще
Uninitialized Object Exception Выдается при попытке доступа к несуществующему или неинициализированному объекту 

При возникновении исключений, выводятся сообщения, понятные пользователю, с помощью метода e.what()

Примечание

 se::common::BaseException не является подклассом std::exception.

Интерфейс Smart Document Engine не имеет зависимостей от STL

Оберткой для исключений Java API является общий класс java.lang.Exception. Тип исключения включен в текст сообщения.

При возникновении проблем, свяжитесь с нашей техподдержкой: sales@smartengines.ru or support@smartengines.ru.

Фабричные методы и управление памятью

Некоторые классы Smart Document Engine содержат фабричные методы, возвращающие указатели на объекты, выделенные в куче.  Необходимо удалять такие объекты

ПОДСКАЗКА

В C++:
Для простоты управления памятью и предотвращения ее утечек пользуйтесь умными указателями std::unique_ptr<T> или std::shared_ptr<T> .

В Java API:
Удаляйте ненужные объекты с помощью метода .delete()

Конфигурационные бандл файлы

В каждую поставку включен один или несколько бандлов – архивов, содержащих необходимые настройки для создания объектов и конфигурирования Smart Document Engine. Обычно они имеют имя bundle_something.se и находятся внутри папки data-zip.

Поддерживаемые типы документов

Тип документа представляет из себя строку (string), описывающую тип физического документа, который необходимо распознать.

Для получения типов документов, которые Smart Document Engine SDK может распознать, выполните процедуру:

// C++
// Прохождение по циклу найденных внутренних движков
for (int i_engine = 0;
     i_engine < settings->GetInternalEnginesCount();
     ++i_engine) {
    // Прохождение по циклу типов документов, поддерживаемых данным внутренним движком
    for (int i_doc = 0;
         i_doc < settings->GetSupportedDocumentTypesCount(i_engine);
         ++i_doc) {
        // Получение имени типа поддерживаемого документа 
        std::string doctype = settings->GetSupportedDocumentType(i_engine, i_doc);
    }
}

// Java
// Прохождение по циклу внутренних движков
for (int i_engine = 0;
     i_engine < settings.GetInternalEnginesCount();
     i_engine++) {
    // Прохождение по циклу типов документов, поддерживаемых данным внутренним движком 
    for (int i_doc = 0;
         i_doc < settings.GetSupportedDocumentTypesCount(i_engine);
         i_doc++) {
        // Получение имени типа поддерживаемого документа 
        String doctype = settings.GetSupportedDocumentType(i_engine, i_doc);
    }
}

ВНИМАНИЕ!

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

Использование масок

Поскольку по умолчанию все типы документов исключены из процесса распознавания, вам следует включить те, которые необходимо распознавать. Для этого воспользуйтесь методом AddEnabledDocumentTypes(…) объекта DocSessionSettings:

// C++
settings->AddEnabledDocumentTypes("rus.2ndfl.type1"); // Включение НДФЛ в процесс распознавания

// Java
settings.AddEnabledDocumentTypes("rus.2ndfl.type1"); // Включение НДФЛ в процесс распознавания

Для исключения типов документов из процесса распознавания воспользуйтесь методом RemoveEnabledDocumentTypes(…).

При указании типов документов можно пользоваться масками (задаются с помощью звездочек). Каждый тип документа, передающийся системе, сопоставляется со всеми поддерживаемыми типами. Если тот или иной тип поддерживается, то он добавляется в список распознаваемых. 

// C++
settings->AddEnabledDocumentTypes("rus.2ndfl.*"); // Включение в процесс распознавания 2-НДФЛ

// Java
settings.AddEnabledDocumentTypes("rus.2ndfl.*"); // Включение в процесс распознавания 2-НДФЛ

ВНИМАНИЕ!

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

ПОДСКАЗКА

Чтобы сократить время обработки, укажите минимальное количество распознаваемых типов документов 

Параметры сессии распознавания

Для переопределения параметров конфигурации используйте методы класса DocSessionSettings

Для получения имен параметров и их значений, выполните следующую процедуру:

// C++
for (auto it = settings->OptionsBegin();
     it != settings->OptionsEnd();
     ++it) {
    // it.GetKey() возвращает имя параметра
    // it.GetValue() возвращает значение параметра
}

// Java
for (StringsMapIterator it = settings.OptionsBegin();
     !it.Equals(settings.OptionsEnd());
     it.Advance()) {
    // it.GetKey() возвращает имя параметра
    // it.GetValue() возвращает значение параметра
}

Для изменения значений параметров, воспользуйтесь методом SetOption(…):

// C++
settings->SetOption("enableMultiThreading", "true");

// Java
settings.SetOption("enableMultiThreading", "true");

Значения параметров всегда представлены строкой (string). При необходимости передать целочисленное (integer) или булевое (bool) значение, преобразите их в строку.

Параметры common

Параметр Тип возвращаемого значения Значение по умолчанию Описание
enableMultiThreading «true» или «false» «true» Задает параллельное исполнение внутренних алгоритмов 
rgbPixelFormat Строка символов  R, G, B, и A “RGB” для 3-канальных изображений, “BGRA” for 4-канальных изображений Последовательность цветовых каналов в методе session.Process() 

Особенности Java API

Smart Document Engine SDK включает в себя Java API, автоматически генерируемый из интерфейса C++ с помощью инструмента SWIG.

Интерфейс Java почти идентичен C++.

Освобождение объекта

Несмотря на то, что сборка мусора присутствует и работает, рекомендуется вызывать метод obj.delete() для наших объектов API вручную, поскольку они являются обертками памяти, выделенной в куче. Размер их кучи неизвестен сборщику мусора, что может привести к задержке удаления объектов и, следовательно, высокому общему потреблению памяти.

DocEngine engine = DocEngine.Create(config_path); // or any other object
// ...
engine.delete(); // forces and immediately guarantees wrapped C++ object deallocation

Часто задаваемые вопросы

  • Как протестировать систему?

    Можно скачать демо-версию в RuStore

  • Какой пример использовать?

    Пользуйтесь примером из папки docengine_sample

  • Как установить и протестировать вашу библиотеку?

    Мы предлагаем библиотеку в виде классического SDK и примеры интеграции. Установите один из наших примеров (они находятся в папке /samples).

  • Какие форматы файлов поддерживаются?

    Поддерживаются форматы:

    • jpeg, tiff (кроме TIFF_ZIP и TIFF_JPEG), png, bmp;
    • base64 (форматы из пункта выше);
    • файловый буфер с предварительным указанием цветовой схемы, ширины\высоты\страйда\количества каналов.
  • Что делать, если необходимо распознать изображение в формате PDF?

    PDF мы не поддерживаем и рекомендуем растеризовать его (привести в поддерживаемый формат) на своей стороне перед распознаванием.

  • Как обновить систему до новой версии?

    Замените библиотеки в папке /bin, связи (в папке /bindings) и бандл (файл*.se в папке /data-zip). Все это содержится в поставляемом SDK.

  • У меня есть версия SDK для Windows, но предстоит работать на ОС семейства Linux. Как запустить docker контейнер для Linux?

    Наш SDK зависит от платформы. Свяжитесь с нами по почте  sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK.

  • У меня есть версия SDK для Centos 7. При попытке запустить ее Ubuntu/Debian/Alpine, появляется много ошибок «undefined symbol».

    Не рекомендуется использовать SDK на несовместимых ОС. Свяжитесь с нами по почте sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK

Распространенные ошибки

  1. Failed to verify static auth (Не удалось проверить подпись).

    Возможно, введена неверная подпись.

  2. Found no single engine that supports settings-enabled document types (Не найден движок, который бы поддерживал все типы документов, заданные в настройках).

    Пакет не содержит указанную маску документов или указанную маску, совпадающую с документами из нескольких внутренних движков в текущем режиме. Подробнее о бандле см. здесь.

  3. Failed to initialize DocEngine: mismatching engine version in config: (Не удалось инициализировать DocEngine: несоответствующая версия движка в конфигурации).

    Нельзя использовать бандл версии, отличной от версии библиотеки. Они должны быть из одного SDK.

  4. libdocengine.so:cannot open shared object file:no such file or directory (не удается открыть файл общего объекта: нет такого файла или каталога).

    Во многих интеграциях необходима дополнительная сборка обертки для работы с библиотекой на С++. Эта ошибка возникает, когда обертка не может найти по указанному пути основную библиотеку. Ее необходимо либо поместить в область видимости кода через переменные окружения, либо скомпилировать обертку с корректными путями к библиотеке. 

  5. for PYTHON and PHPlibpython3.x.x:cannot open shared object file: No such file or directory (не удается открыть файл общего объекта: нет такого файла или каталога для PYTHON и PHPlibpython3.x.x)

    Такого файла или каталога нет: модуль, который вы используете, создан для другой версии python, /samples/doc engine_sample_*/ содержит скрипт для сборки модуля на вашей стороне. Не забудьте, что у вас должны быть установлены пакеты разработки для вашего языка.

  6. Smart Document Engine: лучшие практики

    1. Частым случаем интерфейса экрана распознавания является рисунок документа, наложенный на превью камеры. Это помогает пользователю совместить документ с камерой. Мы не рекомендуем делать обрезку изображения по вашему рисунку, поскольку алгоритм поиска этого типа документов работает очень быстро и объект может быть распознан раньше, чем пользователь поместит его в необходимую зону.
    2. В мобильных SDK мы рекомендуем размещать кнопку «Сканировать» на экране с превью камеры. Это позволит пользователю лучше выровнять документ, дождаться фокусировки и инициализации движка прежде, чем начать распознавание. Этот трюк позволяет ускорить процесс захвата, так как движок будет обрабатывать меньше пустых начальных кадров.
    3. Судить о качестве распознавания мы рекомендуем по атрибуту полей isAccepted. Если необходимо более точное понимание качества результата распознавания, вы можете ориентироваться на атрибут Confidence, также доступный для каждого текстового поля.
    4. В мобильных SDK инициализируйте движок распознавания асинхронно перед тем, как сделать доступной кнопку сканирования документов. Пользователю не придется ждать инициализации движка, когда придет время сканировать документ.
    5. Не храните свою персонализированную подпись в читаемом виде (т.е. в ресурсах), всегда храните ее либо закодированной в бинарном файле приложения, либо подгружайте удаленно.
    6. Бандл находится отдельно от библиотеки, поэтому для минимизации размера приложения его можно при необходимости загружать со своих серверов по требованию.
    7. На мобильных платформах инициализация библиотеки ( вызов метода Create() ) должна осуществляться строго в одном экземпляре. Этот процесс является самой тяжелой операцией (как и сам анализ изображений), поэтому он всегда должен осуществляться на мобильных платформах вне UI потока. На базе одного экземпляра может быть порождено множество сеансов распознавания. Сессии можно запускать параллельно и они не будут влиять друг на друга.
    8. Все возможности нашего SDK описаны в документе docengine.pdf — справочном руководстве по интерфейсу основной библиотеки C++.
    9. На мобильных платформах желательно включать ленивую инициализацию. В серверных вариантах, где инициализация библиотеки происходит один раз при старте приложения, мы рекомендуем значение false.
    10. Если вы загружаете изображения из файла, убедитесь, что загруженные файлы размещены на высокопроизводительном дисковом устройстве. На некоторых машинах время загрузки изображения из файла может быть больше, чем время самого распознавания.
    11. Избегайте предварительной обработки входных изображений. Наши продукты лучше всего работают с изображениями, полученными непосредственно с устройства захвата (камеры или сканера).
    12. Избегайте излишне огромных изображений. Иногда большое разрешение изображения не дает прироста в качестве, а только влияет на увеличение времени распознавания.
    13. Всегда лучше указывать минимальный набор документов, который вы собираетесь распознавать. Библиотека будет тратить меньше времени на поиск.

Заказать продукт

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

    Array ( )