- PVSM.RU - https://www.pvsm.ru -
Здравствуйте. Хотелось бы поделиться опытом автоматизации процесса печати большого количества документов из Adobe Photoshop.
Задача состоит в следующем:
имеется большое количество (в моем случае — 100 000 шт.) уже напечатанных документов. Необходимо на них в определенных местах определенным шрифтом напечатать их порядковый номер в заданном формате (или любую строку, сформированную по определенному алгоритму).
Чтобы было более понятно, приведу пример.
Исходное изображение:
Что должно получиться:
и таких — 100 000 документов. Явно, что вручную такой объем осилить достаточно сложно, поэтому надо искать возможности автоматизации.
В процессе поиска решения задачи автоматической нумерации документов по определенному алгоритму при печати, был найден способ, который использует Corel Draw и MS Office: генерируем таблицу с нужными значениями, производим слияние, и Corel генерирует нам необходимое количество листов с нужным содержанием. Вроде бы все — ничего, но все листы должны быть в памяти, а это говорит, что ресурсоемкость выполнения задачи возрастает с количеством печатаемых изделий. Кому интересно, вот ссылка на видео — Нумерация в Corel Draw [1]. Безусловно, существуют макросы в Corel, но я с Corel не так хорошо знаком, как с Photoshop, поэтому именно Photoshop был выбран для решения поставленной задачи.
Приведу пример скрипта, который выполняет необходимые операции:
var start1 = 1; //номер, с которого начинать нумерацию
var count = 100000; //общее количество экземпляров
var doc = app.activeDocument;
var layer = doc.layers.getByName("text1");
function changeTextByLayerName(layerName,newText){ //функция изменения содержания текстового слоя по его имени на переданную строку
layer = doc.layers.getByName(layerName);
if(layer.kind == LayerKind.TEXT) layer.textItem.contents = newText; //присваиваем содержимое
}
function printIt(){ //функция отправки на печать
app.bringToFront();
doc.printSettings.flip = false;
doc.printSettings.setPagePosition(DocPositionStyle.SIZETOFIT);
doc.printSettings.negative = false;
doc.printOneCopy();
}
for(a=start1; a<=count; a++){
changeTextByLayerName("text1", a);
changeTextByLayerName("text2", a);
changeTextByLayerName("text3", a);
changeTextByLayerName("text4", a);
$.sleep(2000); //задержка выполнения на 2 секунды, чтобы принтер успел обрабатывать запросы
printIt();
}
Скрипты для Adobe Photoshop имеют расширение jsx.
Для успешного выполнения данного скрипта, необходимо иметь в открытом виде photoshop-проект с текстовыми слоями,
имена которых — text1, text2, text3, и text4.
Управление скриптом осуществляется из программы ExtendScript Toolkit.
Обратите внимание на то, что в левом верхнем углу окна программы ExtendScript Toolkit необходимо выбрать Adobe Photoshop, иначе скрипт не запустится.
Спешу отметить тот факт, что скрипт ни в коем случае не претендует на образец для подражания, был написан «на скорую руку» и показывает лишь возможность автоматизации описанного выше процесса.
Полезной информацией является то, что вместо
changeTextByLayerName("text4", a);
можно использовать
changeTextByLayerName("text4", "000" + a);
что явно демонстрирует возможность приведения типов и конкатенации строк.
С документацией по Photoshop Scripting можно ознакомиться тут [2].
Спасибо за внимание, надеюсь мое решение будет полезно общественности.
Автор: AdaStreamer
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/24613
Ссылки в тексте:
[1] Нумерация в Corel Draw: http://www.youtube.com/watch?v=IVFbAyOy8Q0
[2] тут: http://www.adobe.com/devnet/photoshop/scripting.html
[3] Источник: http://habrahabr.ru/post/165517/
Нажмите здесь для печати.