[ID CS4-CS6] Экспорт всех объектов со script label в jpg и png

Статус
Закрыто для дальнейших ответов.

vaco

Участник
Топикстартер
Сообщения
7
Реакции
2
Добрый день!
Столкнулся с проблемой:
Есть многостраничный документ, содержащий в себе объекты.
Части объектов присвоены script label (допустим 1_1.jpg, 1_2.jpg, 1b.png, 1d.png; 2_1.jpg, 2_2.jpg, 2b.png, 2d.png и т.д.).

Необходимо, чтобы скрипт экспортировал элементы со script label, присваивая им имена, записанные в их script label. В соответствующих форматах (если в label есть ".jpg", то экспорт в формате jpg, если в label есть ".png", то экспорт в формате png).

Зачем это надо:
Документ многостраничный, элементы регулярно меняются в больших объёмах. Вручную экспорт занимает длительное время. Проблема возникает очень часто.

Пожалуйста, помогите с готовым решением, или наведите на что-то подобное, буду очень признателен!

pic1.jpg
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Достаточно тривиально
Взять что-то типа такого скрипта и поставить в цикл по всем объектам публикации
Если label!="" то экспортировать в файл с именем label
Ну единственно, расширение парсить и соответствующий ExportFormat подставлять
 
  • Спасибо
Реакции: vaco

vaco

Участник
Топикстартер
Сообщения
7
Реакции
2
Достаточно тривиально
Да, задача в теории простая, при знании языка. Как всегда проблема в том, что в jsx не силён, с первых строк ухожу сразу в ошибки, наступаю на грабли, весь перегуглился, и так и остался у корыта. В своё время на каком-нибудь бейсике что-то подобное бы шустро изложил, а тут - дебри.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну для выбранных объектов будет в первом приближении примерно так
Код:
for (int i=0;i<app.selection.length;i++)
{
 var  obj=app.selection[i];
 if (obj.label!="")
 {
   myFile=new File(obj.label);
   obj.exportFile(ExportFormat.JPG, myFile, false);
 }
}
осталось добавить проверку расширений и цикл не только по выбранным, а по всему файлу. Как то так
 

vaco

Участник
Топикстартер
Сообщения
7
Реакции
2
Номер ошибки: 9
Сообщение об ошибке: Недопустимое использование зарезервированного слова 'int'
Источник: for (int i=0;i<app.selection.length;i++)
Проблемный текст: int
Вот о подобных граблях я и говорю
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Тьфу параллельно на си программу отлаживаю ;)
Конечно же var i=... ;)
 
  • Спасибо
Реакции: vaco

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Примерно как то так
Код:
for (int i=0;i<app.selection.length;i++)
{
 var  obj=app.selection[i];
 if (obj.label!="")
 {
   if (obj.label.toUpperCase().indexOf(".JPG")!=-1)
   {
     myFile=new File(obj.label);
     obj.exportFile(ExportFormat.JPG, myFile, false);
  } else
  if (obj.label.toUpperCase().indexOf(".PNG")!=-1)
   {
     myFile=new File(obj.label);
     obj.exportFile(ExportFormat.PNG, myFile, false);
  }
 }
}
под рукой индизайна нет проверить работают ли в нем вышеупомянутые функции или нет
 
  • Спасибо
Реакции: Skvoznyak и vaco

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Попробуйте так ExportFormat.PNG_FORMAT
 
  • Спасибо
Реакции: vaco

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
  • Спасибо
Реакции: vaco

vaco

Участник
Топикстартер
Сообщения
7
Реакции
2
Дааааа!!!!
Спасибо, _MBK_, за подсказки!
Вот, рабочий код, решающий заданную проблему.

Код:
var myDoc = app.activeDocument;
for (var i = 0; i < myDoc.pages.length; i++) {
    app.activeWindow.activePage = myDoc.pages[i];

var myPage = app.activeWindow.activePage;
myPageItems = myPage.allPageItems;
myFilePath = "e:\\_items\\"

for (var a=0;a<myPageItems.length;a++)
{
 var  obj=myPageItems[a];
 if (obj.label!="")
 {
   if (obj.label.toUpperCase().indexOf(".JPG")!=-1)
   {
     myFile=new File(myFilePath + obj.label);
     obj.exportFile(ExportFormat.JPG, myFile, false);
  } else
  if (obj.label.toUpperCase().indexOf(".PNG")!=-1)
   {
     myFile=new File(myFilePath + obj.label);
     obj.exportFile(ExportFormat.PNG_FORMAT, myFile, false);
  }
 }
}

};

alert(":)");
 
Последнее редактирование:
  • Спасибо
