Community

Разделение изображения на две страницы.

есть ли возможность разделения отсканированного изображения на две страницы, наподобие того, как это реализовано в FineReader. Ситуация такая, что на странице два разных документа и нужно их разделять после сканиролвания на два документа, в Finereader это реализовано, а в Flexicapture это найти не удалось.
0

Comments

4 comments

  • Avatar
    Nikolay Andreev
    Здравствуйте!
    Описанную задачу можно решить тремя способами:
    1. Можно создать такое определения документа, которое работает с полным изображением, но умеет извлекать данные из его половинок. Данный подход не очень удобный т.к. подобное определение документа может оказаться довольно сложным.
    2. Производить разделение страницы на две части на автоматической скриптовой стадии в процессе обработки FlexiCapture10.
    3. Разделять страницы на две части на станции сканирования сразу после добавления страницы с помощью скрипта.

    В качестве примера разберем 3 способ. Он позволяет проконтролировать качество разделения еще на этапе сканирования.

    Описание скрипта:
    Скрипт выполняет разделение добавляемой страницы на две равные части. Горизонтальный или вертикальный разрез выбирается исходя из размеров страницы.
    После добавления страницы делается ее копия, вычисляются координаты областей для обрезания и обрезаются оба изображения. Скрипт нужно вызывать на событии «после добавления страницы».
    Так как мы будем делать копию изображения, нужно предусмотреть механизм предотвращения зацикливания, Это связано с тем, что при копировании страницы каждый раз будет выполняться скрипт "после добавления". Для этого после добавления исходной страницы будем ставить "маркер" («Original») в набор скриптовых параметров.

    if(ScriptProperties.Has("Original"))
    {
    //Удаляем маркер, если это копия, и выходим из скрипта
    ScriptProperties.Delete("Original");
    return;
    }

    //Проверяем, что скрипту на вход подали то, что нужно (страницу)
    if(ScriptItems != null && ScriptItems.Count > 0 && ScriptItems.Item(0).IsPage)
    {
    //Ставим "маркер" в набор скриптовых параметров, чтобы копирование страницы не вызвало этот код повторно
    ScriptProperties.Set("Original", "true");

    var page = ScriptItems.Item(0);

    //Перед созданием копии страницы нужно обязательно переместить ее в конец родительского контейнера,
    //иначе она будет добавлена между предыдущей страницей и ее копией.
    var count = page.Parent.Children.Count;
    if(count > 2)
    {
    page.Move(page.Parent.Children.Item(count-1));
    }

    //Создаем копию страницы и помещаем ее после оригинала
    var newPage = page.Copy(page, false);

    //Создаем два прямоугольника и вычисляем их координаты на странице
    var pageRect_A = NewPageRect();
    var pageRect_B = NewPageRect();

    pageRect_A.Left = 0;
    pageRect_A.Top = 0;
    if(page.PageInfo.Width >= page.PageInfo.Height)
    {
    //Обрезаем вертикально
    pageRect_A.Right = page.PageInfo.Width / 2;
    pageRect_A.Bottom = page.PageInfo.Height;

    pageRect_B.Left = pageRect_A.Right + 1;
    pageRect_B.Top = 0;

    pageRect_B.Right = page.PageInfo.Width;
    pageRect_B.Bottom = page.PageInfo.Height;


    }
    else
    {
    //Обрезаем горизонтально
    pageRect_A.Right = page.PageInfo.Width;
    pageRect_A.Bottom = page.PageInfo.Height / 2;

    pageRect_B.Left = 0;
    pageRect_B.Top = pageRect_A.Bottom + 1;


    pageRect_B.Right = page.PageInfo.Width;
    pageRect_B.Bottom = page.PageInfo.Height;

    }

    //Выполняем обрезание оригинала и копии по координатам
    page.Crop(pageRect_A);
    newPage.Crop(pageRect_B);

    //Удаляем "маркер"
    if(ScriptProperties.Has("Original")) ScriptProperties.Delete("Original");
    }


    0
  • Avatar
    Vasiliy_K
    Добрый день!
    Нужен совет.
    Сканируется большой поток листов А4, попадаются листы А3. Как изменить скрип, чтобы листы А3 делились пополам по вертикали, а листы А4 оставались без изменения?
    Добавил условия (если ширина листа меньше...., выход из скрипта), при этом нарушился порядок следование листов в пакете.
    Спасибо.
    0
  • Avatar
    Nikolay Andreev
    Добрый день!
    Для этого нужно в предложенный скрипт добавить дополнительное условие перед основным разделением страницы (в теле скрипта отмечено комментарием "Условие проверки формата"). Данное условие проверяет, какой формат имеет страничка и в случае удовлетворения условий, делит ее на 2 равных части:


    if(ScriptProperties.Has("Original"))
    {
    //Удаляем маркер, если это копия, и выходим из скрипта
    ScriptProperties.Delete("Original");
    return;
    }
    //Проверяем, что скрипту на вход подали то, что нужно (страницу)

    // Условие проверки формата:
    if(ScriptItems == null || ScriptItems.Count == 0 || !ScriptItems.Item(0).IsPage)
    {
    return;
    }
    //Самое простое решение- проверять формат листа по его разрешению:

    if (ScriptItems.Item(0).IsPage && this.ScriptItems.Item(0).PageInfo.Width >= 1708 && this.ScriptItems.Item(0).PageInfo.Height>=1708)


    {

    //Проверяем, что скрипту на вход подали то, что нужно (страницу)
    if(ScriptItems != null && ScriptItems.Count > 0 && ScriptItems.Item(0).IsPage)
    {
    //Ставим "маркер" в набор скриптовых параметров, чтобы копирование страницы не вызвало этот код повторно
    ScriptProperties.Set("Original", "true");

    var page = ScriptItems.Item(0);

    //Перед созданием копии страницы нужно обязательно переместить ее в конец родительского контейнера,
    //иначе она будет добавлена между предыдущей страницей и ее копией.
    var count = page.Parent.Children.Count;
    if(count > 2)
    {
    page.Move(page.Parent.Children.Item(count-1));
    }

    //Создаем копию страницы и помещаем ее после оригинала
    var newPage = page.Copy(page, false);

    //Создаем два прямоугольника и вычисляем их координаты на странице
    var pageRect_A = NewPageRect();
    var pageRect_B = NewPageRect();

    pageRect_A.Left = 0;
    pageRect_A.Top = 0;
    if(page.PageInfo.Width >= page.PageInfo.Height)
    {
    //Обрезаем вертикально
    pageRect_A.Right = page.PageInfo.Width / 2;
    pageRect_A.Bottom = page.PageInfo.Height;

    pageRect_B.Left = pageRect_A.Right + 1;
    pageRect_B.Top = 0;

    pageRect_B.Right = page.PageInfo.Width;
    pageRect_B.Bottom = page.PageInfo.Height;


    }
    else
    {
    //Обрезаем горизонтально
    pageRect_A.Right = page.PageInfo.Width;
    pageRect_A.Bottom = page.PageInfo.Height / 2;

    pageRect_B.Left = 0;
    pageRect_B.Top = pageRect_A.Bottom + 1;


    pageRect_B.Right = page.PageInfo.Width;
    pageRect_B.Bottom = page.PageInfo.Height;

    }

    //Выполняем обрезание оригинала и копии по координатам
    page.Crop(pageRect_A);
    newPage.Crop(pageRect_B);

    //Удаляем "маркер"
    if(ScriptProperties.Has("Original")) ScriptProperties.Delete("Original");

    }
    }


    На свое усмотрение, Вы можете самостоятельно дополнить и отредактировать условие попадания листа A3 на разделение. Подробнее об объектах, методах и их свойствах можете прочитать в Справке Станции сканирования ABBYY FleixCapture.
    0
  • Avatar
    Vasiliy_K
    Спасибо за ответ. Но после выполнения скрипта порядок страниц все равно нарушается. Добавил скрины "До" и "После". Можно ли как-нибудь избежать этого?
    0

Please sign in to leave a comment.