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

Пример 4. Шаг 5.5 Описание поля Invoice Date, элементы grDate, InvoiceDate и InvoiceDateAsString

Анализ изображения показывает:

  • В некоторых документах поле Invoice Date располагается правее заголовка и на том же уровне, на других - под заголовком. Поэтому область поиска ограничим прямоугольниками справа и снизу заголовка.
  • Для поиска даты воспользуемся элементом типа Date. Дополнительно зададим проверку – если заголовок не найден, то значение искать не нужно.
  • На практике часто встречаются изображения, когда текст даты распознаётся не очень хорошо. Это может быть связано с различными дефектами сканирования или не предусмотренным форматом даты и т.д. Поэтому на тот случай, если поиск даты элементом типа Date не даст результатов, дополнительно опишем элемент типа Character String.

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

Чтобы создать элемент grDate:

  1. В составе элемента InvoiceHeader создайте элемент grDate (тип Group).
  2. Перейдите на вкладку Advanced и задайте дополнительные условия поиска: ограничить область поиска поля массивом прямоугольников: один справа от заголовка, другой - под заголовком с некоторым отступом. На языке описания FlexiLayout данное условие выглядит следующим образом:
    RectArray DataRegion;
    Let r1= Rect (kwInvoiceDate.Rect.Right, kwInvoiceDate.Rect.Top -20dt, kwInvoiceDate.Rect.Right + 650dt, kwInvoiceDate.Rect.Bottom + 50dt);
    Let r2 = Rect (kwInvoiceDate.Rect.Left - 150dt, kwInvoiceDate.Rect.Bottom, kwInvoiceDate.Rect.Right + 100dt, kwInvoiceDate.Rect.Bottom + 100dt);
    DataRegion = RectArray (r1);
    DataRegion.Add (r2);
    RestrictSearchArea (DataRegion);

Чтобы создать элемент InvoiceDate:

  1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDate (тип Date).
  2. Выберите вкладку Date.
  3. Для элемента InvoiceDate на вкладке Date следует указать все допустимые форматы записи даты:

    Показать пример

  1. На некоторых изображениях в область поиска поля InvoiceDate попадают уже найденные элементы kwInvoiceNumber и InvoiceNumber. Для того чтобы не рассматривать значение этих элементов в качестве гипотез поля InvoiceDate, исключим эти элементы из области поиска:
    • Нажмите кнопку Add... рядом с полем Exclude regions of elements,
    • В списке элементов выберите kwInvoiceNumber,
    • Нажмите кнопку Ok.
    • После этого в поле Exclude regions of elements вы увидите строчку SearchElements.InvoiceHeader.kwInvoiceNumber;

Повторите эти действия для элемента SearchElements.InvoiceHeader.InvoiceNumber.

  1. Выберите вкладку Advanced.
  2. Поле Invoice Date является необязательным элементом. Но в случае присутствия даты в документе (поле Invoice Date) всегда присутствует и заголовок даты, описанный нами ранее с помощью элемента kwInvoiceDate. Таким образом, в поле Advanced pre-search relations можно задать дополнительные условия поиска:Искать объект изображения, только если найден элемент kwInvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:
    If InvoiceHeader.kwInvoiceDate.IsNull
    Then DontFind();
  3. Протестируйте изображения (временно исключите элемент InvoiceFooter).

На случай изображений низкого качества, когда результаты распознавания не подходят ни под один из стандартных параметров для элемента Date, дополним гибкое описание альтернативным элементом, ищущим поле Invoice Date, с менее строгими условиями.

Для того чтобы создать элемент InvoiceDateAsString:

  1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDateAsString типа Character String.
  2. Выберите вкладку Character String.
  3. Задайте алфавит
    ,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
  4. Процент неалфавитных символов задайте равным 30%.
  5. В поле Character count задайте нечеткий интервал {-1, 8, 14, INF}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 8 до 14 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.
  6. В поле Max space length задайте значение 20, ограничивающее допустимый размер просвета в текстовой строке в 20 dot;
  7. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
  8. Выберите вкладку Advanced.
  9. Поскольку элемент InvoiceDateAsString мы хотим искать только в том случае, если элемент InvoiceDate не обнаружен на изображении, в поле Advanced pre-search relations задайте дополнительные условия поиска:Искать объект изображения, только если не найден элемент InvoiceDate . На языке описания FlexiLayout данное условие выглядит следующим образом:
    If Not InvoiceDate.IsNull Then DontFind;
  10. Зададим аналогичные InvoiceDate дополнительные условия поиска:Искать объект изображения, только если найден элемент kwInvoiceDate. Искать объект изображения, ближайший к элементу kwInvoiceDate . На языке описания FlexiLayout данное условие выглядит следующим образом:
    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;
  11. Задайте местоположение блока InvoiceDate в виде прямоугольника региона найденного элемента InvoiceDate или InvoiceDateAsString, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:
    Rect outputRect;
    if not InvoiceHeader.grDate.InvoiceDate.IsNull then
    outputRect = InvoiceHeader.grDate.InvoiceDate.Rect;
    else
    { outputRect = InvoiceHeader.grDate.InvoiceDateAsString.Rect;
    IsNull = InvoiceHeader.grDate.InvoiceDateAsString.IsNull;
    }
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);

01.12.2020 7:04:05


Please leave your feedback about this article