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

от автора

Введение

Здравствуйте. Хотелось бы поделиться опытом автоматизации процесса печати большого количества документов из 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 можно ознакомиться тут.

Спасибо за внимание, надеюсь мое решение будет полезно общественности.

ссылка на оригинал статьи http://habrahabr.ru/post/165517/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *