Как написать текст в текстовый файл с помощью Photoshop JavaScript? - PullRequest
10 голосов
/ 25 июня 2011

Я взглянул на Руководство по созданию сценариев Photoshop CS5 и Справочник по Photoshop CS5 JavaScript , но не смог найти способ записи текста в простой текстовый файл.Есть ли способ сделать это?

Я хочу записать значение bounds каждого объекта слоя в документе.

Любая подсказка?

Ответы [ 5 ]

14 голосов
/ 24 сентября 2013

Это работает для меня, сохраняет текст с тем же именем, что и исходный документ, но с расширением 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();
}

Я не знаю, как это работает, скрипты в фотошопе - огромный беспорядок, я просто продолжал смешивать несколько скриптов, которые нашел, пока он не работал.

Также, если кому-то это нужно, вот скрипт, который также сохраняет активный документ как 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);
}
6 голосов
/ 25 июня 2011

Доступ к файловой системе документирован в Adobe Руководстве по инструментам JavaScript (PDF) .

Загрузите файл PDF и откройте раздел «Доступ к файловой системе».

4 голосов
/ 28 ноября 2013

Я обнаружил, что в документах не хватает, но придумал это как метод для создания и записи в новый файл в 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();
3 голосов
/ 11 января 2016

Я прочитал документы и объединил лучшие части ответов psycho brm и corrin_m.
МОЙ ОТВЕТ ТАКЖЕ ПРОВЕРЯЕТ ОШИБКИ.

Нет необходимости удалять файл, если он существует, поскольку открывается с помощью "w"перезапишет существующий файл.

/* =======================================================
 * 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 "";
}

Вот как я использую функцию в своих скриптах

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

Кстати, я храню это в отдельном файле, называемом commom-code.jsxи я могу включить его в следующую строку (однострочные комментарии являются преднамеренными).

// @include 'common-code.jsx'     
3 голосов
/ 28 ноября 2013

Вот что вам нужно: это довольно просто.Он зациклится на слоях (без наборов слоев !!) и сохранит имя слоя и границы слоев для каждого слоя.

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();
}
...