Skip to main content
New Participant
February 26, 2010
Question

Batch renaming and relinking in InDesign CS4

  • February 26, 2010
  • 8 replies
  • 15259 views

Is there a plug-in available for InDesign that will batch rename and relink placed images?

In Quark, I used Badia Link Renamer which worked perfectly but it's not available for InDesign. (Was told they hope to have it incorporated into BigPicture for CS5.)

Is there something similar currently available for InDesign?

Essentially I need it to rename and relink files with random names to structured names such as:

001_Cust_000123456789_art_r1.tif

(I love that Bridge does batch renaming but then I have to manually update links in InDesign which is extremely time-consuming. I've also manually renamed/relinked files individually with Adobe Dialogue but it doesn't seem to be part of CS4.)

Any help or suggestions would be greatly appreciated! Been looking for something for months.

Thanks!

This topic has been closed for replies.

8 replies

lained47320698
New Participant
December 28, 2017

Here's an updated link to the script: Update path names in links

Previously shared link didn't work for me but this did and the script is brilliant! A vast time saver Thanks so much!!!

Srishti Bali
Community Manager
Community Manager
January 9, 2018

moved to InDesign Scripting

Adobe Expert
January 10, 2018

Hi Srishti,

don't know if it was good to transfer the whole thread to the InDesign Scripting forum.

I would suggest to move it back to the InDesign forum.


Why?

The topic is not about a scripting problem, but the OP was looking after a full solution to expand InDesign's functionality and posted—I think—in the InDesign forum.

( Ususally non-scripters will not visit the InDesign Scripting forum that much. )

Regards,
Uwe

Inspiring
May 19, 2015

he Kasyan

Just some 5c about this great script.

1. This work, but...In my workflow we sometimes have many many duplicated links across doc (formulas in mathematical layout), so manually typing name is time consuming and produce non-uniform names. Look at this example from your zip file. When ask for name I simply write some page number. But If need to write this for example 100 duplicated links this can be nightmare. What I will recommend is that script rename only first instance duplicated link by first page where is and link this to other instances???

2. Because your script write txt report here is list for undo command.

3. I think that better path for report.txt will be in indd folder.

May 4, 2010

TO_BookMaker: Did you ever resolve this to fit your precise specifications? I have the exact same needs. Thanks.

May 11, 2010

I'd like to amend my last post to say TO_Bookmaker, since we have the exact same needs, we probably work for the same company and I'd be happy to share development costs with you.

Kasyan, I really like the way you mark up your scripts with comments. It's really helpful for anyone trying to learn. Thank you.

Participating Frequently
January 31, 2013

Sorry for bumping this old post, but does anybody know how to adapt Kasyan's script to work with multiple documents in a book? It's fantastic for single documents, but doesn't work for other docs that share the same links.

New Participant
April 15, 2010

Sorry, Kasyan, did not meant to imply that you weren't busy, and I very much appreciate the help.

Would you mind recommending someone who may be interested in doing the modifications on a freelance basis?

New Participant
April 14, 2010

Thanks again, Kasyan, for your help.

Is it possible to not have it pop up with a custom name box when there are multiple files with the same name, but to just name it automatically?

Also, is it possible to number files sequentially throughout the document rather than as page references?

I figured out how to add in "_r1" to the end of the file name in the previous version of the script, but I can't figure out where it would go in this version.

(I clearly need to work on my next to nil scripting skills.)

Thanks!

Kasyan Servetsky
Brainiac
April 14, 2010

New Participant
April 14, 2010

Thanks so much for these suggestions. I've read through the posts (and more) and I have something that's almost workable.

I've pasted it below. Is it possible to modify this to:

1. use sequential file numbers (001, 002, 003 etc) throughout the document rather than the current page number references

Generally I need all files to be named:  name_file number_r1.ext

2. update multiple instances of the same file? Currently it gives an error when trying to rename the second instance of a file that's already been renamed.

Thanks for any help you can give.

var myDoc = app.activeDocument;
var myAllLinks = myDoc.allGraphics;
var myPrepend = prompt("Example: thebook_08765", "Job description", "Please enter job description");
var response = confirm("Warning: You are about to rename all images linked to the foremost Indesign Document - proceed? Keep in mind - it is not reversible!");

