|
いつもお世話になっております。 今回は、BridgeTalkの動作で投稿させていただきます。
下記のようなスクリプトで、InDesignからPhotoshopを起動し、 EPSファイルをPNGファイルに変換しています。
#targetengine "eps2png" var bridgeTalkPH = new BridgeTalk(); bridgeTalkPH.target = 'photoshop';
for(var i=0; i<oldFileSplit.length; i++){ bridgeTalkPH.body = uneval(epsChange) + '("' + epsFile[i] + '","' + pngFile[i] + '");'; bridgeTalkPH.send(); }
function epsChange(epsFile, pngFile){ var fileObj = new File(epsFile); epsOpt = new EPSOpenOptions(); epsOpt.antiAlias = true; epsOpt.resolution = 96; epsOpt.constrainProportions = false; epsOpt.mode = OpenDocumentMode.RGB; var theDoc = app.open(fileObj, epsOpt);
var newFile = new File(pngFile); pngOpt = new PNGSaveOptions(); pngOpt.interlaced = false; theDoc.saveAs(newFile, pngOpt , true); theDoc.close(SaveOptions.DONOTSAVECHANGES); }
ところが、jsxファイルをバイナリ化したところ、動作しなくなってしまいました。 いろいろ調べたところ、BridgeTalkで実行する部分(function epsChange()のところ?)をバイナリ化すると動く、という記事をみつけ、 下記のように試行錯誤してみたのですが、動作しません。
var bridgeTalkPH = new BridgeTalk(); bridgeTalkPH.target = 'photoshop';
#targetengine "eps2png" eval("@JSXBIN@ES@2.0@MyBbyBnABMAbyBn0AMJBnASzHjGjJjMjFiPjCjKBAEjzEiGjJjMjFCfRBVzHjFjQjTiGjJjMjFDfDftnftJCnABjzGjFjQjTiPjQjUEfEjzOiFiQiTiPjQjFjOiPjQjUjJjPjOjTFfntnfJDnABXzJjBjOjUjJiBjMjJjBjTGfjEfnctfJEnABXzKjSjFjTjPjMjVjUjJjPjOHfjEfndjAfJFnABXzUjDjPjOjTjUjSjBjJjOiQjSjPjQjPjSjUjJjPjOjTIfjEfncffJGnABXzEjNjPjEjFJfjEfXzDiSiHiCKfjzQiPjQjFjOiEjPjDjVjNjFjOjUiNjPjEjFLfnfJHnASzGjUjIjFiEjPjDMBEXzEjPjQjFjONfjzDjBjQjQOfRCVBfAjEfffnftJJnASzHjOjFjXiGjJjMjFPCEjCfRBVzHjQjOjHiGjJjMjFQfEftnftJKnABjzGjQjOjHiPjQjURfEjzOiQiOiHiTjBjWjFiPjQjUjJjPjOjTSfntnfJLnABXzKjJjOjUjFjSjMjBjDjFjETfjRfncffJMnAEXzGjTjBjWjFiBjTUfVMfBRDVPfCjRfFctffJNnAEXzFjDjMjPjTjFVfVMfBRBXzQiEiPiOiPiUiTiBiWiFiDiIiBiOiHiFiTWfjzLiTjBjWjFiPjQjUjJjPjOjTXfffAFM4B0AiAB40BiAP4C0AiAD40BhAQ4B0AhACDAzJjFjQjTiDjIjBjOjHjFYAO0EzAZByB");
for(var i=0; i<oldFileSplit.length; i++){ bridgeTalkPH.body = uneval(epsChange) + '("' + epsFile[i] + '","' + pngFile[i] + '");'; bridgeTalkPH.send(); }
どうすれば、動作するのでしょうか。 よろしくお願いいたします。
|
No.9917 2020/06/16(Tue) 20:41:59
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
|
Re: バイナリ化したときのBridgeTalk / あるふぁ |
|
|
|
返信ボタンが遠い(笑)
まずは $.writeln(bridgeTalkPH.body) をやってみて、BridgeTalkで何を送ってるのか見てみましょう。 動かない理由がわかるはずです。
|
No.9918 2020/06/17(Wed) 12:06:01
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
|
|
Re: バイナリ化したときのBridgeTalk / masa |
|
|
|
コメントありがとうございます。
すみません、、返信ボタンが押しづらくなってしまって、、
(function epsChange(){[compiled code]})("epsファイル名4623","pngファイル名");
と出てきますね。 [compiled code]と出てくるのが、ダメなのでしょうか。
|
No.9919 2020/06/17(Wed) 12:55:08
Mozilla/5.0 (Linux; Android 10; SHV42) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36
|
|
Re: バイナリ化したときのBridgeTalk / あるふぁ |
|
|
|
そうです、JSXBIN内で定義した関数はunevalしても元のコードにならないというのが動かない原因です。(そんな簡単にJSXBINによる難読化が破られたら困りますもんね)
「BridgeTalkで実行する部分をバイナリ化すると動く」という話は本当で、 たとえば「alert(1)」をバイナリ化したのは"@JSXBIN@ES@2.0@MyBbyBn0ABJAnAEjzFjBjMjFjSjUBfRBFdBff0DzACByB"ですが、これをそのままBridgeTalkのbodyに入れたら動きます。
このやり方は送信先で実行するコード全部がバイナリ化されてる場合は使えますが、今回のように引数として素のコードをくっつけて送らないといけない場合は使えません。 どうしましょう
|
No.9920 2020/06/17(Wed) 14:34:38
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
|
|
Re: バイナリ化したときのBridgeTalk / masa |
|
|
|
BridgeTalkを使わず、executeScript()を使って解決することができました。
var scriptText = ""; var scriptText = scriptText + "epsOpt = new EPSOpenOptions(); "; var scriptText = scriptText + "epsOpt.antiAlias = true; "; var scriptText = scriptText + "epsOpt.resolution = 96; "; var scriptText = scriptText + "epsOpt.constrainProportions = false; "; var scriptText = scriptText + "epsOpt.mode = OpenDocumentMode.RGB; "; var scriptText = scriptText + "pngOpt = new PNGSaveOptions(); "; var scriptText = scriptText + "pngOpt.interlaced = false; ";
for(var i=0; i<oldFileSplit.length; i++){ var scriptText = scriptText + "var epsFile = '" +epsFile[i]+"'; "; var scriptText = scriptText + "var fileObj = new File(epsFile); "; var scriptText = scriptText + "var theDoc = app.open(fileObj, epsOpt); "; var scriptText = scriptText + "var pngFile = '"+pngFile[i]+"'; "; var scriptText = scriptText + "var newFile = new File(pngFile); "; var scriptText = scriptText + "theDoc.saveAs(newFile, pngOpt , true); "; var scriptText = scriptText + "theDoc.close(SaveOptions.DONOTSAVECHANGES); "; } } photoshop.executeScript(scriptText);
本当に助かりました。 ありがとうございました。
|
No.9921 2020/06/18(Thu) 00:00:18
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
|
|
Re: バイナリ化したときのBridgeTalk / あるふぁ |
|
|
|
なるほどそれならそのままバイナリ化しても動きますね。 ただ、BridgeTalkを監視するだけでバイナリ化前の生のコードが見えてしまうので(executeScriptも中身ではBridgeTalkを使っています)、バイナリ化によるコード秘匿効果がちょっと薄れます。 そのくらい気にしない感じでしたら以下は余談なのでスルーしてください。
バイナリのままphotoshopに送るなら、
bridgeTalkPH.body = 'eval("' + epsChangeの宣言部分をJSXBIN化した文字列 + '"); epsChange("' + epsFile[i] + '","' + pngFile[i] + '");';
のようにphotoshop側でevalする手があります。
あるいは下のように複数回に分けてphotoshopに送るという手もあります。
bridgeTalkPH.body = epsChangeの関数定義部分をJSXBIN化した文字列; bridgeTalkPH.send();
for(var i=0; i<oldFileSplit.length; i++){ bridgeTalkPH.body = 'epsChange("' + epsFile[i] + '","' + pngFile[i] + '");'; bridgeTalkPH.send(); }
ただしこのとき「epsChangeの関数定義部分をJSXBIN化した文字列」は、 epsChange=function(...){ ... } という形のコードをバイナリ化したものである必要があります。(宣言なしの変数に代入することで無理やりグローバルな関数にしています。複数に分けて送ったBTは同じスコープで実行されないためです。誰かに怒られそう)
|
No.9924 2020/06/19(Fri) 13:49:48
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
|
|
Re: バイナリ化したときのBridgeTalk / (z-)  |
|
|
|
(もう、なんでそうしたのか、当時のこと覚えてないんですが)過去にリリースしたスクリプトのうち、バイナリ化で提供してあるやつをいくつか開いてみたら、 #targetengine の定義だけは外に出してありました。
#targetengine "hoge" #target fuga
を削除してバイナリ書き出し、 できあがったJSXBINの中身を
#targetengine "hoge" #target fuga eval(" "); に入れる、という方式を採ってます。
このうち、InDesignからPhotoshopに送る関数も(なぜか)バイナリ化を避けていたのは、あるふぁさんのご指摘と合致しますねw 勉強になりました
|
No.9925 2020/06/19(Fri) 14:29:40
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15
|
|