はじめてのAppleScript

DTPに関わって○○年なのにDTPでは一度もAppleScript書いてなかった。いわゆる食わず嫌いです(笑)。という事で、業務をシンプルにする為にはじめてAppleScriptを書いてみた。内容はMacintosh HDの中に入っているfoobar.epsファイルをデスクトップにコピーして、コピーしたファイルをイラレで開くという簡単なスクリプトです。

tell application "Finder"
set fn to "foobar.eps"
set tgtFile to "Macintosh HD:" & fn
if exists tgtFile then
try
duplicate tgtFile to desktop
on error errMsg
tell application "FileMaker Pro"
activate
display dialog "失敗しました。" & errMsg buttons {"OK"} default button 1
return
end tell
end try
set fn to (desktop as string) & fn
tell application "Adobe Illustrator 9.0.2"
activate
open file fn
display dialog "デスクトップにコピーしたファイルを開きました。" buttons {"OK"}
end tell
else
display dialog "コピー元ファイルがないよ!" buttons {"OK"} default button 1
end if
end tell

tell application "アプリケーション名"

初めてAppleScriptを見たときに目に飛び込んでくるのはこのtell applicationですよね?これはアプリケーションの切り替えと思えば良いですね。Command+Tabをしてる様な感じでしょうか。これは必要に応じて入れ子にすることができます。サンプルのスクリプトではFinderとFilemakerIllustratorを切り替えています。アプリケーション名はアプリケーションフォルダに入っているアプリケーションの名前をコピペでOKです(だよね?汗)。

set fn to "foobar.eps"

変数の設定です。fnという変数にfoobar.epsという文字列をセットしています。取り出し方は変数名だけで取り出せます。(例:set tgtFile to "Macintosh HD:" & fn)

if exists tgtFile then

ここではファイルの有無を調べています。existsがそうです。exists ファイルパスで調べられます。

try〜on error〜end try 例外処理

try〜on errorの間でエラーが起きそうな処理を書き、on error〜end tryの間でエラーが起きた時の処理を書きます。どんなエラーなのか知りたい時は、on errorの後に変数名を書いておけば取り出すことが出来ます。また、エラーが起きたときにエラーの内容で処理を場合分けしたい場合は、on error line numと書いておけばnumにエラー番号は入りますので、if文で場合分けするといいと思います。

duplicate tgtFile to desktop

ファイルの複製です。前もってtgtFile変数にファイルのパスを設定してあります。それをデスクトップにコピーしています。desktopはFinderを使用中の場合、デスクトップのオブジェクトが入っていますが、他のアプリではただの文字列となってしまうので、注意です。

activate

tell中のアプリケーションを前面に表示します。

display dialog

ダイアログを表示します。シンプルに書くと display dialog "メッセージ" となりますが、このままだとOKとキャンセルボタンがデフォルトで出ますので、サンプルはbuttons{"OK"}としてボタンをOKのみにしています。さらにエンターキーでダイアログを閉じる為にdefault button 1としてOKボタンを選択済みにしています。

return

実行中のスクリプトを即終了させます。

ps2pdfのオプション

ps2pdf -dEPSCrop -dPDFA -sProcessColorModel#DeviceCMYK -dPDFSETTINGS#/prepress test.eps

EPSのサイズで作成

dEPSCrop

PDF/A-1Bで出力(PDF/X-1aはどうやんの?)

dPDFA

カラースペース?(CMYKとかRGBとか)

sProcessColorModel#DeviceCMYK

sProcessColorModel#DeviceGray
sProcessColorModel#DeviceCMYK
sProcessColorModel#DeviceRGB (PDF/A及びPDF/Xの場合は出来ないっぽい)

PDFクオリティ?

dPDFSETTINGS#/prepress

/screen selects low-resolution output similar to the Acrobat Distiller "Screen Optimized" setting.
/ebook selects medium-resolution output similar to the Acrobat Distiller "eBook" setting.
/printer selects output similar to the Acrobat Distiller "Print Optimized" setting.
/prepress selects output similar to Acrobat Distiller "Prepress Optimized" setting.
/default selects output intended to be useful across a wide variety of uses, possibly at the expense of a larger output file.

[InDesign JavaScript] Windows版InDesign Serverコマンドプロンプト上の文字化け回避方法

マニュアルにはコマンドプロンプト

indesign server -port 1111
の様な感じでしか書かれていない。
でも、これだけでは起動中、起動後コマンドプロンプト内で文字化けするのです。
これはたぶん日本語WindowsコマンドプロンプトSJISで立ち上がり、InDesign Serverの吐き出すログがUTF8だから文字化けしているのだと思います。
なので、
次の方法で文字化けを回避します。

これです。

chcp 65001

InDesign Serverのテンポラリファイル

InDesign Serverを起動するとテンポラリファイルが出来る。これはどんなアプリケーションでも出来るとは思いますが、InDesign Serverのテンポラリファイルは容量がデカイ。
インスタンス当たり65メガを使う。


例えば10インスタンス起動すると650メガも使うことになる。結構大きい。
最新のInDesign CS5 Serverでは1インスタンスごとに2ギガが必要とある・・・。


最近のHDはテラクラスが出てきているのでServerを購入するときに大きめのHDを選べば解決しますよね。それほど高くないし(SASは高いかな?)


これだけテンポラリファイルが大きいとトラブルも出てくる。滅多にないけど何らかの理由でサーバーがダウンしてしまうとこのテンポラリファイルはゴミ化する。塵も積もれば山となるでHDを圧迫し、InDesign Serverが起動出来なくなってしまうのだ!
いつの間にかHDがパンパンになっていて「なんで?!」「どうして?!」と思っているあなた!テンポラリファイルを消してしまいなさい。


テンポラリファイルのありかはここだよ
C:\Document and Settings\Administrator\Local Settings\Temp

    • -

過去の俺から未来の俺へ

[InDesign JavaScript] ドキュメントが保存されているか?更新されているか?を調べる

[保存されているか?の場合]


if(app.activeDocument.saved == false){
alert("保存されてないよ!");
//保存処理とか
}

[更新されているか?の場合]


if(app.activeDocument.modified == true){
alert("更新されてるよ!");
//保存処理とか
}

[InDesign JavaScript] スクリプトラベルとは

スクリプトラベルとは!
ドキュメント上に置かれているオブジェクトに名前を付けて、各種スクリプトから簡単にオブジェクトを特定することが出来るものです。


例えば、下のようなドキュメントがあるとした場合、氏名の欄に名前を入力したいとします。


//よろしくないやり方
var myFrame = app.activeDocument.pages.item(0).textFrames.item(1);
myFrame.contents = "比嘉 太郎";

上記の様にインデックス値でフレームを選んで名前を入力することも出来ますが、このインデックス値は特定のオブジェクトにいつも同じ数値を維持しているわけではないので、この方法はやめておきましょう!!


そこでスクリプトラベルの登場です。あらかじめテキストフレームに名前が付いていたら、フレーム選択にミスすることが無くなります。ここでテキストフレームを選んでスクリプトラベルに「氏名」と入力します


var myFrame = app.activeDocument.pages.item(0).textFrames.item("氏名");
myFrame.contents = "比嘉 太郎";

どうでしょう?

ちなみにCS5ではスクリプトラベルの扱い方が異なっていて、上記のやり方は出来なくなっている模様です。