PSDからテキストデータをテキストファイルに書き出すスクリプト

公開

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);