Skip to main content
KatrodiyaDhaval
Known Participant
April 26, 2018
Answered

Count text letters & set font size

  • April 26, 2018
  • 7 replies
  • 4136 views

hi, i am using photoshop variables to import csv file into photoshop.

the csv file contains three type of text lines.
1. 50 letter text line
2. 75 letter text line
3. 100 letter text line

i dont no anything about scripting. so i need help
i want a script that do following things.

for example, if text line contains "50 letters" set font size to "140 px".
if text line contains "75 letters" set font size to "110 px"
if text line contains "100 letters" set font size to "80 px"

This topic has been closed for replies.
Correct answer Chuck Uebele

This should keep the visibility the same:

#target photoshop

var doc = activeDocument;

var txtLayer1 = doc.layers.getByName('Text1');

var txtLayer2 = doc.layers.getByName('Text2');

var txtLayer3 = doc.layers.getByName('Text3');

setSize (txtLayer1)

setSize (txtLayer2)

setSize (txtLayer2)

function setSize(layer){

    var vis = layer.visible

    doc.activeLayer = layer;

    try{

        if(layer.textItem.contents.length<51){layer.textItem.size = 140}

        else if(layer.textItem.contents.length<76){layer.textItem.size = 110}

        else{layer.textItem.size = 80}

        }

    catch(e){}

    layer.visible = vis

    }

7 replies

Chuck Uebele
Community Expert
Community Expert
May 8, 2018

This script will align in both directions.

#target photoshop

var doc = activeDocument;

var txtLayer1 = doc.layers.getByName('Text1');

var txtLayer2 = doc.layers.getByName('Text2');

var txtLayer3 = doc.layers.getByName('Text3');

setSize (txtLayer1)

setSize (txtLayer2)

setSize (txtLayer2)

function setSize(layer){

    var vis = layer.visible

    doc.activeLayer = layer;

    try{

        if(layer.textItem.contents.length<51){

            layer.textItem.size = 140

            layer.textItem.leading = 140   

            alignLayer ();

            }

        else if(layer.textItem.contents.length<76){

            layer.textItem.size = 110

            layer.textItem.leading = 110

            alignLayer ();

            }

        else{

            layer.textItem.size = 80

            layer.textItem.leading = 80

            alignLayer ();

            }

        }

    catch(e){}

    layer.visible = vis

    }

function alignLayer(){

    var idslct = charIDToTypeID( "slct" );

        var desc2 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref1 = new ActionReference();

            var idLyr = charIDToTypeID( "Lyr " );

            ref1.putName( idLyr, "Background" );

        desc2.putReference( idnull, ref1 );

        var idselectionModifier = stringIDToTypeID( "selectionModifier" );

        var idselectionModifierType = stringIDToTypeID( "selectionModifierType" );

        var idaddToSelection = stringIDToTypeID( "addToSelection" );

        desc2.putEnumerated( idselectionModifier, idselectionModifierType, idaddToSelection );

        var idMkVs = charIDToTypeID( "MkVs" );

        desc2.putBoolean( idMkVs, false );

        var idLyrI = charIDToTypeID( "LyrI" );

            var list1 = new ActionList();

            list1.putInteger( 1 );

            list1.putInteger( 2 );

        desc2.putList( idLyrI, list1 );

    executeAction( idslct, desc2, DialogModes.NO );

    var idAlgn = charIDToTypeID( "Algn" );  //Align Horizontally

        var desc4 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref2 = new ActionReference();

            var idLyr = charIDToTypeID( "Lyr " );

            var idOrdn = charIDToTypeID( "Ordn" );

            var idTrgt = charIDToTypeID( "Trgt" );

            ref2.putEnumerated( idLyr, idOrdn, idTrgt );

        desc4.putReference( idnull, ref2 );

        var idUsng = charIDToTypeID( "Usng" );

        var idADSt = charIDToTypeID( "ADSt" );

        var idAdCH = charIDToTypeID( "AdCH" );

        desc4.putEnumerated( idUsng, idADSt, idAdCH );

    executeAction( idAlgn, desc4, DialogModes.NO );

   

    var idAlgn = charIDToTypeID( "Algn" );  //Align Vertically

        var desc3 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref1 = new ActionReference();

            var idLyr = charIDToTypeID( "Lyr " );

            var idOrdn = charIDToTypeID( "Ordn" );

            var idTrgt = charIDToTypeID( "Trgt" );

            ref1.putEnumerated( idLyr, idOrdn, idTrgt );

        desc3.putReference( idnull, ref1 );

        var idUsng = charIDToTypeID( "Usng" );

        var idADSt = charIDToTypeID( "ADSt" );

        var idAdCV = charIDToTypeID( "AdCV" );

        desc3.putEnumerated( idUsng, idADSt, idAdCV );

    executeAction( idAlgn, desc3, DialogModes.NO );   

    }

