[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
 
Достаточно тривиально
Взять что-то типа такого скрипта и поставить в цикл по всем объектам публикации
Если label!="" то экспортировать в файл с именем label
Ну единственно, расширение парсить и соответствующий ExportFormat подставлять
 
  • Спасибо
Реакции: vaco
Достаточно тривиально
Да, задача в теории простая, при знании языка. Как всегда проблема в том, что в jsx не силён, с первых строк ухожу сразу в ошибки, наступаю на грабли, весь перегуглился, и так и остался у корыта. В своё время на каком-нибудь бейсике что-то подобное бы шустро изложил, а тут - дебри.
 
Ну для выбранных объектов будет в первом приближении примерно так
Код:
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);
 }
}
осталось добавить проверку расширений и цикл не только по выбранным, а по всему файлу. Как то так
 
Номер ошибки: 9
Сообщение об ошибке: Недопустимое использование зарезервированного слова 'int'
Источник: for (int i=0;i<app.selection.length;i++)
Проблемный текст: int
Вот о подобных граблях я и говорю
 
Тьфу параллельно на си программу отлаживаю ;)
Конечно же var i=... ;)
 
  • Спасибо
Реакции: vaco
Примерно как то так
Код:
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
Попробуйте так ExportFormat.PNG_FORMAT
 
  • Спасибо
Реакции: vaco
  • Спасибо
Реакции: vaco
Дааааа!!!!
Спасибо, _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
но со страницами можно проще обойтись

Код:
for (var i = 0; i < myDoc.pages.length; i++) {
    
var myPage = myDoc.pages[i];
 
  • Спасибо
Реакции: _MBK_ и vaco
Код:
/**
 * Объект 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
По сути именно этого я и хотел от знающих в самом первом сообщении, но пришлось кусками не всегда понятного мне кода изобретать колесо.
'thank'
 
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Код:
// если спросить у строки как ниже, то вернется true, если строка пустая
    if (!pageItem.label) {
 
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Да, Виталий видимо спростонья код писал '))' конечно же
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);
       }
 
только спросонья не могу понять, зачем пустую строку далее проверять на вхождение подстрок
Не столько спросонок, сколько с головной болью. Правильно: !!pageItem.label
Что там я еще нафантазировал? :)
Я не тестировал же. Примерно накидал.
 
Нашел, поправил:
Код:
#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);
}
/**
 * И, напоследок. Комментируй свой код.
 * Если это функция, комментируй примерно как выше.
 * Называй переменные самодокументируемыми названиями
 * Сам же потом себе спасибо скажешь
 */
 
(Жора не мешай)
У тебя два раза последовательно расширение проверяется, а это некошерно и возможны кколлизии. Вставь else
 
Статус
Закрыто для дальнейших ответов.