есть ли возможность разделения отсканированного изображения на две страницы, наподобие того, как это реализовано в FineReader. Ситуация такая, что на странице два разных документа и нужно их разделять после сканиролвания на два документа, в Finereader это реализовано, а в Flexicapture это найти не удалось.
Разделение изображения на две страницы.
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
コメント
4件のコメント
Описанную задачу можно решить тремя способами:
В качестве примера разберем 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");
}
Нужен совет.
Сканируется большой поток листов А4, попадаются листы А3. Как изменить скрип, чтобы листы А3 делились пополам по вертикали, а листы А4 оставались без изменения?
Добавил условия (если ширина листа меньше...., выход из скрипта), при этом нарушился порядок следование листов в пакете.
Спасибо.
Для этого нужно в предложенный скрипт добавить дополнительное условие перед основным разделением страницы (в теле скрипта отмечено комментарием "Условие проверки формата"). Данное условие проверяет, какой формат имеет страничка и в случае удовлетворения условий, делит ее на 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.
サインインしてコメントを残してください。