読者です 読者をやめる 読者になる 読者になる

ごんれのラボ

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

Illustratorを開かずに配置ファイルを収集する

Illustrator使いの方ならご存知じかと思いますが、「CollectForOutput.scpt」というIllustratorに配置された画像を収集するAppleScriptをAdobeさんがサンプルスクリプトとして提供しています。

といいつつ、私が知ったのはDTPの勉強会に参加してからなんだけど。

あ、私の環境ではCS4しかないので、それを前提に話しますので、あしからず。

この「CollectForOutput.scpt」は配布されている状態では1つのIllusratorファイルしか収集できず、自分でダイアログから処理したいファイルを選択してあげる必要があります。

AppleScriptで書かれているならドロップレットにしたいよね、とすんなりいけばいいんですが、そうは問屋がおろしてくれず。

10.6環境ではIllustratorCS4のドロップレット形式のAppleScriptはエラーがでるんですよ。

その辺りは手前味噌ですが[Illustrator][AppleScript]テキストのアウトラインを参照してください。

そして私の自宅の環境はまさしく10.6+IllustratorCS4…。

Adobeェ…。

そんなわけでCollectForOutput.scptを書き直してみようという気は起きなくなっていました。

もともと他人が書いたものですからそれをちょっとだけ直すのもつまらないなーと思って。

仕事で使うならまだしも自習ですからねぇ。

しかし「XMPから取得する方法もあるみたいだよ」とTwitterで@noriaki72さんから情報をいただいてしまった。

途端に気になりだしてしまって一昨日調べてみた。

そもそもXMPってなんぞ?という話。

IllustratorやInDesignのファイル情報のところでそんなロゴマーク見たことあるなーぐらいの認識しかない。

そんなときこそGoogle先生にお願いですよ。

「Illustrator XMP」で検索、と。

参考にしたのはAdobe Illustrator CS4 * メタデータについてあかつき@おばなのDTP稼業録 【Adobe Bridge】Illustratorドキュメントの内部情報を覗く

あかつきさん、公式よりも上位に表示されるとはさすがですな。

この辺りを読んでXMPはメタデータということがわかった。

いや、まぁ前から知ってたけど再確認できた。

んで、XMPはアプリケーションから参照できる、と。

試しに新規ドキュメントに適当な画像を配置して、「ファイル情報」→「詳細」→「XMPメディア管理プロパティ」→「xmpMM:Manifest」を見てみると、ちゃんと配置した画像の情報が載っていた。

ふむふむ、フルパスを含まれているのね。

じゃあ、このフルパスを抽出できれば配置画像が収集できるんじゃない?

そんな夢を持った私は早速AIファイルをJeditにドロップ(AIファイルとかEPSファイルってテキストとして開けるのって常識ですよね?)。

内容をざっと斜め読みしてみるとちゃんとXMP情報が記載されている。

これならRubyで抽出できるよね!

ということで、まず書いたのが下記Ruby。

いや、正規表現で検索できればRubyじゃなくてもいいんだけどね。

Ruby使いたいんだもん。

--2012.01.13追記

HTMLエスケープされていた文字をアンエスケープするように変更しました

@kamise さん、ご指摘ありがとうございました

--追記終わり

#! ruby -Ku

require "CGI"

linkFilePath = "" ; #リンクファイルのパスの入れ物

while line = ARGF.gets

line = CGI.unescapeHTML(line)#HTMLエスケープされてるのでアンエスケープ

if /^\s+?/ =~ line

line.gsub!(/^\s+?(.+?)<\/stRef:filePath>/){$1}#XMPのリンク画像のタグの中からファイルパスを取得

#line.gsub!(/^\/Volumes(.+?)/){$1}#ファイルパスから/Volumes/を削除

if linkFilePath != "" then

linkFilePath = linkFilePath + "\t" + line.chomp

else

linkFilePath = line.chomp

end

end

end

puts linkFilePath

このRubyをターミナルから実行してあげると、配置ファイルのフルパスをタブ区切りで抽出することができます。

毎回思うがこれでRuby使ってますと言っていいのか、私…。

次にこのRubyをAppleScriptにバンドルさせて、AppleScriptからシェルスクリプトを走らせるようにします。

これも恒例になってきたな。

この辺りは市川せうぞーさんのAppleScriptを参考にしています。

お世話になりっぱなしだ。

