How to write text to a text file by Photoshop JavaScript?

拟墨画扇 提交于 2019-12-03 06:02:16
nobody

File system access is documented in Adobe's JavaScript Tools Guide (PDF).

Download the PDF file and check out the "File System Access" section.

This works for me, saves text with the same name as original document, but with extension txt:

function saveTxt(txt)
{
    var Name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
    var Ext = decodeURI(app.activeDocument.name).replace(/^.*\./,'');
    if (Ext.toLowerCase() != 'psd')
        return;

    var Path = app.activeDocument.path;
    var saveFile = File(Path + "/" + Name +".txt");

    if(saveFile.exists)
        saveFile.remove();

    saveFile.encoding = "UTF8";
    saveFile.open("e", "TEXT", "????");
    saveFile.writeln(txt);
    saveFile.close();
}

I don't know how it works, photoshop scripting is a huge mess, I just kept mixing together a few scripts that I found until it worked.

Also, if anyone needs this, here is a script that also saves active document as png image:

function savePng()
{
    var Name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
    var Ext = decodeURI(app.activeDocument.name).replace(/^.*\./,'');
    if (Ext.toLowerCase() != 'psd')
        return;

    var Path = app.activeDocument.path;
    var saveFile = File(Path + "/" + Name +".png");

    if(saveFile.exists)
        saveFile.remove();

    var o = new ExportOptionsSaveForWeb();
        o.format = SaveDocumentType.PNG;
        o.PNG8 = false;
        o.transparency = true;
        o.interlaced = false;
        o.includeProfile = false;
    activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, o);
}

I found the docs lacking but came up with this as a method to create and write to a new file in CS6:

var s = "My string data here";
var file = new File();
var fileNew = file.saveDlg("Save new file");
fileNew.open("w");
fileNew.write(s);
fileNew.close();

Here's what you need: It's pretty basic. It'll loop over the layers (no layersets!!) and save out the layer name and the layer bounds for each layer.

app.preferences.rulerUnits = Units.PIXELS;
var srcDoc = app.activeDocument;
var numOfLayers = srcDoc.layers.length;
var results = "";
var fileName = srcDoc.name;
var docName = fileName.substring(0,fileName.length -4)
var theFile = srcDoc.path + "/" + docName + ".txt";

for (var i = 0; i < numOfLayers  ; i++)
{
  var theLayer = srcDoc.layers[i];
  var lb = getLayerBounds(theLayer).toString();
  results += theLayer.name + ": " + lb + "\n";
}

writeTextFile(theFile, results)
alert(results);

function getLayerBounds(alayer)
{
  var x1 = parseFloat(alayer.bounds[0])
  var y1 = parseFloat(alayer.bounds[1])
  var x2 = parseFloat(alayer.bounds[2])
  var y2 = parseFloat(alayer.bounds[3])
  return [x1,y1,x2,y2]
}

function writeTextFile(afilename, output)
{
  var txtFile = new File(afilename);
  txtFile.open("w"); //
  txtFile.writeln(output);
  txtFile.close();
}

I have read the docs and combined best parts of psycho brm's and corrin_m's answer.
MY ANSWER ALSO CHECKS FOR ERRORS.

It is not necessary to delete file if it exists because opening with "w" will overwrite existing file it.

/* =======================================================
 * Saves file as text. Overwrites old file if exists.
 * Returns empty string if no errors, otherwise error message.
 * =======================================================*/
function saveAsTextFile(filePath, content) {
    var saveFile = new File(filePath);

    saveFile.encoding = "UTF8";
    saveFile.open("w");
    if (saveFile.error != "")
        return saveFile.error;

    saveFile.write(content);
    if (saveFile.error != "")
        return saveFile.error;

    saveFile.close();
    if (saveFile.error != "")
        return saveFile.error;

    return "";
}

This is how I am using the function in my scripts

error = saveAsTextFile(filePath, content);
if (error === "") {
  alert(filePath + " saved OK.");
}
else {
  alert("Error saving " + filePath + "\n" + error);
}

BTW I am keeping this in separate file called commom-code.jsx and I can include it with following line (single line comments are intentional).

// @include 'common-code.jsx'     
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!