Illustrator通过javascript

时间:2017-02-20 21:33:39

标签: javascript xml adobe adobe-illustrator

编辑,原始副本标记如下: 我设法创建了一个半功能的脚本。令我非常沮丧的是,我意识到语法错误是文本编辑的标记。它的半工作原因在于它会重新链接一些文件并且通常以错误结束,“放置艺术不存在”几次循环之后。我觉得XML比文件中存在更多的“stRef:filePath”。示例:具有两个图像的文件每两次查找一个文件路径。有什么提示吗?

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_path2的link_path以将其转换为字符串,假设var link_path返回typeof XML这一事实是重新定义或编辑值的问题。

最终目标是编辑从Windows服务器路径到macOS文件路径的文件路径,以修复损坏的链接。我已经搜索了几个小时,并且一直在努力。

4 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分:0)

如果是这种情况,起点和终点不同,我们使用这样的脚本来传输带有从一个位置到另一个位置的链接的文件,并允许您选择起始位置和目的地。再一次,不能承诺它适用于Mac,但也许其中一些可以帮助你。在我们的设置中,我们将图形存储在一个文件夹中并在另一个文件夹中扫描,因此如果将所有文件保存在一个文件夹中,则可能需要调整文件路径所以我们有一个根文件夹,在该文件夹中有一个&#34; Graphics&#34;文件夹和&#34;扫描&#34;文件夹中。

这也有一个try / catch文件丢失扫描,并会在最后的错误列表中将它们吐出来,这样你就知道哪些文件丢失了图像。

希望其中一些有帮助!

    // 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.");
}
}

答案 2 :(得分:0)

这不会直接回答您的问题,但可能会解决您的问题或对他人有所帮助。

有一个完全不同的解决方案。

Illustrator始终在与文档相同的文件夹中的“链接”文件夹中查找缺少的图稿。

如果您经常需要移动项目,只需将图稿保存在带有AI文件的“链接”文件夹中,您就可以在任何地方打开AI文件而不会断开链接。

答案 3 :(得分:0)

为什么要使用XMP数据呢?您可以获取放置在文档中的所有placementItem,您可以检查链接是否存在,如果不存在,则将它们重新链接到新文件。这是

的小脚本
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中更新。