Smart Document Engine — это многоплатформенный автономный SDK для распознавания структурированных документов, стандартных бланков и форм, от счетов на оплату до актов, накладных и передаточных документов.
Поддерживается 70 типов документов.
Поддерживаются следующие операционные системы:
Жизненный цикл 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);
Параметры:
ПОДСКАЗКА
Отключите “ленивую” конфигурацию в следующих случаях:
• при работе с серверными приложениями, для которых время отклика первого распознавания приоритетней общего потребления памяти;
• для измерения максимального объема памяти, используемой приложением
Конфигурирование может занять значительное время, но его достаточно выполнить один раз за жизненный цикл.
Сконфигурированный экземпляр объекта 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 внутри сессии как исходное изображения:
// 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();
}
}
// C++
settings->SetOption("enablePDF", "true");
// Java
settings.SetOption("enablePDF", "true");
// C++
se::doc::DocResult& result = session->GetMutableCurrentResult();
// Java
import com.smartengines.doc.*
DocResult result = session.GetMutableCurrentResult();
// C++
bool pdf_is_available = result.CanBuildPDFABuffer();
// Java
Boolean pdf_is_available = result.CanBuildPDFABuffer();
// C++
result.SetAddTextMode("image_with_text");
// Java
result.SetAddTextMode("image_with_text");
// C++
result.SetAddTextMode("chars");
// Java
result.SetAddTextMode("chars");
// C++
result.BuildPDFABuffer();
// Java
result.BuildPDFABuffer();
// 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);
Состав базового пакета поставки Smart Document Engine:
Структура директорий:
Директория | Содержимое | Описание |
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:
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) значение, преобразите их в строку.
Параметр | Тип возвращаемого значения | Значение по умолчанию | Описание |
enableMultiThreading | «true» или «false» | «true» | Задает параллельное исполнение внутренних алгоритмов |
rgbPixelFormat | Строка символов R, G, B, и A | “RGB” для 3-канальных изображений, “BGRA” for 4-канальных изображений | Последовательность цветовых каналов в методе session.Process() |
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).
Поддерживаются форматы:
PDF мы не поддерживаем и рекомендуем растеризовать его (привести в поддерживаемый формат) на своей стороне перед распознаванием.
Замените библиотеки в папке /bin, связи (в папке /bindings) и бандл (файл*.se в папке /data-zip). Все это содержится в поставляемом SDK.
Наш SDK зависит от платформы. Свяжитесь с нами по почте sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK.
Не рекомендуется использовать SDK на несовместимых ОС. Свяжитесь с нами по почте sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK
Возможно, введена неверная подпись.
Пакет не содержит указанную маску документов или указанную маску, совпадающую с документами из нескольких внутренних движков в текущем режиме. Подробнее о бандле см. здесь.
Нельзя использовать бандл версии, отличной от версии библиотеки. Они должны быть из одного SDK.
Во многих интеграциях необходима дополнительная сборка обертки для работы с библиотекой на С++. Эта ошибка возникает, когда обертка не может найти по указанному пути основную библиотеку. Ее необходимо либо поместить в область видимости кода через переменные окружения, либо скомпилировать обертку с корректными путями к библиотеке.
Такого файла или каталога нет: модуль, который вы используете, создан для другой версии python, /samples/doc engine_sample_*/ содержит скрипт для сборки модуля на вашей стороне. Не забудьте, что у вас должны быть установлены пакеты разработки для вашего языка.
Заказать продукт
Для заказа решений, получения подробной информации или триал версий
заполните приведенную ниже форму, и мы обязательно с Вами свяжемся.