2017-02-20 31 views
1

Редактировать, оригинал копировать, указанный ниже: Мне удалось создать полуфункциональный скрипт. Я понял, к большому разочарованию, что ошибки синтаксиса были «отметками редактирования текста». Он работает в том же режиме, что он перезагружает некоторые файлы и, как правило, заканчивается ошибкой, «placeArt не существует» после нескольких циклов. Я чувствую, что XML находит больше «stRef: filePath», чем существует в файле. Пример: файл с двумя изображениями находит путь для каждого файла дважды. Какие-нибудь советы?Иллюстратор редактировать ссылку filepath через javascript

var counter = 0; 
var doc = app.activeDocument; 
var x = new XML(doc.XMPString); 
var m = x.xpath('//stRef:filePath'); 
if (m !== '') { 
    for (var i=0, len=m.length(); i < len ; i++) { 
    var link_path = m[i]; 
    if (File(link_path).exists === false) { 
    link_path = link_path.split('/Projects').join('/Volumes/Projects') 
    link_path = link_path.split('O:').join('/Volumes/Projects'); 
    link_path = link_path.split('P:').join('/Volumes/Projects'); 
    link_path = link_path.split('\\SERVER').join('Volumes'); 
    link_path = link_path.split("\\").join("/"); 

    if (File(link_path).exists === true){ 
     placedArt = app.activeDocument.placedItems[i]; 
     placedArt.relink(new File (link_path));} 
    alert(File(link_path).fsName); 
    counter++; 
    } 

};} 

if (counter > 0) { 
    alert("Attempted to relink " + counter + " links");} 
else { 
    alert("No links replaced");} 


Orginal размещать
Хорошо, я очень неопытный XML, но я пытаюсь изменить части FilePath ссылки в Adobe Illustrator с помощью сценария. Ниже приведено то, что у меня есть до сих пор:

var doc = app.activeDocument; 
var x = new XML(doc.XMPString); 
var m = x.xpath('//stRef:filePath'); 
if (m !== '') { 
    for (var i=0, len=m.length(); i < len ; i++) { 
    var link_path = m[i]; 
    if (File(link_path).exists === false) { 
     var link_path2 = String(link_path) 
     link_path2 = link_path2.replace(‘%5C’, ‘/‘) 
     alert(File(link_path2)); 
    } 
}; 
} 

Это возвращает ошибку: 8 синтаксическая ошибка. на линии link_path2 = link_path2.replace ('% 5C', '/'). Таким образом, делает любые попытки пересмотреть link_path2, такие как

link_path2 = 'cow'; 

В настоящее время я меняюсь, то link_path к link_path2, чтобы преобразовать его в строку, предполагая, что тот факт, что переменная link_path возвращает TYPEOF XML является проблемой для переопределения, или редактирования значения.

Конечная цель - отредактировать путь к файлу с пути к серверу Windows до пути к файлу macOS, чтобы скрипт исправить неработающие ссылки. Я искал часы на этом и продолжаю тупик.

ответ

0

У меня нет данных XML/XMP - это лучший способ сделать это. У нас была аналогичная проблема со связанными файлами в нашей фирме по обмену связанными изображениями с одного сервера на другой. Это открывает каждый AI-файл, ищет размещенные элементы и переводит изображения в новый путь. Я использовал это только на ПК, поэтому я не уверен, что это будет работать без возможности доступа к Mac, но подумал, что вы можете попробовать.

Вы всегда используете те же самые два пути к файлу, или хотите ли вы их выбирать однозначно каждый раз? Если у вас есть пути серверов два набора, которые вы просто хотите поменять, вы можете использовать что-то вроде этого (у меня есть подобный тот, где вы выбираете начальное местоположение и назначение для файлов):

// Select the source folder. 
var destFolder, sourceFolder, files, fileType, doc, targetFile, pngExportOpts; 

if (app.documents.length == 0){ 
sourceFolder = Folder.selectDialog('Select the folder with Illustrator files you want to relink', '~'); 

    // If a valid folder is selected 
    if (sourceFolder != null){ 
     files = new Array(); 
     // Get all files matching the filetype 
     files = sourceFolder.getFiles("*.ai"); 

     if (files.length > 0) { 

      for (i = 0; i < files.length; i++){ 
       doc = app.open(files[i]); // returns the document object 
       changeExt(); 
       if (app.documents.length != 0){ 
        doc.save(); 
        doc.close(); 
       } 
      } 
     } 
    } 
} 
else{ 
    changeExt(); 
    } 