KatrodiyaDhaval
Known Participant
May 8, 2018

thank you so so much.

Chuck Uebele
Community Expert
Community Expert
May 8, 2018

Do you want it to center both horizontally and vertically? Or just vertically?

Chuck Uebele
Community Expert
Community Expert
May 7, 2018

You can try this:

#target photoshop

var doc = activeDocument;

var txtLayer1 = doc.layers.getByName('Text1');

var txtLayer2 = doc.layers.getByName('Text2');

var txtLayer3 = doc.layers.getByName('Text3');

setSize (txtLayer1)

setSize (txtLayer2)

setSize (txtLayer2)

function setSize(layer){

    var vis = layer.visible

    doc.activeLayer = layer;

    try{

        if(layer.textItem.contents.length<51){

            layer.textItem.size = 140

            layer.textItem.leading = 140   

            alignLayer ();

            }

        else if(layer.textItem.contents.length<76){

            layer.textItem.size = 110

            layer.textItem.leading = 110

            alignLayer ();

            }

        else{

            layer.textItem.size = 80

            layer.textItem.leading = 80

            alignLayer ();

            }

        }

    catch(e){}

    layer.visible = vis

    }

function alignLayer(){

    var idslct = charIDToTypeID( "slct" );

        var desc2 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref1 = new ActionReference();

            var idLyr = charIDToTypeID( "Lyr " );

            ref1.putName( idLyr, "Background" );

        desc2.putReference( idnull, ref1 );

        var idselectionModifier = stringIDToTypeID( "selectionModifier" );

        var idselectionModifierType = stringIDToTypeID( "selectionModifierType" );

        var idaddToSelection = stringIDToTypeID( "addToSelection" );

        desc2.putEnumerated( idselectionModifier, idselectionModifierType, idaddToSelection );

        var idMkVs = charIDToTypeID( "MkVs" );

        desc2.putBoolean( idMkVs, false );

        var idLyrI = charIDToTypeID( "LyrI" );

            var list1 = new ActionList();

            list1.putInteger( 1 );

            list1.putInteger( 2 );

        desc2.putList( idLyrI, list1 );

    executeAction( idslct, desc2, DialogModes.NO );

    var idAlgn = charIDToTypeID( "Algn" );

        var desc4 = new ActionDescriptor();

        var idnull = charIDToTypeID( "null" );

            var ref2 = new ActionReference();

            var idLyr = charIDToTypeID( "Lyr " );

            var idOrdn = charIDToTypeID( "Ordn" );

            var idTrgt = charIDToTypeID( "Trgt" );

            ref2.putEnumerated( idLyr, idOrdn, idTrgt );

        desc4.putReference( idnull, ref2 );

        var idUsng = charIDToTypeID( "Usng" );

        var idADSt = charIDToTypeID( "ADSt" );

        var idAdCH = charIDToTypeID( "AdCH" );

        desc4.putEnumerated( idUsng, idADSt, idAdCH );

    executeAction( idAlgn, desc4, DialogModes.NO );

    }

KatrodiyaDhaval
Known Participant
May 8, 2018

hi, thank you for your response.

your script works very well.

however their is one problem with align.

the script is aligning, Text layer center to the canvas horizontally not vertically.

i mean script is centering textlayer horizontally, but it is not centering textlayer vertically.

thank you ones again for your help

