Pull to refresh

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

Reading time2 min
Views15K
Здравствуйте. Хотелось бы поделиться опытом автоматизации процесса печати большого количества документов из 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:
Total votes 21: ↑17 and ↓4+13
Comments47

Articles