ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

【大幅書き直し!】Illustratorでテキストをアウトラインする

<10.06.03 大幅書き直し!>

2010.6.2開催のDTPBooster 013の質疑応答で「Illustratorでアウトラインをとるスクリプトって書けますか?」という質問があったので、私なりにスクリプト化してみました。

今回はJavaScriptだとしんどいかなーという直感が働いたので、数年ぶりにAppleScriptで書いてみました。

超手探り。

IllustratorのScript自体初めてみたいなもんだしね。

なんとか4時間で形にはなったけど、実用的かどうかは不明w

スクリプトエディタにコピー&ペーストして「ファイル」→「別名で保存...」→「アプリケーション」形式で任意の場所に保存、で使えます。

<仕様>

・最初と最後にダイアログが出ます、OK押せばOK

・ダブルクリックで最前面のファイルを対象に処理、ドキュメントは開いたまま未保存で表示

・Illustratorファイルをアイコンにドラッグ&ドロップで起動、勝手に開いて処理して保存して閉じる

・レイヤーのロックはすべて解除

・テキストオブジェクトのロックはすべて解除

 (パスオブジェクトはロックされたまま、のはず)

・グループ化されたオブジェクト内のテキストフレームも処理

・非表示レイヤーもアウトラインした後、非表示に

まぁ、これが模範解答ってわけじゃ全然ないんだけど、やろうと思えば書けますよー、というデモンストレーションでした。

なにか質問あればコメント残してみてください。

以下スクリプト。

スクリプトエディタにコピー&ペーストして「アプリケーション形式」で適当な名前で保存してください。


--実行型

on run

tell application "Adobe Illustrator"

activate

display dialog "文字をアウトライン化します"

set myDoc to document 1

my creatOutline(myDoc)

display dialog "終了"

end tell

end run

--ドラッグ&ドロップ型

on open thisList

display dialog "文字をアウトライン化して、ドキュメントを上書き保存します"

repeat with k in thisList

tell application "Adobe Illustrator"

activate

open k

set myDoc to document 1

my creatOutline(myDoc)

tell myDoc

close with saving

end tell

end tell

end repeat

tell application "Finder"

activate

display dialog "終了"

end tell

end open

on creatOutline(myDoc)

tell application "Adobe Illustrator"

activate

tell myDoc

--<処理1>レイヤーのロックを外す

--ロックされてるレイヤーを変数に(フィルタ参照形式)

set lockedLayer_list to every layer whose locked is true

--ロックされたレイヤー分繰り返す

repeat with a from 1 to count of lockedLayer_list

set currentLayer to item a of lockedLayer_list --処理用に代入

set locked of currentLayer to false --ロックを外す(Tellしなくてもofで繋げればワンライナーできる)

end repeat

--<処理2>非表示レイヤーを表示

--非表示のレイヤーを変数に(フィルタ参照形式)

set visibleFalseLayer_list to every layer whose visible is false

--ロックされたレイヤー分繰り返す

repeat with a from 1 to count of visibleFalseLayer_list

set currentLayer to item a of visibleFalseLayer_list --処理用に代入

set visible of currentLayer to true --レイヤーを表示状態に(Tellしなくてもofで繋げればワンライナーできる)

end repeat

--<処理3>ロックを外してアウトライン化

--グループ化されてても関係なくテキストフレームの処理ができるみたい

set TexrFrame_list to every text frame --Document内のText Frameをリスト化

repeat with a from 1 to count of TexrFrame_list

set currentFrame to item ((count of TexrFrame_list) - a + 1) of TexrFrame_list --indexの大きい方から逆順で処理

set locked of currentFrame to false --ロックを外す

convert to paths of currentFrame --テキストのアウトライン化

end repeat

--<処理4>非表示レイヤーを非表示に

--非表示のレイヤーを変数に(フィルタ参照形式)

--元々非表示だったレイヤー分繰り返す

repeat with a from 1 to count of visibleFalseLayer_list

set currentLayer to item a of visibleFalseLayer_list --処理用に代入

set visible of currentLayer to false --レイヤーを非表示状態に(Tellしなくてもofで繋げればワンライナーできる)

end repeat

end tell

end tell

end creatOutline