if ( response == true )
{
    for ( k = 0; k < myAllLinks.length; k++ )
    {
        var myLinkName = myAllLinks.itemLink.name;
    }

    crearLabels();

    var myPages = myDoc.pages;

    for ( p = 0; p < myPages.length; p++ )
    {
        var myPageNumber = myPages

.name;

        var myLinks = myPages

.allGraphics;
        var myASCII = 97;
        for ( k = myLinks.length - 1; k >= 0; k-- )
        {
            var myLink = myLinks.itemLink;
            if (myLink.extractLabel("relinked") != "yes") {
                var myOldLinkName = myLink.name;
                var myLinkUsage = LinkUsage( myLink );
                var myExtension = myOldLinkName.substr(myOldLinkName.lastIndexOf( "." ));
                if (myLinkUsage == 1)
                {
                    var myNewLinkName = myPrepend + '_p' + myPageNumber + String.fromCharCode( myASCII ) + '_r1' + myExtension;
                    var myOldImageHDfile = new File( myLink.filePath );
                    myOldImageHDfile.rename( myNewLinkName );
                    myLink.insertLabel("relinked", "yes");
                    myLink.relink( myOldImageHDfile );
                    try {
                        myLink = myLink.update();
                    }
                    catch(err) {}
                    myASCII++;
                }
                else
                {
                    processMultiUsedLinks(myLink);
                }
            }
        }
    }

    var myMasterSpreads = myDoc.masterSpreads;
   
    for ( m = 0; m < myMasterSpreads.length; m++ )
    {
        var myMastSpr = myMasterSpreads;
        var myPageNumber = myMastSpr.name;
        var myPrefix = myMastSpr.namePrefix;
        var myLinks = myMastSpr.allGraphics;
        var myASCII = 97;
        for ( n = myLinks.length - 1; n >= 0; n-- )
        {
            var myLink = myLinks.itemLink;
            if (myLink.extractLabel("relinked") != "yes") {
                var myOldLinkName = myLink.name;
                var myExtension = myOldLinkName.substr(myOldLinkName.lastIndexOf( "." ));
                var myLinkLetter = (myLinks.length == 1) ? "" : String.fromCharCode( myASCII );
                var myNewLinkName = myPrepend + '_master_' + myPrefix + myLinkLetter + myExtension;
                var myOldImageHDfile = new File( myLink.filePath );
                myOldImageHDfile.rename( myNewLinkName );
                myLink.insertLabel("relinked", "yes");
                myLink.relink( myOldImageHDfile );
                try {
                    myLink.update();
                }
                catch(err) {}
                myASCII++;
            }
        }
    }
}

//------------------------- Functions -------------------------------------
// Check how many times the link was placed
function LinkUsage(myLink) {
    var myLinkCounter = 0;
        for (var c =  0; c < myDoc.links.length; c++) {
        if (myLink.filePath == myDoc.links.filePath) {
            myLinkCounter += 1;
        }
    }
    return myLinkCounter
}
// Relink the links placed more than once
function processMultiUsedLinks(myLink) {
    var myMultiUsedLink = new Array();
    var myPagesArr = new Array();
    var myAllLinks = myDoc.links;
    for (var d = 0; d < myAllLinks.length; d++)  {
        if (myAllLinks.filePath == myLink.filePath) {
            myMultiUsedLink.push(myAllLinks);
        }
    }
    for (e = myMultiUsedLink.length-1; e >= 0 ; e--) {
        myPagesArr.push(myMultiUsedLink.parent.parent.parent.name);
    }
    var myPageNames = myPagesArr.sort().join("_");
    var myNewLinkName = myPrepend + '_p' + myPageNames + myExtension;
    var myOldImageHDfile = new File( myLink.filePath );
    myOldImageHDfile.rename( myNewLinkName );
    myLink.insertLabel("relinked", "yes");
    myLink.relink( myOldImageHDfile );
    try {
        myLink = myLink.update();
    }
    catch(err) {}

    for (f = myMultiUsedLink.length-2; f >= 0 ; f--)
    {
        var myCurrLink = myMultiUsedLink;
        myCurrLink.insertLabel("relinked", "yes");
        myCurrLink.relink( myOldImageHDfile );

        try {
            myCurrLink = myLink.update();
        }
        catch(err) {}
    }
    UpdateAllOutdatedLinks();
}
// Clear labels in case this script has been already run on the current document
function crearLabels() {
    for (var f =  0; f < myDoc.links.length; f++) {
        if (myDoc.links.extractLabel("relinked") != "") {
            myDoc.links.insertLabel("relinked", "");
        }
    }
}
//--------------------------------------------------------------------------------------------------------------
function UpdateAllOutdatedLinks() {
    for(var myCounter = myDoc.links.length-1; myCounter >= 0; myCounter--){
        var myLink = myDoc.links[myCounter];
        if (myLink.status == LinkStatus.linkOutOfDate){
            myLink.update();
        }
    }
}
//--------------------------------------------------------------------------------------------------------------
function pad000(myNumber) {
    if (myNumber >= 1 && myNumber <= 9) {
        x =  "0" + "0" + myNumber;
    } else if (myNumber >= 10 && myNumber <= 99) {
        x = "0" + myNumber;
    } else if (myNumber >= 100 && myNumber <= 999) {
        x = myNumber;
    }
    return x;
}

