PSDファイル内のテキストレイヤーの中身を、テキストファイルに書き出すスクリプトを書いてみました。仕事で時々PSDからテキストを取らなければならない場合があり、なんとか効率出来ないものかということから、実験的に試してみました。
一応書き出すことは出来たのですが、速度面で難があり、ファイルによっては5分~10分かかってしまうこともあるようです。書き出したい物が出てくる度にfile.write()を呼び出す処理を変更しても、あまり変わらない感じがしました。今後の課題です。
参考までに、スクリプトを掲載します。拡張子「.jsx」で保存し、"C:\Program Files\Adobe\Adobe Photoshop CS3\プリセット\スクリプト"あたりに入れると使えます。
- 本スクリプトを使用して何らかの問題が生じた場合も、責任は負いかねますのでご了承ください。
テキストエクスポート スクリプト例
/* テキストエクスポート.jsx
* Skyward Design JavaScript Library for Photoshop
* PSDファイル内のテキストレイヤーの内容を、テキストファイルに書き出します。
*
* Version 1.0.2
* Copyright (C) 2010 Hideki Abe
*/
(function(activeDocument) {
// オプション設定
var options = {
// 改行
linefeed : String.fromCharCode(13),
// セパレート文字列
separator : "------------------------------------------------------",
// 出力レイヤー接頭語
// Version 1.0.2では未使用
targetname : "w_"
};
function main() {
var fileName = File.saveDialog("保存するファイル名を入れてください");
if(fileName) {
// ファイルを作成し、テキストレイヤー書き出し処理へ
var file = new File(fileName);
var openFlag = file.open("w");
if(openFlag) {
// ファイル情報生成
var date = new Date();
var fileInfo = activeDocument.name + options.linefeed + "Generated: " + date +
options.linefeed + options.linefeed + options.linefeed +
"********** Output Start **********" + options.linefeed + options.linefeed;
file.write(fileInfo);
// レイヤー出力
_scanLayer(file, activeDocument);
file.close();
alert("書き出しが完了しました。");
} else {
alert("ファイルが開けませんでした。");
}
} else {
alert("処理を中止します。");
}
}
// レイヤースキャン・書き出し
function _scanLayer(file, target, layerpath) {
// Layersオブジェクト取得
var targetLayers = target.layers;
var nLayer = targetLayers.length;
var path = layerpath || "root";
for(var i = 0; i < nLayer; i++) {
if(targetLayers[i].typename === "LayerSet") {
// レイヤーセットの場合
// レイヤーセット情報を出力後再帰処理
var tmpPath = path + " > " + targetLayers[i].name;
var text = options.separator + options.linefeed +
"Layerset: " + targetLayers[i].name + options.linefeed +
" Path: " + tmpPath + options.linefeed +
options.separator + options.linefeed;
file.write(text);
_scanLayer(file, targetLayers[i], tmpPath);
} else if(targetLayers[i].kind === LayerKind.TEXT) {
// テキストレイヤーの場合
var text = targetLayers[i].textItem.contents;
file.write(text + options.linefeed + options.linefeed);
}
}
file.write(options.linefeed);
}
// Dispatch
main();
})(activeDocument);