Pull to refresh

Photoshop Scripting для автоматизации печати многотиражной полиграфической продукции

Reading time 2 min
Views 15K
Здравствуйте. Хотелось бы поделиться опытом автоматизации процесса печати большого количества документов из Adobe Photoshop.
Задача состоит в следующем:
имеется большое количество (в моем случае — 100 000 шт.) уже напечатанных документов. Необходимо на них в определенных местах определенным шрифтом напечатать их порядковый номер в заданном формате (или любую строку, сформированную по определенному алгоритму).
Чтобы было более понятно, приведу пример.

Исходное изображение:
image

Что должно получиться:
image

и таких — 100 000 документов. Явно, что вручную такой объем осилить достаточно сложно, поэтому надо искать возможности автоматизации.

В процессе поиска решения задачи автоматической нумерации документов по определенному алгоритму при печати, был найден способ, который использует Corel Draw и MS Office: генерируем таблицу с нужными значениями, производим слияние, и Corel генерирует нам необходимое количество листов с нужным содержанием. Вроде бы все — ничего, но все листы должны быть в памяти, а это говорит, что ресурсоемкость выполнения задачи возрастает с количеством печатаемых изделий. Кому интересно, вот ссылка на видео — Нумерация в Corel Draw. Безусловно, существуют макросы в 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 можно ознакомиться тут.

Спасибо за внимание, надеюсь мое решение будет полезно общественности.
Tags:
Hubs:
+13
Comments 47
Comments Comments 47

Articles