skip to Main Content

I’m trying to create a script that will save a JPG from Photoshop in one click. It’ll save in the same directory with the same file name as the original PSD file, just in JPG format. I found a script online that does what I want 90%, with the exception of it opening two dialog boxes – 1st to ask if I want to rename a file, then 2nd dialog box to specify location. Currently I can hit “Enter” twice, and it’ll work, but I much rather not have those two dialog boxes in the first place (so the script will hit “Enter” on those boxes for me, hopefully without even opening those boxes, just under the hood).

Below is the script I have right now. I modified it slightly so it doesn’t save a PSD file like it did originally, just the JPG. Don’t need the Illustrator part so don’t worry about it too much.

    // ***** SaveTo.jsx Version 1.1. *****

    Changelog:

    v.1.1.
        - Fixed a weird issue where saving as jpg causes weird dialog stuff to happen if it's not saved as a copy. This started happening somewhere between PS CC 2017 and PS CC 2018.
        - Variable "pdfProfileAI" now has a failsafe where if the set profile doesn't exist, the first found profile is used instead. So what ever happens the pdf will be saved, but it might be using a wrong profile, but don't worry, the script will tell you if this happened and gives the name of the profile that was used. This failsafe would still fail if someone doesn't have any presets at all, but if that ever happens, he had it coming...
        - Added a new variable "listOfPresetsAI" so that you can easily get a list of preset so you can copy and paste the preset name to "pdfProfileAI";

var newDocPath = "~/Desktop/";
var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
var pdfProfileAI = "CMYK - Swop v2s";
var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.

var o = {};
var appName = app.name;
var pdfPresetNoMatch = false;

// If Photoshop
if ( appName === "Adobe Photoshop" ) {
    o.dialogTitle = "Save As: .jpg";
    o.formats = ['jpg'];
    o.app = 'ps';
}
// If Illustrator
else if ( appName === "Adobe Illustrator" ) {
    o.dialogTitle = "Save As: .ai and .pdf";
    o.formats = ['pdf','ai'];
    o.app = 'ai';
}

function dialog() {

    // Dialog
    var dlg = new Window("dialog");
    dlg.text = o.dialogTitle;

    var panel = dlg.add('panel');
    panel.alignChildren = ['left','center'];
    panel.orientation = 'row';

    var text1 = panel.add('statictext');
    text1.text = 'Filename: ';

    var text2 = panel.add('editText');
    text2.text = app.activeDocument.name.split('.')[0];
    text2.preferredSize = [530,23];
    text2.active = true;

    var button1 = panel.add('button', undefined, undefined, { name: 'cancel'});
    button1.text = "Cancel";

    var button2 = panel.add('button', undefined, undefined, { name: 'ok'});
    button2.text = "Save...";

    button2.onClick = function ( e ) {
        save.init( dlg, text2.text );
    };

    dlg.onShow = function () {
        dlg.location.x = dlg.location.x - dialogOffsetX;
        dlg.location.y = dialogOffsetY;
    }

    dlg.show();

}

var save = {
    init: function( dlg, dialog_filename ) {

        dlg.close();

        var doc = app.activeDocument;

        var doc_path;
        try {
            doc_path = doc.path.toString();
        } catch(e) {
            doc_path = newDocPath;
        }

        var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );

        if ( output_folder != null ) {
            for ( var i = 0; i < o.formats.length; i++ ) {
                var save_options = save[ o.formats[i] ]();

                if ( o.app === 'ps' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
                }
                else if ( o.app === 'ai' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
                }
            }
        }

    },
    ai: function() {

        var ai_options = new IllustratorSaveOptions();
        ai_options.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE;
        return ai_options;

    },
    pdf: function() {

        var pdf_Options = new PDFSaveOptions();
        pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
        return pdf_Options;

    },
    psd: function() {

        var psd_Options = new PhotoshopSaveOptions();
        return psd_Options;

    },
    jpg: function() {

        var jpg_Options = new JPEGSaveOptions();
        jpg_Options.embedColorProfile = true;
        jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
        // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
        jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
        jpg_Options.quality = 11; // 0-12
        return jpg_Options;

    }
};

