Russian (Русский) - Change language

Пример автоматической обработки

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

Проект и материалы для скачивания: Unattended.zip

Алгоритм примера

  • Подключение к сервису
  • Создание сессии
  • Открытие проекта
  • Создание нового пакета
  • Добавление изображений в пакет
  • Запуск обработки пакета
  • Перебор результатов и вывод извлеченных данных
  • Завершение работы

Запуск примера

  • Загрузите проект UnattendedExample.fcproj на сервер
  • Запустите UnattendedExample.sln в Visual Studio 2013 или более поздней версии.

Подключение к сервису

// Создание экземпляра клиента веб-сервиса
var service = new FlexiCapture.FlexiCaptureWebServiceSoapClient();
    
// ======= BASIC AUTHENTICATION =======
// service.ClientCredentials.UserName.UserName = "username";
// service.ClientCredentials.UserName.Password = "password";
    

Открытие сессии

// Для обеспечения приватности создаваемых пакетов, нужно указать текущего пользователя
// Сначала получаем имя пользователя, видимое системой
var username = service.GetCurrentUserIdentity();
// Затем ищем себя среди пользователей FlexiCapture
var userId = service.FindUser(username.Name);
if (userId <= 0) throw new Exception("Текущий пользователь не найден");
// Открываем новую сессию обработки
const int roleType = 12; //Роль оператора пользовательской станции
const int stationType = 10; //Пользовательская станция
var sessionId = service.OpenSession(roleType, stationType);
if (sessionId <= 0) throw new Exception("Не удалось открыть сессию");
    

Открытие проекта

// Получаем список проектов
var projects = service.GetProjects();
var projectGuid = "";
if (projects != null && projects.Count > 0)
{
   foreach (var project in projects)
   {
      if (project.Name != "UnattendedExample") continue;
      projectGuid = project.Guid;
       break;
   }
}
if (string.IsNullOrEmpty(projectGuid))
{
   throw new Exception("Проект UnattendedExample не найден. Загрузите его на сервер перед использованием примера");
}
// Открываем первый проект с именем UnattendedExample в списке
var projectId = service.OpenProject(sessionId, projectGuid);
if (projectId <= 0) throw new Exception("Не удалось открыть проект");
    

Создание нового пакета

// Указываем имя нового пакета, все остальные свойства оставляем по-умолчанию
var batch = new FlexiCapture.Batch { Name = "Sample API Batch" };
var batchId = service.AddNewBatch(sessionId, projectId, batch, userId);
if (batchId <= 0) throw new Exception("Не удалось создать пакет");
    

Добавление изображения в пакет

// Открываем пакет перед добавлением изображений
service.OpenBatch(sessionId, batchId);
    

Пересылка файлов , не превышающих 256 КБ

service.AddNewImage(sessionId, batchId, new FlexiCapture.File()
{
   Bytes = File.ReadAllBytes(filename),
   Name = filename
});
    

Пересылка больших файлов

Если файл превышает 256 КБ, то его пересылка целиком в base64 имеет ряд недостатков:

  • Увеличение нагрузки на сеть на 33%
  • Возможность блокировки слишком тяжёлого запроса IIS-ом или межсетевым экраном
  • Необходимость пересылать весь файл заново в случае разрыва соединения или ошибок в сети

Способ пересылки через API файлового сервиса - гораздо более эффективный метод.

var doc = new FlexiCapture.Document { BatchId = batchId };
var file = new FlexiCapture.File { Name = filename };
var documentId = service.AddNewDocument(sessionId, doc, file, false, 0);
UploadFile(service, sessionId, projectId, batchId, documentId, filename).Wait();
    

Загрузка файла на сервер

Отправка запроса на сервер с телом файла

Отправка запроса на сервер без тела файла

Запуск и завершение обработки пакета

// Запускаем обработку пакета
service.ProcessBatch(sessionId, batchId);
Console.WriteLine("recognition task created, waiting ");
// Ожидаем завершение обработки
var percentCompleted = 0;
while (percentCompleted < 100)
{
   Console.CursorLeft = 0;
   Console.Write(percentCompleted + "%");
   percentCompleted = service.GetBatchPercentCompleted(batchId);
   System.Threading.Thread.Sleep(500);
}
Console.CursorLeft = 0;
Console.WriteLine("complete...");
    

Получение результатов и вывод извлеченных данных

Из каждого документа выводится только три поля:

  • Обращение (Addressing)
  • Имя (First Name)
  • Фамилия (Last Name)
// Получаем результаты
var documents = service.GetDocuments(sessionId, batchId);
if (documents == null) return;
// XML имена, потребуются для разбора XML результатов
var docs = XName.Get("Documents", "http://www.abbyy.com/FlexiCapture/Schemas/Export/FormData.xsd");
var banking = XName.Get("_Banking_eng", "http://www.abbyy.com/FlexiCapture/Schemas/Export/Banking_eng.xsd");
// Перебираем все результаты и выводим их на экран
foreach (var document in documents)
{
   if (document.Id == 0) continue;
   // Получаем XML файл с результатами распознавания
   var attachedFile = service.LoadDocumentResult(sessionId, batchId, document.Id, "Result.xml");
   if (attachedFile.Bytes == null) continue;
   // Открываем результат в виде XML
   var xml = XDocument.Load(new MemoryStream(attachedFile.Bytes));
   var docsElement = xml.Element(docs); // Контейнер распознанных данных
   if (docsElement == null) continue;
   var result = docsElement.Element(banking);
    if (result == null) continue;
   // Получаем требуемые данные
   var addressing = result.Element("_Addressing");
   var surname = result.Element("_Last_Name");
   var name = result.Element("_First_Name");
   // Выводим данные на экран
   Console.WriteLine("- " +
      (addressing == null ? "" : addressing.Value) + " " +
      (name == null ? "" : name.Value) + " " +
      (surname == null ? "" : surname.Value)
   );
}
    

Завершение работы

service.DeleteBatch(sessionId, batchId);
service.CloseProject(sessionId, projectId);
service.CloseSession(sessionId);
    
  

01.12.2020 7:04:04


Please leave your feedback about this article