毎日モザイク

White Room Layout Works

2019-05-15T23:56:03+09:00 [Wed]

Indesignから文字なし・文字ありのPNGで書き出して、レイヤー状態のPSDファイルでください。

Indesignからフォルダ1に文字非表示のPNG画像を書き出します。
ついで、フォルダ2に文字のみのPNG画像を書き出します。
これを適当な手段で合成して1枚のPSD形式にまとめて納品します。
そういう需要が少しあるようです。

// marge2ImagesIntoPsd.jsx
// Actionに"paste"セットを作って"pasteInto"アクションに
// "特殊ペースト→同じ位置にペースト"を記録
// Indesignで表示・非表示を分けて書き出したファイルを
// 一枚のレイヤー生きPSDファイルに結合する
// 2019.05.14 WhiteRoom

(function main () {

    var fs = folderSelect();
    var re = /.*\.(JPG|jpg|PSD|psd|PNG|png|TIF|tif)$/;
    var layLitems = fs.layerL.getFiles(re);
    var layUitems = fs.layerU.getFiles(re);

    if ((layLitems.length) != (layUitems.length))  {
        confirm("画像ファイルと文字ファイルの数が異なっています。実行しますか?");
    }

    //photoshop start
    for (var i = 0; i < layLitems.length; i++) {

        var fileObjL = new File(layLitems[i]);
        var fileObjU = new File(layUitems[i]);
        var saveLocation = new File(fs.savLoc + "/" + fileObjU.name);
        var psdOpt = new PhotoshopSaveOptions();
        psdOpt.alphaChannels = true;
        psdOpt.annotations = true;
        psdOpt.embedColorProfile = false;
        psdOpt.layers = true;
        psdOpt.spotColors = false;

        open(fileObjL);
        open(fileObjU);

        activeDocument.selection.selectAll();
        activeDocument.activeLayer.copy();
        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
        activeDocument.flatten(); //下段のレイヤーは統合します(個人的な都合)
        doAction("pasteInto","paste"); //同じ位置にペーストは面倒なのでaction
        activeDocument.saveAs(saveLocation, psdOpt, true, Extension.LOWERCASE);
        activeDocument.close(SaveOptions.DONOTSAVECHANGES);
    }
})();

//なんとなく分離してみただけ。この程度はmain()の中に入れたほうがいいかも
function folderSelect() {
    var retItems = new Object();
    retItems.layerL = Folder.selectDialog("画像レイヤーのフォルダを選択してください");
    retItems.layerU = Folder.selectDialog("文字レイヤーのフォルダを選択してください");
    retItems.savLoc = Folder.selectDialog("保存先フォルダを選択してください");
    return retItems;
}

まず定番の.DS_Storeほかファイラのクソファイル避け。
ブラックリスト方式は難しすぎるので(/^[^.].=$/ でも /(?!.).+$/ でも駄目だったので諦め)ホワイトリスト方式で。
次も定番の同じ位置にペーストがJSではできない。
できるっぽいけどかなりめんどくさそうなので、アクションに逃げます。
メニュー項目から同じ位置にペーストを記録したアクションを呼び出すだけでお悩み解決。
※同じinddから同じ設定で書き出した画像を扱うのが前提なので、サイズの不一致とか一切考慮に入れていません。