- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

и таких — 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/