Chuck Uebele
Community Expert
Chuck UebeleCommunity ExpertCorrect answer
Community Expert
April 29, 2018

This should keep the visibility the same:

#target photoshop

var doc = activeDocument;

var txtLayer1 = doc.layers.getByName('Text1');

var txtLayer2 = doc.layers.getByName('Text2');

var txtLayer3 = doc.layers.getByName('Text3');

setSize (txtLayer1)

setSize (txtLayer2)

setSize (txtLayer2)

function setSize(layer){

    var vis = layer.visible

    doc.activeLayer = layer;

    try{

        if(layer.textItem.contents.length<51){layer.textItem.size = 140}

        else if(layer.textItem.contents.length<76){layer.textItem.size = 110}

        else{layer.textItem.size = 80}

        }

    catch(e){}

    layer.visible = vis

    }

KatrodiyaDhaval
Known Participant
April 29, 2018

All problems are solved, thnx you one again.

You made my day, god bless you

Participating Frequently
May 2, 2018

Bonjour

Why the same problem on two forums ?

Here

Chuck Uebele
Community Expert
Community Expert
April 27, 2018

Try this after you import your data sets.

#target photoshop

var doc = activeDocument;

var txtLayer1 = doc.layers.getByName('Text1');

var txtLayer2 = doc.layers.getByName('Text2');

var txtLayer3 = doc.layers.getByName('Text3');

setSize (txtLayer1)

setSize (txtLayer2)

setSize (txtLayer2)

function setSize(layer){

    doc.activeLayer = layer;

    try{

        if(layer.textItem.contents.length<51){layer.textItem.size = 140}

        else if(layer.textItem.contents.length<76){layer.textItem.size = 110}

        else{layer.textItem.size = 80}

        }

    catch(e){}

    }

KatrodiyaDhaval
Known Participant
April 29, 2018

Thank you so much, your code work perfectly.

However their is one problem

When i export files via "Data sets as files", it creates 200+ files

Each file will have 1 active text layer & 2 hidden text layers.

For example, the 3rd dataset file have

Text1 & Text2 layer are hidden &

Text3 layer is visible

This script working fine but it is making all three layers visible

Chuck Uebele
Community Expert
Community Expert
April 27, 2018

You need to import your cvs file into a string variable and break it into lines using the split command:

var doc = activeDocument;

var cvsLines = myCVSstring.split('\n');

for(var i=0;i<cvsLines.length;i++){

     //put code here to make a text layer

     var txtLayer = doc.activeLayer;//need code to create this text layer.

     if(cvsLines.length<60){txtLayer.size = 140}

     else if(cvsLines.length<85){txtLayer.size = 110}

     else{txtLayer.size = 80}

     }

KatrodiyaDhaval
Known Participant
April 27, 2018

thank you for a script sir,

i have save your code as jsx file.

but when i load your script, it gives me following error

one again, thanks for your help

Chuck Uebele
Community Expert
Community Expert
April 27, 2018

My code is incomplete. It just shows how to split the text in a CVS string into lines and get their length, and then apply a size to an existing text layer. You still need to write the code to open the cvs file, and put its contents into a string. You also need to write the code to create the text layers, if they don't already exist.

Will have to look at your files later, when I'm at my computer.

JJMack
Community Expert
Community Expert
April 26, 2018

You give no information about the Photoshop document. Canvas size pixel wide pixel high print resolution, Text also has a font  all are not the same size  characters vary in size in some and are fixed size in other.  Text is very complex.  Fully expand some actions that add text and look at the expended text steps. 

JJMack
KatrodiyaDhaval
Known Participant
April 27, 2018

i have excel file

& i  am using photoshop variables feature to import this data.

I am using variables visibility feature to switch between this three layer

I am exporting this files via "Data sets as files" feature, which creates 200+ psd files.

i want a script that do following things.

for example, if  contains "25 to 50 letters" set font size to "140 px".
if  contains "51 to 75 letters" set font size to "110 px"
if contains "76 to 100 letters" set font size to "80 px"

then i will create an action like this one.

& apply them to all 200+ psd files via batch function.