function changeExt(){ 

var i; 
var doc = app.activeDocument; 

if (doc.placedItems.length != 0){ 
    for (i=0;i<doc.placedItems.length;i++) { 
     //gets the full path of the image 
    var imageName = doc.placedItems[i].file.fsName; 
    var imageURL = doc.placedItems[i].uRL; 
    var imagePath; 

    var newPath; 

    var i, in_file, out_file; 
     //if the scan is placed for the first time it uses the drive letter 
     //this swaps the drive letters to the server names so they can be replaced properly 
     if (imageName.match(/O:/)){ 
     imagePath = imageName.replace("O:", "\\\\Serv01\\Projects1") 
     imageName = imagePath; 

     } 
     else (imageName.match(/P:/)){ 
     imagePath = imageName.replace("P:", "\\\\Serv02\\Projects2") 
     imageName = imagePath; 
     } 

    if (imageName.match(/Serv02/)){ 
     imagePath = imageName.replace("Serv02", "Serv01") 
     activePath = imagePath.replace("Projects2", "Projects1"); 
     newPath = File(activePath); 
      if (newPath.exists){//copies scan over if it doesn't exist. 
       doc.placedItems[i].file = newPath; 
      } 
      else{ 
       in_file = doc.placedItems[i].file; 
       out_file = File(activePath); 
       in_file.copy(out_file); 
       doc.placedItems[i].file = out_file; 
      } 
     } 
    else{ 
     imagePath = imageName.replace("Serv01", "Serv02") 
     activePath = imagePath.replace("Projects1", "Projects2"); 
     newPath = File(activePath); 
     if (newPath.exists){//copies scan over if it doesn't exist. 
       doc.placedItems[i].file = newPath; 
      } 
      else{ 
       in_file = doc.placedItems[i].file; 
       out_file = File(activePath); 
       in_file.copy(out_file); 
       doc.placedItems[i].file = out_file; 
      } 
     } 

} 
} 
else{ 
    doc.close(SaveOptions.DONOTSAVECHANGES); 
    } 

} 
+0

Мне нужно будет изучить это более внимательно и попытаться смешать это с моим. На самом деле я получил полуфункциональную версию, используя сочетание помещенных элементов и XML. Я столкнулся с проблемой размещения элементов неработающих ссылок, не имеющих .fsname, .url или .file.name для редактирования (предупреждение показывает [помещенный элемент]/или неизвестно). Возможно, это изменение проблемы с платформой, но я перестал открывать файл, мне придется попробовать переделать нераспечатанный файл. К сожалению, серверы здесь представляют собой кластер F, и он редко использует те же два пути. В любом случае, вы дали мне новый маршрут тестирования/изучения так, merçi beaucoup. – KernelPan1c

0

Если в этом случае и исходная точка и конечная точка различны, мы использовали сценарий, подобный этому, для передачи файлов со ссылками из одного места в другое и позволяет выбрать начальное местоположение и пункт назначения. Опять же, не может обещать, что это сработает для Mac, но, возможно, некоторые из них могут вам помочь. В нашей настройке мы храним графику в одной папке и сканируем другую, поэтому вам, возможно, придется настраивать пути к файлам, если вы храните все в одной папке. Таким образом, у нас есть корневая папка и внутри этой папки находится папка «Графика» и папка «Сканирование».

У этого также есть попытка/уловка для файлов, пропавших без вести, и выплевывает их в списке ошибок в конце, чтобы вы знали, какие файлы имеют недостающие изображения.

Надеюсь, что это помогает!

// Select the source folder. 
sourceFolder = Folder.selectDialog('Select the GRAPHICS folder with Illustrator files you want to move', '~'); 

var export_folderSelect = Folder.selectDialog("Select the root folder (NOT GRAPHICS) to move the Illustrator files to"); 
var export_folder = export_folderSelect + "/Graphics"; 

