2017-02-20 72 views
1

編輯,原標題如下: 我已經設法創建一個半功能腳本。我意識到,非常沮喪的是,語法錯誤是文本編輯的標記。它是半工作的,因爲它會重新鏈接一些文件,並且通常以一個錯誤結束,「經過幾次循環後,放置的藝術不存在」。我覺得XML找到了比文件中存在更多的「stRef: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");} 


原單張貼
好吧,我非常缺乏經驗的XML,但我嘗試編輯使用腳本在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文件,查找放置的項目並將圖像重新鏈接到新路徑。我只在PC上使用過,所以我不確定這是否可以在沒有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çibeaucoup。 – 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更新。