で、AppleScriptに配置ファイルのフルパスを受け渡すことができたので、次はそのファイルをどこかに複製させればいいよね。

ということで他で使った「処理を始めた西暦日時のフォルダをデスクトップに作成して、そこに複製させる」処理を一部加工して流用した。

このとき同名ファイルがあると面倒なので上書き保存することにした。

そうそう、XMP情報の配置ファイルのフルパスが正しいものとは限らないってことをお忘れなく。

このパスは絶対パスで記憶されているんだけど、例えばIllustratorファイルや配置ファイルを別のフォルダに移したとして、そのままの状態ではXMP情報の配置ファイルのフルパスは古いままなんだ。

だから移動させた場合は必ずIllustratorファイルを開いて保存してあげないと、XMP情報は更新されない。

そして更新されないと収集できないので要注意。

EPS保存した際に埋め込まれちゃったPSDファイルなどのフルパスも残ったままなので注意して。

埋め込まれたファイルはパスが通ってれば収集されるはず。

一応収集できなかったときはデスクトップにエラーログを書き出すようにしておいた。

そうそう、IllustratorCS2にもXMP情報はあるんだけど配置ファイルについてのタグは用意されてないんだよね。

だからIllustratorファイルの作成バージョンを取得してCS2以下だったらスキップさせる処理も書いた。

あ、Illustratorファイルも配置ファイルと同じフォルダに複製されるようにしたよ。

「CollectForOutput」は別名保存するようになっているけど、10.6+IllustratorCS4ではそれがエラーになるし、正直別名保存する意味も感じられなかったので、複製しただけ。

紆余曲折した結果、できたのが下記AppleScript。

(*

2012.01.12 初版公開

2012.01.13 修正版公開

 HTMLエスケープされていた文字をアンエスケープされるように変更

*)on open thisList

tell application "Finder"

set dPath to desktop as text --デスクトップのパス取得

set noExtractFileList to "" --エラーが出たリンクファイルのパスを入れる箱

set textFile to dPath & "収集できなかったリンクファイル.txt" --ログ書き出し 用のテキストファイルの名前

set errorFileLog to "" --エラーが出たファイルのパスを入れる箱

set skipFile to 0 --CS2以下のファイルのカウント用

set my_script_name to "IllustratorPackage.rb"

set my_script_path to (path to me) as Unicode text

set my_script to my_script_path & "Contents:Resources:" & my_script_name

set my_script to quoted form of POSIX path of my_script

repeat with k in thisList

--ドロップされたIllustratorファイルのバージョンチェック処理

my verCheck(k)

if result > 12 then --CS3以上なら

set input_file to (quoted form of POSIX path of contents of k) as Unicode text --Unicode textに変換しないとダメ

do shell script "ruby " & my_script & " " & input_file --リンクファイルのパスをRubyで取得

set outputList to result --変数に代入

set linkFileList to my linkFileExtract(outputList) --リストにする

--デスクトップにフォルダを作成しリンクファイルをコピーする処理へ

set resultList to my LinkFilePackage(linkFileList, noExtractFileList)

duplicate k to item 1 of resultList --デスクトップのbackFolに複製する

if (item 2 of resultList) is not "" then

set errorFilePath to k as string

set errorFile to my pathEtract(errorFilePath)

set errorFileLog to errorFileLog & "★" & errorFile & "で収集できなかったリンクファイル" & return & (item 2 of resultList) & return

end if

delay (0.5) --同名フォルダ作成のエラーを回避するため1秒待つ

else --CS2以下だったら

display dialog "CS2以下のファイルはスキップします"

set skipFile to skipFile + 1

end if

end repeat

--エラーログの書き出し

if errorFileLog is not "" then

try

set OutPutText to open for access textFile with write permission

set eof OutPutText to 0

write "ここに書き出されたファイルは収集できませんでした。Illsutratorデータのリンク情報が正しくない可能性があります。Illustratorデータを再保存した後、再度スクリプトを使用してください。" & return & return to OutPutText

write errorFileLog to OutPutText

close access OutPutText

on error errMsg

display dialog errMsg

close access OutPutText

end try

end if

end tell

if ((count thisList) - skipFile) > 0 then

display dialog ((count thisList) as string) & "ファイル中の" & (((count thisList) - skipFile) as string) & "ファイルを収集しました"

else

display dialog "収集されませんでした"

