DTP駆け込み寺
  1. [4488] Illustratorのファイル名埋め込み 旧掲示板 2009/04/21 16:35

[ 返信 ]

Illustratorのファイル名埋め込み

先日フォトショップの質問させていただいていたものです。
新しいトピックにさせていただきました。

やりたいこと
@ファイル名をeps内に書き込むこと
Aファイル名のテキストには色を付けたい
Beps内オブジェクトの中心など、
現在のファイルのオブジェクトの縦横幅の中に収めたい

現在の動作
@ファイル名は用紙サイズの右端に記載されて、
ファイル内のオブジェクトからはみ出してしまう。
Aテキスト情報に色が付かない

★本題はここからですが。
現在考えているのは、
@ファイルを開いて全選択する
A全選択したオブジェクトの位置情報の中心にファイル名テキストを中央揃えでペーストすれば良いのではないか。(単純にオフセットを入力してもイラストによって位置がずれてしまうため。)

かなりややこしい質問ですが、
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);
}

DTP初心者 2009/04/21 16:35:56
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

001

スレ主です。
まだいろいろ考えていましたが。

ファイル名テキストをペースト後に
元々あるeps内の全体オブジェクトに対して、
中央揃えの方が簡単そうなので、そちらを考えていってみます。

DTP初心者 2009/04/22 10:45:01
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

002

配置画像の領域などは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;

たけうちとおる 2009/04/22 12:10:34
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; ja-jp) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

003

ご教授ありがとうございます。
領域取得はできました。
下側の移動がうまくできませんでしたので、
テキスト挿入位置を取得した場所から指定することにしました。
元オブジェクトの左上に表示できました。

未解決点
@元オブジェクトの全選択
(この場合、取得失敗を防ぐためにロック解除が最初に必要かもしれないです)

A挿入テキストに色を付ける

以下現在の状況です。

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);
}

DTP初心者 2009/04/22 14:58:59
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

004

色指定は下記の要領で
textObj.paragraphs[0].fillColor = aColor;

アイテム指定は下記の要領で行けますが、(選択ではなく全てのページアイテム指定)
レイヤーが非表示やロックされている場合はエラーが起きますね。
アイテムのロックは問題ないようです。
evryPageItem=docObj.pageItems;

通りすがり 2009/04/22 15:18:22
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ja-JP-mac; rv:1.9.0.9) Gecko/2009040820 Firefox/3.0.9

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

005

抜けていますが、
docObj=activeDocument;です。

通りすがり 2009/04/22 15:20:24
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ja-JP-mac; rv:1.9.0.9) Gecko/2009040820 Firefox/3.0.9

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

006

通りすがりさん
たけうちさん

ありがとうございます。
以下のように完成しました。
とりあえず何ファイルかやって正常動作しています。

使ってみて、何か困ったらまた質問させていただくかもしれないです。知識ないのに教えてくださって感謝です。どうもありがとうございました。

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);
}

DTP初心者 2009/04/22 17:31:21
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

007

実際のデータに使用してみました。

位置情報取得ですが、
現状だと元々あるレイヤーの一番上にあたるグループの位置情報のようです。
ですので、先にグループ化の作業などが必要なのかもしれません。

グループがバラバラだと、
うまく位置情報が取得できていないようです。

DTP初心者 2009/04/23 09:20:03
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

008

allPageItem[0].geometricBounds;
なので、ドキュメントの再前面のアイテムでしょうね。
(グループでなくても)
画像EPSをIllustratorで開いているのなら、それでもいいかなと思っていたのですが、他にもオブジェクトがあるということは違うのでしょうか?

ドキュメントにはどんなオブジェクトがあるのでしょう?
規則はありますか?

ExtendScript Tool KitのヘルプからIllustratorのオブジェクトモデルを調べて、それっぽいやつで試してみたらいかがでしょう?

たけうちとおる 2009/4/23 13:59
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; ja-jp) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

9

PageItemというものが全部含んでいてOKなのかと思っていました。アイテム全てを最前面にすれば良いかと思って、グループ化かなと感じました。

アイテムは、
テキストと、
イラストを線でトレースしたようなオブジェクトです。
中にはフォトショップで作成した画像もあります。
規則性が無いといえば無いのかもしれません。。

DTP初心者 2009/4/23 15:01
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

10

activeDocument.pageItemsの全てのvisibleBoundsを比較して、
最も外側のサイズの配列を作成してやる必要があると思います。

通りすがり 2009/4/23 15:16
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ja-JP-mac; rv:1.9.0.9) Gecko/2009040820 Firefox/3.0.9

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

11

PageItemというものが全部含んでいてOKなのかと思っていました。アイテム全てを最前面にすれば良いかと思って、グループ化かなと感じました。

アイテムは、
テキストと、
イラストを線でトレースしたようなオブジェクトです。
中にはフォトショップで作成した画像もあります。
規則性が無いといえば無いのかもしれません。。

DTP初心者 2009/4/23 15:19
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

12

>通りすがりさん
>activeDocument.pageItemsの全てのvisibleBoundsを...

ですね。全てのpageItemsの中で一番小さいXと一番大きいYを求める。pageItemsがそれほどないなら遅くもならないでしょう。

代案1
FlameMakerとのことですがInDesignにはできないのですか?イラストのファイル名を出したいのならInDesignでキャプションを作成するとか。

代案2
新規のIllustratorドキュメントにEPSを配置してそれにテキストを載せて別フォルダに保存。FlameMakerにはそこからリンク。

たけうちとおる 2009/4/23 18:36
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; ja-jp) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

13

>通りすがりさん、たけうちさん

>代案1
イラスト少なめで、文章が多く、500ページ程度あり、
FlameMakerの方が作成に向いていると判断しております。またお客様指定のソフトでもあります。

>代案2
Illustratorのリンクは、基本使用していません。
リンクが安定してないこと(絶対パス)と保存しなおさないと、中身が更新されないからです。

案いただいているのに否定的で申し訳ないです。

DTP初心者 2009/4/24 8:53
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

14

参考までに一番小さい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;
}
}

たけうちとおる 2009/4/24 23:42
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

15

たけうちさん
休日本屋で調べようと、頑張ってましたが、
何にのっているのやら。。。

さっさく、試してみましたが、
うまく取得できました。
実際のデータで使用してみます。

ありがとうございました。

DTP初心者 2009/4/27 8:57
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

[4488] 旧掲示板 (2009/04/21 Tue 16:35)