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