Здравствуйте. Хотелось бы поделиться опытом автоматизации процесса печати большого количества документов из Adobe Photoshop.
Задача состоит в следующем:
имеется большое количество (в моем случае — 100 000 шт.) уже напечатанных документов. Необходимо на них в определенных местах определенным шрифтом напечатать их порядковый номер в заданном формате (или любую строку, сформированную по определенному алгоритму).
Чтобы было более понятно, приведу пример.
Исходное изображение:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/f2d/e3f/ee5/f2de3fee55982b43450f14896e5f4e9a.png)
Что должно получиться:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/383/cd5/cc4/383cd5cc4b0f804c2ab2712073b07346.png)
и таких — 100 000 документов. Явно, что вручную такой объем осилить достаточно сложно, поэтому надо искать возможности автоматизации.
В процессе поиска решения задачи автоматической нумерации документов по определенному алгоритму при печати, был найден способ, который использует Corel Draw и MS Office: генерируем таблицу с нужными значениями, производим слияние, и Corel генерирует нам необходимое количество листов с нужным содержанием. Вроде бы все — ничего, но все листы должны быть в памяти, а это говорит, что ресурсоемкость выполнения задачи возрастает с количеством печатаемых изделий. Кому интересно, вот ссылка на видео — Нумерация в Corel Draw. Безусловно, существуют макросы в Corel, но я с Corel не так хорошо знаком, как с Photoshop, поэтому именно Photoshop был выбран для решения поставленной задачи.
Приведу пример скрипта, который выполняет необходимые операции:
Скрипты для Adobe Photoshop имеют расширение jsx.
Для успешного выполнения данного скрипта, необходимо иметь в открытом виде photoshop-проект с текстовыми слоями,
имена которых — text1, text2, text3, и text4.
Управление скриптом осуществляется из программы ExtendScript Toolkit.
Обратите внимание на то, что в левом верхнем углу окна программы ExtendScript Toolkit необходимо выбрать Adobe Photoshop, иначе скрипт не запустится.
Спешу отметить тот факт, что скрипт ни в коем случае не претендует на образец для подражания, был написан «на скорую руку» и показывает лишь возможность автоматизации описанного выше процесса.
Полезной информацией является то, что вместо
можно использовать
что явно демонстрирует возможность приведения типов и конкатенации строк.
С документацией по Photoshop Scripting можно ознакомиться тут.
Спасибо за внимание, надеюсь мое решение будет полезно общественности.
Задача состоит в следующем:
имеется большое количество (в моем случае — 100 000 шт.) уже напечатанных документов. Необходимо на них в определенных местах определенным шрифтом напечатать их порядковый номер в заданном формате (или любую строку, сформированную по определенному алгоритму).
Чтобы было более понятно, приведу пример.
Исходное изображение:
![image](https://habrastorage.org/getpro/habr/post_images/f2d/e3f/ee5/f2de3fee55982b43450f14896e5f4e9a.png)
Что должно получиться:
![image](https://habrastorage.org/getpro/habr/post_images/383/cd5/cc4/383cd5cc4b0f804c2ab2712073b07346.png)
и таких — 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 можно ознакомиться тут.
Спасибо за внимание, надеюсь мое решение будет полезно общественности.