2009年6月22日月曜日

Illustrator8.0の詰めをCS以降で検出できるか?

イラレ8で使われていた文字の「詰め」機能は、CS以降では使えない。
イラレ8で作られたドキュメントをCSで開くと、「テキストを更新」するかどうかを求められ、テキストを更新しなければ文字の編集はできない。更新すれば詰め情報は飛んでしまい、文字はみっともなく広がってしまう。その部分は手作業で直すしかない。
Scriptを使っても詰めが使われていたかどうかの情報は取れないし、自分でもほぼあきらめていた。

が、要するに「文字が広がってしまう」のが問題の本質であるわけだから、更新前と更新後で文字のサイズを取って比較し、不自然に広がってしまうようなら「詰め」が使われていた、という事で良いのでは?
そう思ってスクリプトを書いてみた。環境はMac、CS3。
function convertLegacyText(doc){

var itemSizeList={};
for(var i=0;i<doc.pageItems.length;i++){
var tItem=doc.pageItems[i];
if(tItem.constructor.name=="TextFrame"){
var name=rundumStr(8);
//レガシーテキストに名前をつける
tItem.name=name;
//名前とwidth,heightの値を保存
itemSizeList[name]=[tItem.width,tItem.height];
};
};

//テキストを更新
doc.legacyTextItems.convertToNative();

//配列を作る
var list=[];
for(var j=0;j<doc.textFrames.length;j++){
var tItem2=doc.textFrames[j];
//縦組ならば
if(tItem2.orientation==TextOrientation.VERTICAL){
if(tItem2.height>itemSizeList[tItem2.name][1]*1.01){
list.push(tItem2);
};
//横組みならば
}else{
if(tItem2.width>itemSizeList[tItem2.name][0]*1.01){
list.push(tItem2);
};
};
};
return list;
};

//ランダムな文字列を作成する
function rundumStr(num) {
var outtxt = "";
var text = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var textSize = text.length;
for(var i = 0; i < num; i ++ ){
outtxt += text[Math.floor(Math.random()*textSize)];
}
return outtxt;
};

var doc=app.activeDocument;
var list=convertLegacyText(doc);
if(list.length>0){
alert(list.length+"個のテキストフレームの詰めが崩れました。")
};

イラレ8で詰めが使われているファイルを開く時「テキストの更新」をせずに開き、上記スクリプトを実行する。
すると、「convertLegacyText」functionの返り値に、サイズの変化が大きかったテキストフレームのリストを返す。
何か処理をかけるならば、このリストのtextFrameに対し順番に処理をかける。

更新前と更新後でテキストフレームを区別する方法がなかったが、name属性が空だったので、ランダムに名前をつけてやることで解決できた。
あとの処理は考え中……。

2009年6月21日日曜日

ExtendScriptでそのオブジェクトに使えるメソッドを表示する

例えば、Illustratorのドキュメントを開いて,以下を実行
var doc=app.activeDocument;

var docMethods=doc.reflect.methods;
for(var i=0;i<docMethods.length;i++){
$.writeln(docMethods[i]);
};

すると、ESTKのコンソールに表示される。
close
save
saveAs
print
exportFile
activate
importVariables
exportVariables
importCharacterStyles
importParagraphStyles
importPrintPreset
exportPrintPreset
importPDFPreset
exportPDFPreset
imageCapture
undefined

2009年6月3日水曜日

今スクリプトをどこから起動しているか調べる

alert(BridgeTalk.appName);

これを保存して、Photoshopの ファイルメニュー → スクリプト から起動すると

ExtendScript Toolkitから起動すると


※6:21追記:この設定、あまり意味ないかも。
app.nameとの違いは、app.nameだと "ExtendScript Toolkit" と返すけれど
BridgeTalk.appNameは "estoolkit" と返します。