Когда я только-только устраивался на работу в ABBYY техническим писателем, я слабо представлял масштабы системы, которую придется описывать. Шутка ли – под общим названием ABBYY FlexiCapture скрывалось четыре разных продукта (ABBYY FlexiCapture, Станция сканирования, ABBYY FlexiLayout Studio, ABBYY FormDesigner), один из которых имел на тот момент пять разных вариантов установки и использования. И надо такому случиться, что на первом же шаге я столкнулся с приложением, которое даже в масштабах всей системы стоит особняком. Точнее, не так – все компоненты особые, каждый по-своему, в каждом из них своя красота. ABBYY FlexiLayout Studio, о которой пойдет речь в этой статье, выделяется тем, что это наиболее сложный для пользователя продукт. В принципе, даже слово «пользователь» здесь не совсем уместно – фактически человек, который работает с ABBYY FlexiLayout Studio, ближе к программисту.
ABBYY FlexiLayout Studio предназначена для разработки гибких описаний. Что такое гибкое описание и чем оно отличается от жесткого? Жесткое описание – это стандартная форма. Все экземпляры таких документов до заполнения одинаковы, как говорится, «на просвет» – если наложить их друг на друга, то одинаковые поля окажутся в одном и том же месте. Достаточно определить координаты этих мест – и при обработке значения полей будут распознаны. Все легко и ясно.
Но далеко не всегда ситуация так проста. Многие документы, из которых требуется извлекать данные, не являются жесткими формами. Например, чеки банкоматов разных банков содержат, в общем-то, однотипную информацию. Но различаются они не только ее расположением, а даже зачастую размерами. Для таких документов создать жесткий шаблон, конечно же, нельзя. А что можно?
А можно с помощью ABBYY FlexiLayout Studio 10 создать описание гибкое. Гибкое описание позволяет оперировать не координатами полей, из которых необходимо извлекать информацию, а их расположением относительно опорных элементов и друг друга, а также типом распознаваемых данных и возможной их структурой. Для примера возьмем два отсканированных чека от банкомата:
Очевидно, что на просвет чеки не одинаковые. С другой стороны, некоторые элементы у них общие: сверху название банка, под ним дата и время совершения операции, внизу снятая сумма и остаток (называются, впрочем, по-разному), а также техническая информация. Предположим, что мы хотим автоматизировать ввод информации с чеков в некую программу. Нас интересуют дата и время снятия денег, сумма и остаток средств. Для простоты примем, что обрабатываться будут два вида чеков, Райффайзен-банка и Сбербанка).
Для начала мы должны найти опорный элемент. В нашем случае это название банка: Raiffeisen BANK или ОАО «СБЕРБАНК РОССИИ». Для этого создаем элемент Header – заголовок, а в нем подэлемент BankName типа Static Text – и указываем, что этот элемент должен содержать либо то, либо другое название банка. Этот элемент должен быть обязательным – он идентифицирует чек, и если он не найден, то обрабатывать дальше бессмысленно.
Далее в заголовке же (можно и отдельно) создаем элемент Date типа Date для поиска и определения даты операции, указав, что он расположен ниже названия банка. Наш случай очень простой: формат даты практически одинаков, DD-MM-YY(YY), отличается только разделителем и форматом года. Поэтому указываем, что порядок всегда день-месяц-год, год может состоять из двух или четырех цифр, а разделителем может служить слэш или точка. Заодно ограничиваем возможное значение даты – с 1 января 2010 года (предположим, что обработка старых чеков не требуется) по 31 декабря 2100 года (маловероятно, что обработка банкоматных чеков будет тогда актуальна): это нужно для более уверенного поиска даты.
Затем создаем элемент Time типа Character String для поиска времени операции – пока что ABBYY FlexiCapture 10 не поддерживает специальный формат для этого случая. Время у нас в обоих случаях располагается справа от даты и имеет формат вида NN:NN:NN – так это поле и описываем.
Для поисков снятой суммы и остатка можно воспользоваться аналогичным методом – создать элемент Static Text с заголовком строки и искать слева от него элемент Currency с суммой. Но проще воспользоваться готовым элементом Labeled Field, который представляет собой как раз комбинацию подписи и информационного поля. Создаем два таких поля Amount и Balance, указываем для первого заголовок «Сумма», для второго – «Баланс» или «Доступный остаток». Указываем, что поля с данными имеют тип Currency.
После этого остается только добавить блоки – собственно участки, с которых будет извлекаться информация. В нашем простом случае они совпадают с элементами Date, Time и подэлементами Field элементов Amount и Balance. Проверяем, что все корректно распознается, экспортируем описание в ABBYY FlexiCapture 10 – и вуаля, больше не надо вводить руками даты списаний.
Вот так выглядит главное окно программы при ручном создании гибкого описания:
Справа изображения документов, под ними деревья гипотез (можно следить, как именно осуществляется поиск полей), слева сверху вниз список страниц с информацией о них, затем структура FlexiLayout, и внизу свойства выбранного элемента.
Это, конечно, самый простой случай. В реальности все обычно гораздо сложнее, и возможности программы очень широки. Можно создавать классификаторы для быстрой сортировки документов. Можно создавать многостраничные описания. Можно создавать и обучать гибкие описания автоматически. Можно использовать специальный язык для программирования гибких описаний. Многое можно, справка ABBYY FlexiLayout Studio 10 содержит сотни страниц – но, если заинтересует, о них мы расскажем в следующих выпусках, этот и так получился слишком длинным.
Примечание: да, кстати, личная информация на картинках скрыта вручную после снятия скриншотов или сканирования. Но ABBYY FlexiCapture 10 (не ABBYY FlexiLayout Studio 10) при необходимости умеет закрашивать такие поля автоматически.
Happy birthday, Димыч!
Павел Соколов
Департамент продуктов для ввода данных
ABBYY FlexiLayout Studio предназначена для разработки гибких описаний. Что такое гибкое описание и чем оно отличается от жесткого? Жесткое описание – это стандартная форма. Все экземпляры таких документов до заполнения одинаковы, как говорится, «на просвет» – если наложить их друг на друга, то одинаковые поля окажутся в одном и том же месте. Достаточно определить координаты этих мест – и при обработке значения полей будут распознаны. Все легко и ясно.
Но далеко не всегда ситуация так проста. Многие документы, из которых требуется извлекать данные, не являются жесткими формами. Например, чеки банкоматов разных банков содержат, в общем-то, однотипную информацию. Но различаются они не только ее расположением, а даже зачастую размерами. Для таких документов создать жесткий шаблон, конечно же, нельзя. А что можно?
А можно с помощью ABBYY FlexiLayout Studio 10 создать описание гибкое. Гибкое описание позволяет оперировать не координатами полей, из которых необходимо извлекать информацию, а их расположением относительно опорных элементов и друг друга, а также типом распознаваемых данных и возможной их структурой. Для примера возьмем два отсканированных чека от банкомата:
Очевидно, что на просвет чеки не одинаковые. С другой стороны, некоторые элементы у них общие: сверху название банка, под ним дата и время совершения операции, внизу снятая сумма и остаток (называются, впрочем, по-разному), а также техническая информация. Предположим, что мы хотим автоматизировать ввод информации с чеков в некую программу. Нас интересуют дата и время снятия денег, сумма и остаток средств. Для простоты примем, что обрабатываться будут два вида чеков, Райффайзен-банка и Сбербанка).
Для начала мы должны найти опорный элемент. В нашем случае это название банка: Raiffeisen BANK или ОАО «СБЕРБАНК РОССИИ». Для этого создаем элемент Header – заголовок, а в нем подэлемент BankName типа Static Text – и указываем, что этот элемент должен содержать либо то, либо другое название банка. Этот элемент должен быть обязательным – он идентифицирует чек, и если он не найден, то обрабатывать дальше бессмысленно.
Далее в заголовке же (можно и отдельно) создаем элемент Date типа Date для поиска и определения даты операции, указав, что он расположен ниже названия банка. Наш случай очень простой: формат даты практически одинаков, DD-MM-YY(YY), отличается только разделителем и форматом года. Поэтому указываем, что порядок всегда день-месяц-год, год может состоять из двух или четырех цифр, а разделителем может служить слэш или точка. Заодно ограничиваем возможное значение даты – с 1 января 2010 года (предположим, что обработка старых чеков не требуется) по 31 декабря 2100 года (маловероятно, что обработка банкоматных чеков будет тогда актуальна): это нужно для более уверенного поиска даты.
Затем создаем элемент Time типа Character String для поиска времени операции – пока что ABBYY FlexiCapture 10 не поддерживает специальный формат для этого случая. Время у нас в обоих случаях располагается справа от даты и имеет формат вида NN:NN:NN – так это поле и описываем.
Для поисков снятой суммы и остатка можно воспользоваться аналогичным методом – создать элемент Static Text с заголовком строки и искать слева от него элемент Currency с суммой. Но проще воспользоваться готовым элементом Labeled Field, который представляет собой как раз комбинацию подписи и информационного поля. Создаем два таких поля Amount и Balance, указываем для первого заголовок «Сумма», для второго – «Баланс» или «Доступный остаток». Указываем, что поля с данными имеют тип Currency.
После этого остается только добавить блоки – собственно участки, с которых будет извлекаться информация. В нашем простом случае они совпадают с элементами Date, Time и подэлементами Field элементов Amount и Balance. Проверяем, что все корректно распознается, экспортируем описание в ABBYY FlexiCapture 10 – и вуаля, больше не надо вводить руками даты списаний.
Вот так выглядит главное окно программы при ручном создании гибкого описания:
Справа изображения документов, под ними деревья гипотез (можно следить, как именно осуществляется поиск полей), слева сверху вниз список страниц с информацией о них, затем структура FlexiLayout, и внизу свойства выбранного элемента.
Это, конечно, самый простой случай. В реальности все обычно гораздо сложнее, и возможности программы очень широки. Можно создавать классификаторы для быстрой сортировки документов. Можно создавать многостраничные описания. Можно создавать и обучать гибкие описания автоматически. Можно использовать специальный язык для программирования гибких описаний. Многое можно, справка ABBYY FlexiLayout Studio 10 содержит сотни страниц – но, если заинтересует, о них мы расскажем в следующих выпусках, этот и так получился слишком длинным.
Примечание: да, кстати, личная информация на картинках скрыта вручную после снятия скриншотов или сканирования. Но ABBYY FlexiCapture 10 (не ABBYY FlexiLayout Studio 10) при необходимости умеет закрашивать такие поля автоматически.
Happy birthday, Димыч!
Павел Соколов
Департамент продуктов для ввода данных