end if

end open

--デスクトップにフォルダを作成しリンクファイルをコピーする処理

to LinkFilePackage(linkFileList, noExtractFileList)

tell application "Finder"

--バックアップファイルのコピー用にデスクトップに現在時刻名のフォルダを作成する

set dPath to desktop as text --デスクトップのパス取得

set folName to (do shell script "date '+%Y-%m-%d %H-%M-%S'") --現在時刻取得

set backFol to make new folder at dPath with properties {name:folName} --デスクトップにフォルダ作成

set label index of backFol to 2 --ラベルを付ける

repeat with i from 1 to count linkFileList

try

set linkFilePath to (item i of linkFileList) as POSIX file --as POSIX fileで:区切りのパスに戻せる

set linkFilePath to file linkFilePath --file ~ってしないとダメ(ファイル参照させないとダメ)

duplicate linkFilePath to backFol with replacing --デスクトップのbackFolに複製する(同名ファイルは上書き)

on error --複製できなかったファイルの処理

set errorLinkName to my pathEtract(linkFilePath) --ファイル名をサブルーチンで取得

set noExtractFileList to noExtractFileList & (errorLinkName as string) & return --ログ用に代入する

end try

end repeat

return {backFol, noExtractFileList} --メインルーチンにListで戻す

end tell

end LinkFilePackage

--タブ区切りテキストをリストにする

to linkFileExtract(outputList)

set OriginalDelimiters to AppleScript's text item delimiters

set AppleScript's text item delimiters to tab

set listitems to text items of outputList

set AppleScript's text item delimiters to OriginalDelimiters

return listitems

end linkFileExtract

--フルパスをいじってファイル名を取り出す処理

to pathEtract(errorFileName)

set errorFileName to errorFileName as string

set OriginalDelimiters to AppleScript's text item delimiters

set AppleScript's text item delimiters to ":"

set pathitems to text items of errorFileName

set AppleScript's text item delimiters to OriginalDelimiters

--pathitemsにリストで代入されているからあとはご自由に

return last item of pathitems --last itemはファイル名

end pathEtract

--ドロップされたIllustratorファイルのバージョンチェック処理

to verCheck(checkFile)

tell application "Finder"

set fileVer to version of checkFile --"保存: v.12 作成: v.12.0.1"や"保存 v.14 作成 v.14.0.0"を取得

--半角スペースで分割

set OriginalDelimiters to AppleScript's text item delimiters

set AppleScript's text item delimiters to " "

set fileVerlist to text items of fileVer

set AppleScript's text item delimiters to OriginalDelimiters

--CS2とCS3以降で取得できるバージョン情報が違ってる!

if (count fileVerlist) is 4 then --CS2

set verNo to (characters 3 thru 4 of (item 2 of fileVerlist)) as string

set verNo to verNo as number

else if (count fileVerlist) is 6 then --CS3以上

set verNo to (characters 3 thru 4 of (item 3 of fileVerlist)) as string

set verNo to verNo as number

else --念のため(検証してないバージョン用)

set verNo to 0

end if

return verNo

end tell

end verCheck

<使い方>

Illustratorファイルをこのスクリプトにドラッグ&ドロップしてください。

デスクトップに「西暦-月-日 時-分-秒」のフォルダが作成され、そのフォルダの中にIllustratorファイルとリンク画像が収集されます。

<注意点>

●Windows環境には対応してません

●MacOS10.4.11以上で使用してください

●CS2のファイルには対応していません

●CS5以上は未検証。情報求ム!

●Windowsを経由してメタ情報が飛んでるようなファイルにも対応してません

●Illustratorデータ上できちんとリンクがされていないと収集できません(サーバにあるIllustratorデータをデスクトップにコピーして再保存せずにこのスクリプトを使用すると、収集できません)

●その他暫定版なのでエラーが出る可能性があります。その際はフィードバックをください

自分で言うのもなんですが「CollectForOutput」とは比較にならないほど早いです。

当たり前です、テキスト処理がメインなんだからw

XMP情報には他にもいろいろ記載されているみたいなので、時間があるときに眺めてみても面白いかもしれませんね。

スクリプトのダウンロードは下記から。

RubyでIllustrator画像収集ver1.02

--2012.01.13追記

ver1.01 修正版を公開しました

ver1.02 修正版を公開しました

--追記終わり