毎日モザイク

White Room Layout Works

Archive for the ‘無芸DTPツール’ Category

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から同じ設定で書き出した画像を扱うのが前提なので、サイズの不一致とか一切考慮に入れていません。

2015-08-07T12:15:48+09:00 [Fri]

Indesign CC2015

Indesign CC2015でテキスト変数を使うと、変更したテキストが反映されない。

再現手順

  1. テキスト変数を作成。ランニングヘッド・柱・段落スタイル
  2. 流し込むと、テキスト変数が反映される。
  3. テキスト変数の対象の箇所の内容を変更する。
  4. 変更が反映されない。

対処

マスターページに配置したテキスト変数を一旦削除して、入れ直す。

感想

テキスト変数は1箇所変えれば全部変わるつもりでやってるので非常に危険。

リドローしないと更新されないこともあり、それと混同すると超危険。

2015-07-24T12:57:11+09:00 [Fri]

思いついた

検索部分はIndesignの検索機能を使って、tr部分だけ作れば済みそう。

2015-07-24T12:47:18+09:00 [Fri]

意外と面倒くさい

これはいまのままだと、選択テキストフレームだけの処理になる。

連結されてたらstory全部にするとかも付けないと、とか不備だらけw

やることを書いておこう。

  • 連結されてたらstory全部。複数選択されたら同じstoryかどうかもかくにん。
  • このままだと表を壊してしまうので、表があったら逃げるか表も何とかするか。
  • 選択したテキストだけ処理したい。

先に処理しとけば簡単だし、普段はそうやってますが、数字の仕様がコロコロ変わることがあるので何とか後処理を作りたい。

だらだら頑張ろう。

2015-07-23T22:03:09+09:00 [Thu]

indesign 数字のみ文字種変換

全ての数字を全角にして、指定桁数の数字を半角に(0桁なら全角で統一)

全ての数字を半角にして、指定桁数の数字を全角に(0桁なら半角で統一)

選択したテキストフレームが対象。

途中。

次は選択範囲のテキストだけとかも付けたい。


//replace_digit.jsx
    
    main();
    
    function main(){
        app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
        var myObjectList = new Array;
        if (app.documents.length !== 0){
            if (app.selection.length !== 0){
                for(myCounter = 0, myLength = app.selection.length; myCounter < myLength; myCounter++){
                    switch (app.selection[myCounter].constructor.name){
                        case "TextFrame":
                            myObjectList.push(app.selection[myCounter]);
                            break;
                        default:
                            break;
                    }
                }
                if (myObjectList.length !== 0){
                    myDisplayDialog(myObjectList);
                } else {
                    alert ("Please select a text frame and try again.");
                }
            } else {
                alert ("Please select an object and try again.");
            }
        } else {
            alert ("Please open a document, select an object, and try again.");
        }
    }
    
    function myDisplayDialog(myObjectList){
        var myStringList = ["0","1","2","3","4","5"]; //桁数選択ドロップダウンリスト
        myDialog = app.dialogs.add({name:"DigitRplace"});
        with(myDialog){
            with(dialogColumns.add()){
                with(borderPanels.add()){
                    var myDirectionButtons = radiobuttonGroups.add();
                    with(myDirectionButtons){
                        radiobuttonControls.add({staticLabel:"全てを全角にして指定桁数を半角にする", checkedState:true});
                        radiobuttonControls.add({staticLabel:"全てを半角にして指定桁数を全角にする"});
                    }
                }
                with(borderPanels.add()){
                    with (dialogColumns.add()){
                        staticTexts.add({staticLabel:"変更する:"});
                    }
                    with (dialogColumns.add()){
                        with (dialogRows.add()){
                            with (dialogColumns.add()){
                                staticTexts.add({staticLabel:"桁数:", minWidth:0});
                            }
                            with (dialogColumns.add()){
                                var myDigitDropdown = dropdowns.add({stringList:myStringList, selectedIndex:0});
                            }
                        }
                    }
                }
            }
        }
        var myReturn = myDialog.show();
    
        if (myReturn === true){
            var myDirectionType = myDirectionButtons.selectedButton;
            var myDigit = myStringList[myDigitDropdown.selectedIndex];
            myDialog.destroy();
            for(myCounter = 0, myLength = myObjectList.length; myCounter < myLength; myCounter++){
                myChangeCorners(myObjectList[myCounter], myDirectionType, myDigit);
            }
        } else {
            myDialog.destroy();
        }
    }
    
    function myChangeCorners(myObject, myDirectionType, myDigit){
        var zh       = myDirectionType;
        var kumi     = myDigit;
        var zen_list = '0123456789';
        var han_list = '0123456789';
        var zen_han  = {};
        var uni_fie  = {};
        var hl       = han_list.length;
        var regexUni, regexRep;
        if(zh === 0){
            regexUni = /[0-9]/g;
            regexRep = new RegExp("([^0-9])([0-9]{" + kumi + "})(?![0-9])","g");
            for(i = 0; i < hl; i++){
                zen_han[zen_list[i]] = han_list[i];
                uni_fie[han_list[i]] = zen_list[i];
            }
        } else {
            regexUni = /[0-9]/g;
            regexRep = new RegExp("([^0-9])([0-9]{" + kumi + "})(?![0-9])","g");
            for(i = 0; i < hl; i++){
                zen_han[han_list[i]] = zen_list[i];
                uni_fie[zen_list[i]] = han_list[i];
            }
        }
        var txt      = myObject.contents;
        var unified  = txt.replace(regexUni, function(){
            return(uni_fie[arguments[0]]);});
        var result   = unified.replace(regexRep, function(){
            var replist = arguments[2].split('');
            var stx     = arguments[1];
            for(i = 0, rpl = replist.length; i < rpl; i++){
                stx    += zen_han[replist[i]];
            }
            return(stx);});
        myObject.contents = result;
    }