Kasyan Servetsky
Brainiac
April 14, 2010

Here is my last version of the script, it deals with multiple instances of the same file.

Kasyan

var myDoc = app.activeDocument;
var myAllLinks = myDoc.allGraphics;
var myMultipleLinks = new Array();
var myLinksCounter = 1;
var myPrepend = prompt("Example: thebook_08765", "Job description", "Please enter job description");
if (!myPrepend) exit();
var response = confirm("Warning: You are about to rename all images linked to the foremost Indesign Document - proceed? Keep in mind - it is not reversible!", false, "Rename Links Script");

if ( response == true )
{
     WriteToFile("\r--------------------- Script started -- " + GetDate() + " ---------------------\n\n");
     
     for ( k = 0; k < myAllLinks.length; k++ )
     {
          var myLinkName = myAllLinks.itemLink.name;
     }

     crearLabels();

     var myPages = myDoc.pages;
     // Pages
     for ( p = 0; p < myPages.length; p++ )
     {
          var myPageNumber = pad000(myPages

.name);

          var myLinks = myPages

.allGraphics;
          var myASCII = 97;
          for ( k = myLinks.length - 1; k >= 0; k-- )
          {
               var myLink = myLinks.itemLink;
               if (myLink.extractLabel("relinked") != "yes") {
                    var myOldLinkName = myLink.name;
                    var myLinkUsage = LinkUsage( myLink );
                    var myExtension = myOldLinkName.substr(myOldLinkName.lastIndexOf( "." ));
                    if (LinkUsage(myLink) == 1)
                    {
                         var myNewLinkName = myPrepend + myPageNumber + String.fromCharCode( myASCII ) + myExtension;
                         var myOldImageHDfile = new File( myLink.filePath );
                         var myRenameResult = myOldImageHDfile.rename( myNewLinkName );
                         if (myRenameResult)     {
                              myLink.insertLabel("relinked", "yes");
                              myLink.relink( myOldImageHDfile );
                              try {
                                   myLink = myLink.update();
                              }
                              catch(err) {}
                              myASCII++;
                              WriteToFile(((myLinksCounter < 10) ? (" " + myLinksCounter) : myLinksCounter) + " - " + myOldImageHDfile.name + " --> " + myNewLinkName + "\n");
                              myLinksCounter++;
                         }
                         else {
                              if (new File(myOldImageHDfile.parent + "/" + myNewLinkName + myExtension).exists) {
                                   WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + " to " + myNewLinkName + " because the file already exists\n");
                              }
                              else {
                                   WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + "\n");
                              }
                         }
                    }
                    else {
                         if (!IsObjInArray(myLink, myMultipleLinks)) {
                              myMultipleLinks.push(myLink);
                         }
                    }
               }
          }
     }

     var myMasterSpreads = myDoc.masterSpreads;
     // Master spreads
     for ( m = 0; m < myMasterSpreads.length; m++ )
     {
          var myMastSpr = myMasterSpreads;
          var myPageNumber = myMastSpr.name;
          var myPrefix = myMastSpr.namePrefix;
          var myLinks = myMastSpr.allGraphics;
          var myASCII = 97;
          for ( n = myLinks.length - 1; n >= 0; n-- )
          {
               var myLink = myLinks.itemLink;
               if (myLink.extractLabel("relinked") != "yes") {
                    var myOldLinkName = myLink.name;
                    var myExtension = myOldLinkName.substr(myOldLinkName.lastIndexOf( "." ));
                    if (LinkUsage(myLink) == 1)
                    {
                         var myLinkLetter = (myLinks.length == 1) ? "" : String.fromCharCode( myASCII );
                         var myNewLinkName = myPrepend + '_master_' + myPrefix + myLinkLetter + myExtension;
                         var myOldImageHDfile = new File( myLink.filePath );
                         var myRenameResult = myOldImageHDfile.rename( myNewLinkName );
                         if (myRenameResult) {
                              myLink.insertLabel("relinked", "yes");
                              myLink.relink( myOldImageHDfile );
                              try {
                                   myLink.update();
                              }
                              catch(err) {}
                              myASCII++;
                              WriteToFile(((myLinksCounter < 10) ? (" " + myLinksCounter) : myLinksCounter) + " - " + myOldImageHDfile.name + " --> " + myNewLinkName + "\n");
                              myLinksCounter++;
                         }
                         else     {
                              if (new File(myOldImageHDfile.parent + "/" + myNewLinkName + myExtension).exists) {
                                   WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + " to " + myNewLinkName + " because the file already exists\n");
                              }
                              else {
                                   WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + "\n");
                              }
                         }
                    }
                    else
                    {
                         if (!IsObjInArray(myLink, myMultipleLinks)) {
                              myMultipleLinks.push(myLink);
                         }
                    }
               }
          }
     }
     // Multiple images
     if (myMultipleLinks.length > 0) {
          for ( a = myMultipleLinks.length - 1; a >= 0; a-- )
          {
               processMultiUsedLinks(myMultipleLinks);
          }
     }

     WriteToFile("\r--------------------- Script finished -- " + GetDate() + " ---------------------\r\r");
     
     if (myLinksCounter == 0) {
          alert("No links have been renamed", "Rename Links Script");
     }
     if (myLinksCounter == 1) {
          alert("One link has been renamed", "Rename Links Script");
     }
     else if (myLinksCounter > 1) {
          alert(myLinksCounter  + " links have been renamed", "Rename Links Script");
     }

}
//--------------------------------------------- Functions ------------------------------------------------
// Check how many times the link was placed
function LinkUsage(myLink) {
     var myLinksNumber = 0;
          for (var c =  0; c < myDoc.links.length; c++) {
          if (myLink.filePath == myDoc.links.filePath) {
               myLinksNumber += 1;
          }
     }
     return myLinksNumber;
}
//--------------------------------------------------------------------------------------------------------------
// Relink the links placed more than once
function processMultiUsedLinks(myLink) {
     var myExtension = myLink.name.substr(myLink.name.lastIndexOf( "." ));
     var myMultiUsedLink = new Array();
     var myAllLinks = myDoc.links;
     
     for (var d = 0; d < myAllLinks.length; d++)  {
          if (myAllLinks.filePath == myLink.filePath) {
               myMultiUsedLink.push(myAllLinks);
          }
     }
     try {
          myLink.show();
     }
     catch(err) {}
     
     var myNewLinkName = prompt ("Enter a name for this image", GetFileNameOnly(myLink.name), "This image is placed " + myMultiUsedLink .length + " times");
     if (myNewLinkName) {
          if ( myNewLinkName + myExtension != myLink.name ) {
               var myOldImageHDfile = new File( myLink.filePath );
               var myRenameResult = myOldImageHDfile.rename( myNewLinkName + myExtension );
               if (myRenameResult) {
                    myLink.insertLabel("relinked", "yes");
                    myLink.relink( myOldImageHDfile );
                    try {
                         myLink = myLink.update();
                    }
                    catch(err) {}
                    
                    WriteToFile(((myLinksCounter < 10) ? (" " + myLinksCounter) : myLinksCounter) + " - " + myOldImageHDfile.name + " --> " + myNewLinkName + "\n");
                    myLinksCounter++;

                    for (f = myMultiUsedLink.length-1; f >= 0 ; f--)
                    {
                         var myCurrLink = myMultiUsedLink;
                         if ( myNewLinkName + myExtension != myCurrLink.name ) {
                              myCurrLink.insertLabel("relinked", "yes");
                              myCurrLink.relink( myOldImageHDfile );

                              try {
                                   myCurrLink = myLink.update();
                              }
                              catch(err) {}
                         }
                    }
               }
               else     {
                    if (new File(myOldImageHDfile.parent + "/" + myNewLinkName + myExtension).exists) {
                         WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + " to " + myNewLinkName + myExtension + " because the file already exists\n");
                    }
                    else {
                         WriteToFile("CAN'T RENAME LINK -- " + myOldImageHDfile.name + "\n");
                    }
               }
          }
     }
     UpdateAllOutdatedLinks();
}
//--------------------------------------------------------------------------------------------------------------
// Clear labels in case this script has been already run on the current document
function crearLabels() {
     for (var f =  0; f < myDoc.links.length; f++) {
          if (myDoc.links.extractLabel("relinked") != "") {
               myDoc.links.insertLabel("relinked", "");
          }
     }
}
//--------------------------------------------------------------------------------------------------------------
function UpdateAllOutdatedLinks() {
     for(var myCounter = myDoc.links.length-1; myCounter >= 0; myCounter--){
          var myLink = myDoc.links[myCounter];
          if (myLink.status == LinkStatus.linkOutOfDate){
               myLink.update();
          }
     }
}
//--------------------------------------------------------------------------------------------------------------
function pad000(myNumber) {
     if (myNumber >= 1 && myNumber <= 9) {
          x =  "0" + "0" + myNumber;
     } else if (myNumber >= 10 && myNumber <= 99) {
          x = "0" + myNumber;
     } else if (myNumber >= 100 && myNumber <= 999) {
          x = myNumber;
     }
     return x;
}
//--------------------------------------------------------------------------------------------------------------
function GetFileNameOnly(myFileName) {
     var myString = "";
     var myResult = myFileName.lastIndexOf(".");
     if (myResult == -1) {
          myString = myFileName;
     }
     else {
          myString = myFileName.substr(0, myResult);
     }
     return myString;
}
//--------------------------------------------------------------------------------------------------------------
function IsObjInArray(myObj, myArray) {
     for (x in myArray) {
          if (myObj.filePath == myArray.filePath) {
               return true;
          }
     }
     return false;
}
//--------------------------------------------------------------------------------------------------------------
function WriteToFile(myText) {
     myFile = new File("~/Desktop/Rename Links Script.txt");
     if ( myFile.exists ) {
          myFile.open("e");
          myFile.seek(0, 2);
     }
     else {
          myFile.open("w");
     }
     myFile.write(myText);
     myFile.close();
}
//--------------------------------------------------------------------------------------------------------------
function GetDate() {
     var myDate = new Date();
     if ((myDate.getYear() - 100) < 10) {
          var myYear = "0" + new String((myDate.getYear() - 100));
     } else {
          var myYear = new String ((myDate.getYear() - 100));
     }
     var myDateString = (myDate.getMonth() + 1) + "/" + myDate.getDate() + "/" + myYear + " " + myDate.getHours() + ":" + myDate.getMinutes() + ":" + myDate.getSeconds();
     return myDateString;
}
//--------------------------------------------------------------------------------------------------------------

Inspiring
May 17, 2015

Same link on multiple pages in document...Anyone can modify script from post #5, 14 april, to rename only first instance of this link to "prefix_page number" and simply use this link in all other instances?

example:

picture.jpg is on page 1, 2 and 3. I want to be prefix_00(1)a.jpg and to be linked to all other instances.

thanks

Kasyan Servetsky
Brainiac
February 28, 2010

I made a couple of scripts that are quite close to what you want:

http://forums.adobe.com/message/2517344#2517344

http://forums.adobe.com/message/1110103#1110103

If you are interested, please make sure to read the threads before running the scripts.

Kasyan

Adobe Expert
February 26, 2010

Some scripting going on here by Olav Kvern, a scripting master, in my book

http://avondale.typepad.com/indesignupdate/2005/09/renamerelink_sc.html