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

Пример 4. Шаг 5.4 Описание поля Invoice Number, элемент InvoiceNumber

Поле Invoice Number на некоторых документах располагается правее заголовка и на том же уровне, а на других - под заголовком (в первом и втором документах, значение поля указано непосредственно под заголовком).

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

  1. В составе элемента InvoiceHeader создайте элемент InvoiceNumber (тип Character String).
    Замечание. Совпадение имени элемента с именем блока, соответствующего полю InvoiceNumber, не обязательно, но удобно для дальнейшей работы с гибким описанием.
  2. Выберите вкладку Character String.
  3. Задайте алфавит
    -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
  4. Задайте значение параметра Percentage of non-alphabet characters равным 30%.
  5. В поле Character count задайте нечеткий интервал {-1, 3, 20, INF}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 3 до 20 символов. Любая гипотеза, входящая за рамки данного интервала, будет штрафоваться.
  6. На некоторых изображениях в область поиска поля InvoiceNumber попадает уже найденный элемент kwInvoiceDate. Для того чтобы не рассматривать значение этого элемента в качестве гипотезы поля InvoiceNumber, исключим этот элемент из области поиска:
    • На вкладке Search Constrainst нажмите кнопку Add... рядом с полем Exclude regions of elements,
    • В списке элементов выберите kwInvoiceDate,
    • Нажмите кнопку OK.
    • После этого в поле Exclude regions of elements вы увидите строчку
      SearchElements.InvoiceHeader.kwInvoiceDate;

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

  1. Перейдите на вкладку Advanced.
  2. В поле Advanced pre-search relations задайте дополнительные условия поиска: если заголовок kwInvoiceNumber не найден, то поле InvoiceNumber не искать, в противном случае задайте область поиска поля массивом прямоугольников: один справа от заголовка, другой - под заголовком с некоторым отступом. На языке описания FlexiLayout данное условие выглядит следующим образом:
    if kwInvoiceNumber.IsNull then Dontfind();
    else
    { WholeWordMOde: true;
    MaxGapInLine: 30dt;
    RectArray DataRegion;
    Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt, kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt);
    // ограничим область поиска прямоугольником справа от заголовка поля InvoiceNumber
    Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
    // ограничим область поиска прямоугольником снизу от заголовка поля InvoiceNumber
    DataRegion = RectArray (r1);
    DataRegion.Add (r2);
    RestrictSearchArea (DataRegion);
    }
  3. Область поиска значения поля обозначена двумя прямоугольниками – справа от заголовка и под ним. Причем, если значение поля располагается справа от его заголовка, то на большинстве тестовых изображений под заголовком присутствует какой-то текст (чаще всего заголовок и значение поля даты). Так как на большинстве изображений этот ненужный текст попадает в область поиска поля InvoiceNumber, программа создаст для него гипотезу. Чтобы повлиять на качество такой гипотезы, в поле Advanced post-search relations задайте дополнительные параметры проверки: чем значение поля ниже заголовка, тем сильнее штрафовать гипотезу. На языке описания FlexiLayout данное условие выглядит следующим образом:
    if not IsNull then
    { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
    }
    // Это означает, что чем дальше верхняя граница поля от верхней границы заголовка, тем сильнее будет оштрафована гипотеза. В данном случае наибольшее качество будет у гипотезы того элемента, верхняя граница которого совпадает с верхней границей заголовка.
  4. Протестируйте изображения (временно исключите элемент InvoiceFooter).
  5. Задайте местоположение блока InvoiceNumber в виде прямоугольника региона элемента InvoiceNumber, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:
    Rect outputRect;
    outputRect = InvoiceHeader.InvoiceNumber.Rect;
    IsNull = InvoiceHeader.InvoiceNumber.IsNull;
    // Считать регион блока найденным, если найден элемент InvoiceNumber
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);

10.11.2020 12:08:08


Please leave your feedback about this article