function checkPresets( list, testPreset ) {

    var pdfPresets = app.PDFPresetsList;

    if ( list === true ) {
        alert( "n" + pdfPresets.join('n') );
    }
    else {
        var preset = null;
        for ( var i = pdfPresets.length; i--; ) {
            if ( pdfPresets[i] === testPreset ) {
                preset = testPreset;
            }
        }
        pdfPresetNoMatch = (preset === null);
        return (pdfPresetNoMatch ? pdfPresets[0] : preset);
    }

}

if ( listOfPresetsAI === true ) {
    checkPresets( true );
}
else if ( app.documents.length > 0 ) {

    dialog();
    if ( pdfPresetNoMatch ) alert( "Couldn't use your PDF preset!!! n Used " + app.PDFPresetsList[0] + " instead." );

}

Any help is much appreciated. I have basic coding skills, but never worked with Photoshop scripting.

Thank you for your time.

Alexey. B

4

Answers


  1. Chosen as BEST ANSWER

    I pasted Grumpy's code, but now getting Error 23: , does not have a value. Line 64 -> },

    Here's the code with the new code pasted in:

    var newDocPath = "~/Desktop/";
    var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
    var pdfProfileAI = "CMYK - Swop v2s";
    var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
    var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.
    
    var o = {};
    var appName = app.name;
    var pdfPresetNoMatch = false;
    
    // If Photoshop
    if ( appName === "Adobe Photoshop" ) {
        o.dialogTitle = "Save As: .jpg";
        o.formats = ['jpg'];
        o.app = 'ps';
    }
    // If Illustrator
    else if ( appName === "Adobe Illustrator" ) {
        o.dialogTitle = "Save As: .ai and .pdf";
        o.formats = ['pdf','ai'];
        o.app = 'ai';
    }
    
    function dialog() {
                var doc = app.activeDocument;
    
                var doc_path;
    
    
    try {
                doc_path = doc.path.toString();
            } catch(e) {
                doc_path = newDocPath;
            }
    
            var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );
    
            if ( output_folder != null ) {
                for ( var i = 0; i < o.formats.length; i++ ) {
                    var save_options = save[ o.formats[i] ]();
    
                    if ( o.app === 'ps' ) {
                        doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
                    }
                    else if ( o.app === 'ai' ) {
                        doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
                    }
                }
            }
    
        },
        ai: function() {
    
            var ai_options = new IllustratorSaveOptions();
            ai_options.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE;
            return ai_options;
    
        },
        pdf: function() {
    
            var pdf_Options = new PDFSaveOptions();
            pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
            return pdf_Options;
    
        },
        psd: function() {
    
            var psd_Options = new PhotoshopSaveOptions();
            return psd_Options;
    
        },
        jpg: function() {
    
            var jpg_Options = new JPEGSaveOptions();
            jpg_Options.embedColorProfile = true;
            jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
            // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
            jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
            jpg_Options.quality = 11; // 0-12
            return jpg_Options;
    
        }
    };
    function checkPresets( list, testPreset ) {
    
        var pdfPresets = app.PDFPresetsList;
    
        if ( list === true ) {
            alert( "n" + pdfPresets.join('n') );
        }
        else {
            var preset = null;
            for ( var i = pdfPresets.length; i--; ) {
                if ( pdfPresets[i] === testPreset ) {
                    preset = testPreset;
                }
            }
            pdfPresetNoMatch = (preset === null);
            return (pdfPresetNoMatch ? pdfPresets[0] : preset);
        }
    
    }
    
    if ( listOfPresetsAI === true ) {
        checkPresets( true );
    }
    else if ( app.documents.length > 0 ) {
    
        dialog();
        if ( pdfPresetNoMatch ) alert( "Couldn't use your PDF preset!!! n Used " + app.PDFPresetsList[0] + " instead." );
    
    }
    

    What am I missing here? it feels like a technical issue I'm not aware of.

    Thanks again!

    Alexey. B


  2. Try this, you might have to tingle a bit more, but it skips the whole dialog part.

    var newDocPath = "~/Desktop/";
    var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
    var pdfProfileAI = "CMYK - Swop v2s";
    var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
    var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.
    
    var o = {};
    var appName = app.name;
    var pdfPresetNoMatch = false;
    
    // If Photoshop
    if ( appName === "Adobe Photoshop" ) {
        dialog('jog');
    }
    // If Illustrator
    else if ( appName === "Adobe Illustrator" ) {
        dialog('pdf');
    }
    
    function dialog(what) {
        var doc = app.activeDocument;
    
        var doc_path;
    
    
        try {
            doc_path = doc.path.toString();
        } catch(e) {
            doc_path = newDocPath;
        }
    
        var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );
    
        if ( output_folder != null ) {
            for ( var i = 0; i < o.formats.length; i++ ) {
                var save_options = save[ o.formats[i] ]();
    
                if ( o.app === 'ps' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
                }
                else if ( o.app === 'ai' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
                }
            }
        }
        if(what=='jpg') {
            var jpg_Options = new JPEGSaveOptions();
            jpg_Options.embedColorProfile = true;
            jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
            // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
            jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
            jpg_Options.quality = 11; // 0-12
            return jpg_Options;
        }
    
        if(what=='pdf'){
            var pdf_Options = new PDFSaveOptions();
            pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
            return pdf_Options;        
        }
    };
    function checkPresets( list, testPreset ) {
    
        var pdfPresets = app.PDFPresetsList;
    
        if ( list === true ) {
            alert( "n" + pdfPresets.join('n') );
        }
        else {
            var preset = null;
            for ( var i = pdfPresets.length; i--; ) {
                if ( pdfPresets[i] === testPreset ) {
                    preset = testPreset;
                }
            }
            pdfPresetNoMatch = (preset === null);
            return (pdfPresetNoMatch ? pdfPresets[0] : preset);
        }
    
    }
    
    if ( listOfPresetsAI === true ) {
        checkPresets( true );
    }
    else if ( app.documents.length > 0 ) {
    
    alert( "Couldn't use your PDF preset!!! n Used " + app.PDFPresetsList[0] + " instead." );
    
    }
    
    Login or Signup to reply.
  3. If you have image magick installed you can simply do a one-liner shell script

    $convert [psd here passed in as argument].psd covert [psdname].jpg

    That should do it.

    Login or Signup to reply.
  4. If you just want to save out as a jpeg (to either a new location) or where the source file was you just need something simple, like this:

    No dialogue interruptions!

    // Switch off any dialog boxes
    displayDialogs = DialogModes.NO; // OFF
    
    //pref pixels
    app.preferences.rulerUnits = Units.PIXELS;
    
    var newDocPath = "~/Desktop/";
    
    // jpeg quality
    var jq = 11;
    
    // call the source document
    var srcDoc = app.activeDocument;
    
    var fileName = app.activeDocument.name;
    // remove the extension (assuming it's .xxx)
    var docName = fileName.substring(0,fileName.length -4);
    
    // uncomment this for placing the jpeg in the source path
    //var filePath = srcDoc.path + "\" + docName + ".jpg";
    
    // save jpeg at the location of newDocPath
    var filePath = newDocPath + "\" + docName + ".jpg";
    
    // Flatten the psd
    flatten_it();
    
    // Save it out as jpeg
    jpegIt(filePath, jq);
    
    // Close it 
    app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    
    // Set Display Dialogs back to normal
    displayDialogs = DialogModes.ALL; // NORMAL
    
    
    
    // function FLATTEN IT ()
    // ----------------------------------------------------------------
    function flatten_it()
    {
      activeDocument.flatten();
    }
    
    
    
    // function JPEG IT (file path + file name, quality)
    // ----------------------------------------------------------------
    function jpegIt(filePath, jpgQuality)
    {
      if(! jpgQuality) jpgQuality = 12;
    
    
      // jpg file options
      var jpgFile = new File(filePath);
      jpgSaveOptions = new JPEGSaveOptions();
      jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
      jpgSaveOptions.embedColorProfile = true;
      jpgSaveOptions.matte = MatteType.NONE;
      jpgSaveOptions.quality = jpgQuality;
    
      activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search