var errorList = []; 

var destFolder, sourceFolder, files, fileType, doc, targetFile, pngExportOpts; 

var save_options = new IllustratorSaveOptions(); 
save_options.embedICCProfile = true; 
save_options.pdfCompatible = true; 

// If a valid folder is selected 
if (sourceFolder != null && export_folderSelect != null){ 
files = new Array(); 

// Get all files matching the pattern 
files = sourceFolder.getFiles("*.ai"); 

if (files.length > 0){ 
// Get the destination to save the files 
app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS; 
    for (i = 0; i < files.length; i++){ 
     //try to open the file and move it over, otherwise note it in the error list. 
     var docOpened = true; 
     try{ 
      doc = app.open(files[i]); // returns the document object 
      } 
     catch(e){ 
      errorList.push(files[i].name + " !!!CORRUPT - NOT COPIED!!!"); 
      docOpened = false; 
      } 
     try{ 
      moveFile(); 
      } 
     catch(e){ 
       if (docOpened == true){ 
       doc.close(); 
       } 
     } 
    } 
} 

if (errorList.length > 0){ 
    alert("COPY THIS LIST TO WORD: " + errorList); 
    } 
else{ 
    alert("Woo hoo! No errors!"); 
    } 
app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS; 
} 

function moveFile(){ 

const FILE_SUFFIX = ""; 

const ASSET_SUFFIX = ""; 

var doc = app.activeDocument; 

if (!doc.saved) doc.save(); 

var original_file = doc.fullName; 
var extension = ""; 

var arr = doc.name.split("."); 
if (arr.length>1) extension = "." + arr.pop(); 

var filename = arr.join("."); 

var assets_folder = new Folder(export_folderSelect + "/Scans"); 

if (assets_folder.exists || assets_folder.create()) { 

      var f, in_file, out_file; 

      for (f=0;f<doc.placedItems.length;f++) { 

        try{ 
         in_file = doc.placedItems[f].file; 

         out_file = File(assets_folder+"/"+in_file.name); 

         in_file.copy(out_file); 

         doc.placedItems[f].file = out_file; 
        } 
        catch(e){ 
          errorList.push(files[i].name + " SCAN MISSING"); 
         } 


      } 

      for (g=0;g<doc.rasterItems.length;g++) { 

        if (doc.rasterItems[g].embedded == false) { 

          try{ 
          in_file = doc.rasterItems[g].file; 

          out_file = File(assets_folder+"/"+in_file.name); 

          in_file.copy(out_file); 

          doc.rasterItems[g].file = out_file; 
          } 
         catch(e){ 
          errorList.push(files[i].name + " SCAN MISSING"); 
          } 
         } 

      } 
      // save as new file 

      packaged_file = File(export_folder + "/" + filename + FILE_SUFFIX + extension); 


      doc.saveAs(packaged_file, save_options); 

      doc.close(); 



      // re-open the original file 

      //app.open(File(original_file)); 



} else { 
      alert("Unable to create the assets folder."); 
} 
} 
0

Это не ответит на ваш вопрос напрямую, но может решить вашу проблему или быть полезной для других.

Существует совершенно другое решение.

Иллюстратор всегда ищет недостающие иллюстрации в папке «Ссылки» в той же папке, что и документ.

Если вам регулярно нужно перемещать проекты, просто держите их в папке «Ссылки» с AI-файлом, и вы можете открыть файл AI где угодно, не нарушая ссылок.

0

Почему для этого используются данные XMP? Вы можете получить все помещенные элементы, помещенные в документ, и вы можете проверить, существуют ли ссылки или нет, и если они не существуют, вы перенаправляете их на новый файл. Вот небольшой скрипт для этого

var activeDocument = app.activeDocument; 
var links = activeDocument.placedItems; 
for (var i = 0; i < links.length; i++) { 
    try { 
     var file = links[i].file; 
     if (file && file.exists) { 
      // Do anything as oer your requirement if link exists. 
     } 
    } catch (e) { 
     // if link missing relink with new_File 
     links[i].relink(File(new_File)); 
    } 
} 

При повторной ссылке ссылки на недостающие ссылки он будет автоматически обновляться в документе XMP.