Реакции: _MBK_ и Skvoznyak

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
но со страницами можно проще обойтись

Код:
for (var i = 0; i < myDoc.pages.length; i++) {
    
var myPage = myDoc.pages[i];
 
  • Спасибо
Реакции: _MBK_ и vaco

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Код:
/**
 * Объект Document и так имеет свойство allPageItems,
 * так что можно перебирать прямо его
 */
for (var a = 0, l = app.activeDocument.allPageItems.length; a < l; a++) {
    var pageItem = app.activeDocument.allPageItems[a];
    // Javaascipt язык с динамической типизацией,
    // если спросить у строки как ниже, то вернется true, если строка пустая
    if (!pageItem.label) {
        if (pageItem.label.toUpperCase().indexOf(".JPG") > -1) {
            // Однотипные операции лучше оформлять в качестве
            // функции, чтобы было легче править, если понадобится
            exportFile(pageItem.label, ExportFormat.JPG);
        }
        if (pageItem.label.toUpperCase().indexOf(".PNG") > -1) {
            exportFile(pageItem.label, ExportFormat.PNG_FORMAT);
        }
    }
}
alert("Готово!");
/**
 * Экспорт объекта на странице в формат JPG или PNG
 *
 * @param {PageItem}        item    Объект на странице
 * @param {ExportFormat}    format  Значение типа экспорта
 */
function exportFile(item, format) {
// Пути лучше писать в мультиплатформенной нотации
    var exportPath = "/e/_items/";
    var exportFile = File(exportPath + item.label);
    item.exportFile(format, exportFile, false);
}
/**
 * И, напоследок. Комментируй свой код.
 * Если это функция, комментируй примерно как выше.
 * Называй переменные самодокументируемыми названиями
 * Сам же потом себе спасибо скажешь
 */
 
  • Спасибо
Реакции: vaco и azz

vaco

Участник
Топикстартер
Сообщения
7
Реакции
2
По сути именно этого я и хотел от знающих в самом первом сообщении, но пришлось кусками не всегда понятного мне кода изобретать колесо.
'thank'
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Код:
// если спросить у строки как ниже, то вернется true, если строка пустая
    if (!pageItem.label) {
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Да, Виталий видимо спростонья код писал '))' конечно же
if (pageItem.label) {
и еще -
Код:
if (pageItem.label.toUpperCase().indexOf(".JPG") > -1) {
           // Однотипные операции лучше оформлять в качестве
           // функции, чтобы было легче править, если понадобится
           exportFile(pageItem.label, ExportFormat.JPG);
       } else
       if (pageItem.label.toUpperCase().indexOf(".PNG") > -1) {
           exportFile(pageItem.label, ExportFormat.PNG_FORMAT);
       }
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Не столько спросонок, сколько с головной болью. Правильно: !!pageItem.label
Что там я еще нафантазировал? :)
Я не тестировал же. Примерно накидал.
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Нашел, поправил:
Код:
#target indesign

// Добавим проверку, есть ли у нас открые документы
if (!app.documents.length) { exit(); }
/**
 * Объект Document и так имеет свойство allPageItems,
 * так что можно перебирать прямо его
 */
for (var a = 0, l = app.activeDocument.allPageItems.length; a < l; a++) {
    var pageItem = app.activeDocument.allPageItems[a];
    // Javaascipt язык с динамической типизацией,
    // если спросить у строки как ниже, то вернется true, если строка пустая
    if (!!pageItem.label) {
        if (pageItem.label.toUpperCase().indexOf(".JPG") > -1) {
            // Однотипные операции лучше оформлять в качестве
            // функции, чтобы было легче править, если понадобится
            exportFile(pageItem, ExportFormat.JPG);
        }
        if (pageItem.label.toUpperCase().indexOf(".PNG") > -1) {
            exportFile(pageItem, ExportFormat.PNG_FORMAT);
        }
    }
}
alert("Готово!");
/**
 * Экспорт объекта на странице в формат JPG или PNG
 *
 * @param {PageItem}        item    Объект на странице
 * @param {ExportFormat}    format  Значение типа экспорта
 */
function exportFile(item, format) {
// Пути лучше писать в мультиплатформенной нотации
    var exportPath = "/e/_items/";
    var exportFile = File(exportPath + item.label);
    item.exportFile(format, exportFile, false);
}
/**
 * И, напоследок. Комментируй свой код.
 * Если это функция, комментируй примерно как выше.
 * Называй переменные самодокументируемыми названиями
 * Сам же потом себе спасибо скажешь
 */
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
(Жора не мешай)
У тебя два раза последовательно расширение проверяется, а это некошерно и возможны кколлизии. Вставь else
 
Статус
Закрыто для дальнейших ответов.