简体   繁体   中英

Editing Content of a Text Layer in Photoshop Using Javascript

I am trying to write a script to edit the content of a Text Layer in Photoshop CS6. Is that possible?

I have about 2000 images that I need to process for a work project. First I am adding the filename of each image as a text layer in Photoshop using a javascript I already have (see below). A sample filename is "UCMC_0018015 D FSH E." My script successfully adds this filename to the image as a text layer in Photoshop.

However, I would then like to edit the text layer in order to replace the underscore with a space, and removing " FSH E" from the end of the text string (all file names have these elements, but the numbers in the file name varies from file to file). Can anyone help me with the script I need to do this? I am new to writing and running scripts, but I am doing my best to learn on the job. Any advice you can give me would be appreciated.

Here is my current script for adding the filename to the image. I am not sure if I can edit it or if I will need to write a new script to edit the text layer. Thank you for your help!

//Check if a document is open
if ( documents.length > 0 )
{
var originalRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PERCENT;

try
{
    var docRef = activeDocument;

    // Create a text layer at the front

    var myLayerRef = docRef.artLayers.add();
    myLayerRef.kind = LayerKind.TEXT;
    myLayerRef.name = "Filename";
    var myTextRef = myLayerRef.textItem;

    //Set your parameters below this line

    //If you wish to show the file extension, change the n to y in the line below, if not use n.
    var ShowExtension = "n";
    // Insert any text to appear before the filename, such as your name and copyright info     between the quotes. 
    //If you do not want extra text, delete between the quotes (but leave the quotes in).
    var TextBefore = "";

    // Insert any text to appear after the filename between the quotes. 
    //If you do not want extra text, delete between the quotes (but leave the quotes in).
    var TextAfter = "";

    // Set font size in Points
    myTextRef.size = 30;

    //Set font - use GetFontName.js to get exact name
    myTextRef.font = "Times New Roman";

    //Set text colour in RGB values
    var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 0;
myTextRef.color = newColor;

    // Set the position of the text - percentages from left first, then from top.
    myTextRef.position = new Array( 75, 98);

    // Set the Blend Mode of the Text Layer. The name must be in CAPITALS - ie change NORMAL to DIFFERENCE.
    myLayerRef.blendMode = BlendMode.NORMAL;

    // select opacity in percentage
    myLayerRef.opacity = 100;

// The following code strips the extension and writes tha text layer. fname = file name only            

di=(docRef.name).indexOf(".");      
fname = (docRef.name).substr(0, di);
//use extension if set
if ( ShowExtension == "y" )
{
fname = docRef.name
}  


    myTextRef.contents = TextBefore + "  " + fname +  "  " + TextAfter;


}
catch( e )
{
    // An error occurred. Restore ruler units, then propagate the error back
    // to the user
    preferences.rulerUnits = originalRulerUnits;
    throw e;
}

// Everything went Ok. Restore ruler units
preferences.rulerUnits = originalRulerUnits;
}
else
{
alert( "You must have a document open to add the filename!" );
}

You can use a regular expression to remove all the whitespace and replace them with underscores. As far as I understand you can do a literal replace for " FSH E" to an empty string first. If those letters are different then you'll have to use a different tactic. But this will work for now. This is the basic part of the code that you need.

var myFileName = "UCMC_0018015 D FSH E";

// remove " FSH E" 
myFileName = myFileName.replace(" FSH E", "");

// replace whitespce with underscores
myFileName = myFileName.replace(/\s/gi, "_");

alert(myFileName);

Your final code should look like this

//Check if a document is open
if ( documents.length > 0 )
{
var originalRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PERCENT;

try
{
    var docRef = activeDocument;

    // Create a text layer at the front

    var myLayerRef = docRef.artLayers.add();
    myLayerRef.kind = LayerKind.TEXT;
    myLayerRef.name = "Filename";
    var myTextRef = myLayerRef.textItem;

    //Set your parameters below this line

    //If you wish to show the file extension, change the n to y in the line below, if not use n.
    var ShowExtension = false;
    // Insert any text to appear before the filename, such as your name and copyright info     between the quotes. 
    //If you do not want extra text, delete between the quotes (but leave the quotes in).
    var TextBefore = "";

    // Insert any text to appear after the filename between the quotes. 
    //If you do not want extra text, delete between the quotes (but leave the quotes in).
    var TextAfter = "";

    // Set font size in Points
    myTextRef.size = 30;

    //Set font - use GetFontName.js to get exact name
    myTextRef.font = "Times New Roman";

    //Set text colour in RGB values
    var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 0;
myTextRef.color = newColor;

    // Set the position of the text - percentages from left first, then from top.
    myTextRef.position = new Array( 75, 98);

    // Set the Blend Mode of the Text Layer. The name must be in CAPITALS - ie change NORMAL to DIFFERENCE.
    myLayerRef.blendMode = BlendMode.NORMAL;

    // select opacity in percentage
    myLayerRef.opacity = 100;

// The following code strips the extension and writes tha text layer. fname = file name only            

var fname = docRef.name;

// code changes here.
// remove " FSH E" 
fname = fname.replace(" FSH E", "");

// replace whitespaces with underscores
fname = fname.replace(/\s/gi, "_");

//use extension if set
if ( ShowExtension == true )
{
    di =(fname).lastIndexOf(".");      
    fname = (fname).substr(0, di);
}  

    myTextRef.contents = TextBefore + "  " + fname +  "  " + TextAfter;


}
catch( e )
{
    // An error occurred. Restore ruler units, then propagate the error back
    // to the user
    preferences.rulerUnits = originalRulerUnits;
    throw e;
}

// Everything went Ok. Restore ruler units
preferences.rulerUnits = originalRulerUnits;
}
else
{
alert( "You must have a document open to add the filename!" );
}
  • As your new to JavasScript, I'd like to point out that you have the showextension variable as a string. It's probably easier for it to be a Boolean. So it can only ever be TRUE or FALSE. A string could be, well... anything.
  • Another point is you had indexOf to find the extension. which will work fine. Unless you have a filename such as "my.lovely.photo.jpg"; whereas your extension would be "lovely.photo.jpg" Using lastIndexOf, as you might guess, finds the index of the item near the end of the string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM