Illustratorのファイル名埋め込み
新しいトピックにさせていただきました。
やりたいこと
①ファイル名をeps内に書き込むこと
②ファイル名のテキストには色を付けたい
③eps内オブジェクトの中心など、
現在のファイルのオブジェクトの縦横幅の中に収めたい
現在の動作
①ファイル名は用紙サイズの右端に記載されて、
ファイル内のオブジェクトからはみ出してしまう。
②テキスト情報に色が付かない
★本題はここからですが。
現在考えているのは、
①ファイルを開いて全選択する
②全選択したオブジェクトの位置情報の中心にファイル名テキストを中央揃えでペーストすれば良いのではないか。(単純にオフセットを入力してもイラストによって位置がずれてしまうため。)
かなりややこしい質問ですが、
Illustratorのスクリプトに詳しい方、知恵をお貸しください。WindowsXP Illustrator CS3を使用しています。
aColor = new CMYKColor();
aColor.cyan = 0;
aColor.magenta = 100;
aColor.yellow = 100;
aColor.black = 0;
offsetX = 50; // 50pt
offsetY = 130; // 130pt;
fontSize = 5; // 5pt;
psdFolderObj = Folder.selectDialog("Illustrator epsがあるフォルダを選択してください。サブフォルダも処理されます");
if (psdFolderObj){
my_main_fnc(psdFolderObj);
}
function my_main_fnc(psdFolderObj){
var psdFileList = psdFolderObj.getFiles();
for (var i=0; i< psdFileList.length; i++) {
var fileObj = psdFileList[i];
if(fileObj.name.indexOf(".") < 0){
//もう一度自分自身の関数を呼び出す。
my_main_fnc(fileObj);
}else if(fileObj.name.indexOf(".eps") > 0){
psd_fnc(fileObj);
}
}
}
function psd_fnc(fileObj){
open(new File(fileObj));
txt = fileObj.name;
docObj = activeDocument;
w = docObj.width;
h = docObj.height;
layObj = docObj.layers.add();
txtObj = layObj.textFrames.add();
txtObj.contents = txt;
for (j=0; j< txtObj.contents.length; j++)
{
txtObj.characters[j].size = fontSize;
layObj.textItem.color = aColor;
}
para = txtObj.paragraphs[0].paragraphAttributes;
para.justification = Justification.RIGHT;
txtObj.translate(w-offsetX, offsetY);
activeDocument.close(SaveOptions.SAVECHANGES);
}
配置画像の領域などはgeometricBoundsで取れますのでそこから計算しても出来ると思います。
下記は選択オブジェクトの領域を調べます。
var myB1 = app.selection[0].geometricBounds;
var myX = myB1[0];
var myY = myB1[1];
var myW = myB1[2]-myX;
var myH = myY-myB1[3];
また、オブジェクトを移動するにはpositionをセットしてはいかがでしょうか?
var myPos = new Array(2);
myPos[0] = myX;
myPos[1] = myY;
app.selection[0].position = myPos;
ご教授ありがとうございます。
領域取得はできました。
下側の移動がうまくできませんでしたので、
テキスト挿入位置を取得した場所から指定することにしました。
元オブジェクトの左上に表示できました。
未解決点
①元オブジェクトの全選択
(この場合、取得失敗を防ぐためにロック解除が最初に必要かもしれないです)
②挿入テキストに色を付ける
以下現在の状況です。
aColor = new CMYKColor();
aColor.cyan = 0;
aColor.magenta = 100;
aColor.yellow = 100;
aColor.black = 0;
offsetX = 10; // 10pt
offsetY = 10; // 10pt;
fontSize = 5; // 5pt;
psdFolderObj = Folder.selectDialog("Illustrator epsがあるフォルダを選択してください。サブフォルダも処理されます");
if (psdFolderObj){
my_main_fnc(psdFolderObj);
}
function my_main_fnc(psdFolderObj){
var psdFileList = psdFolderObj.getFiles();
for (var i=0; i< psdFileList.length; i++) {
var fileObj = psdFileList[i];
if(fileObj.name.indexOf(".") < 0){
//もう一度自分自身の関数を呼び出す。
my_main_fnc(fileObj);
}else if(fileObj.name.indexOf(".eps") > 0){
psd_fnc(fileObj);
}
}
}
function psd_fnc(fileObj){
open(new File(fileObj));
txt = fileObj.name;
docObj = activeDocument;
var myB1 = app.selection[0].geometricBounds; //(★ここでエラー。自分で選択しておけば始まるので、全選択できていないから?)
var myX = myB1[0]; //(抽出するX座標値)
var myY = myB1[1]; //(抽出するY座標値)
var myW = myB1[2]-myX; //(未使用値)
var myH = myY-myB1[3]; //(未使用値)
layObj = docObj.layers.add();
txtObj = layObj.textFrames.add();
txtObj.contents = txt;
for (j=0; j< txtObj.contents.length; j++)
{
txtObj.characters[j].size = fontSize;
}
para = txtObj.paragraphs[0].paragraphAttributes;
para.justification = Justification.LEFT;
txtObj.translate(myX+offsetX, myY-offsetY); //(★やり方不明だったので、とりあえず左上にテキスト挿入にしてみました)
txtObj.Color = aColor //(★この指定ではテキストに色がつきませんでした。。)
activeDocument.close(SaveOptions.SAVECHANGES);
}
色指定は下記の要領で
textObj.paragraphs[0].fillColor = aColor;
アイテム指定は下記の要領で行けますが、(選択ではなく全てのページアイテム指定)
レイヤーが非表示やロックされている場合はエラーが起きますね。
アイテムのロックは問題ないようです。
evryPageItem=docObj.pageItems;
通りすがりさん
たけうちさん
ありがとうございます。
以下のように完成しました。
とりあえず何ファイルかやって正常動作しています。
使ってみて、何か困ったらまた質問させていただくかもしれないです。知識ないのに教えてくださって感謝です。どうもありがとうございました。
aColor = new CMYKColor();
aColor.cyan = 0;
aColor.magenta = 100;
aColor.yellow = 100;
aColor.black = 0;
offsetX = 10; // 10pt
offsetY = 10; // 10pt;
fontSize = 5; // 5pt;
psdFolderObj = Folder.selectDialog("Illustrator epsがあるフォルダを選択してください。サブフォルダも処理されます");
if (psdFolderObj){
my_main_fnc(psdFolderObj);
}
function my_main_fnc(psdFolderObj){
var psdFileList = psdFolderObj.getFiles();
for (var i=0; i< psdFileList.length; i++) {
var fileObj = psdFileList[i];
if(fileObj.name.indexOf(".") < 0){
//もう一度自分自身の関数を呼び出す。
my_main_fnc(fileObj);
}else if(fileObj.name.indexOf(".eps") > 0){
psd_fnc(fileObj);
}
}
}
function psd_fnc(fileObj){
open(new File(fileObj));
txt = fileObj.name;
docObj = activeDocument;
allPageItem = docObj.pageItems;
var myB1 = allPageItem[0].geometricBounds;
var myX = myB1[0]; //(抽出するX座標値)
var myY = myB1[1]; //(抽出するY座標値)
var myW = myB1[2]-myX; //(未使用値)
var myH = myY-myB1[3]; //(未使用値)
layObj = docObj.layers.add();
txtObj = layObj.textFrames.add();
txtObj.contents = txt;
for (j=0; j< txtObj.contents.length; j++)
{
txtObj.characters[j].size = fontSize;
}
para = txtObj.paragraphs[0].paragraphAttributes;
para.justification = Justification.LEFT;
txtObj.translate(myX+offsetX, myY-offsetY);
txtObj.paragraphs[0].fillColor = aColor;
activeDocument.close(SaveOptions.SAVECHANGES);
}
実際のデータに使用してみました。
位置情報取得ですが、
現状だと元々あるレイヤーの一番上にあたるグループの位置情報のようです。
ですので、先にグループ化の作業などが必要なのかもしれません。
グループがバラバラだと、
うまく位置情報が取得できていないようです。
allPageItem[0].geometricBounds;
なので、ドキュメントの再前面のアイテムでしょうね。
(グループでなくても)
画像EPSをIllustratorで開いているのなら、それでもいいかなと思っていたのですが、他にもオブジェクトがあるということは違うのでしょうか?
ドキュメントにはどんなオブジェクトがあるのでしょう?
規則はありますか?
ExtendScript Tool KitのヘルプからIllustratorのオブジェクトモデルを調べて、それっぽいやつで試してみたらいかがでしょう?
>通りすがりさん
>activeDocument.pageItemsの全てのvisibleBoundsを...
ですね。全てのpageItemsの中で一番小さいXと一番大きいYを求める。pageItemsがそれほどないなら遅くもならないでしょう。
代案1
FlameMakerとのことですがInDesignにはできないのですか?イラストのファイル名を出したいのならInDesignでキャプションを作成するとか。
代案2
新規のIllustratorドキュメントにEPSを配置してそれにテキストを載せて別フォルダに保存。FlameMakerにはそこからリンク。
>通りすがりさん、たけうちさん
>代案1
イラスト少なめで、文章が多く、500ページ程度あり、
FlameMakerの方が作成に向いていると判断しております。またお客様指定のソフトでもあります。
>代案2
Illustratorのリンクは、基本使用していません。
リンクが安定してないこと(絶対パス)と保存しなおさないと、中身が更新されないからです。
案いただいているのに否定的で申し訳ないです。
参考までに一番小さいXと
一番大きいYを取り出すスクリプトです。
var myX = 100000;
var myY = -100000;
の初期値はうまく取れないようでしたらもっと激しい値にしてみてください。
docObj = activeDocument;
allPageItem = docObj.pageItems;
var allItemCount = allPageItem.length;
var myX = 100000;
var myY = -100000;
for(var i_num = 0;i_num < allItemCount; i_num++){
var myB1 = allPageItem[i_num].geometricBounds;
var new_myX = myB1[0]; //(抽出するX座標値)
var new_myY = myB1[1]; //(抽出するY座標値)
var new_myW = myB1[2]-new_myX; //(未使用値)
var new_myH = new_myY-myB1[3]; //(未使用値)
if(new_myX < myX){
myX = new_myX;
}
if(new_myY > myY){
myY = new_myY;
}
}