コミュニティ

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

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

この記事は役に立ちましたか?

0人中0人がこの記事が役に立ったと言っています

コメント

4件のコメント

  • Avatar
    Permanently deleted user
    Здравствуйте!
    Описанную задачу можно решить тремя способами:
    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
    Permanently deleted user
    Добрый день!
    Нужен совет.
    Сканируется большой поток листов А4, попадаются листы А3. Как изменить скрип, чтобы листы А3 делились пополам по вертикали, а листы А4 оставались без изменения?
    Добавил условия (если ширина листа меньше...., выход из скрипта), при этом нарушился порядок следование листов в пакете.
    Спасибо.
    0
  • Avatar
    Permanently deleted user
    Добрый день!
    Для этого нужно в предложенный скрипт добавить дополнительное условие перед основным разделением страницы (в теле скрипта отмечено комментарием "Условие проверки формата"). Данное условие проверяет, какой формат имеет страничка и в случае удовлетворения условий, делит ее на 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
    Permanently deleted user
    Спасибо за ответ. Но после выполнения скрипта порядок страниц все равно нарушается. Добавил скрины "До" и "После". Можно ли как-нибудь избежать этого?
    0

サインインしてコメントを残してください。