タブ区切りテキストをInDEsignに流し込んでおります。
古畑 一浩 著 「InDesign自動処理実例集」のサンプルスクリプトを使わせていただいたが、フローしたテキストボックスに長体をかける処理がうまくいかない。CS3と比較できないので確かなことはわからないが、フローした部分のテキストにリンクできない、CS4のバグかもしれない。もっとスマートなやりかたもあるように思うが、あれやこれや対処療法でなんとかそれらしく動くようにした。
(function(){
var dt_comment = 0;
var dt_maker = 1;
var dt_name = 2;
var dt_cc = 3;
var dt_since = 4;
var dt_check = 5;
var dt_color = 6;
var dt_design = 7;
var dt_option = 8;
var dt_image = 9;
var dt_price = 10;
var TAB = String.fromCharCode(9); // タブコード
if (app.documents.length < 1) {
alert("あらかじめドキュメントを開いてから実行してください");
return;
}
var fileObj = File.openDialog("タブ区切りファイルを選択してください");
if (fileObj == null) return; // キャンセルボタンが押された時は処理しない
var flag = fileObj.open("r");
if (flag == false) {
alert("タブ区切りファイルが開けません");
return; // ファイルが開けなかったので以後の処理を中止する
}
var folderObj = Folder.selectDialog("写真があるフォルダを選択してください");
if (folderObj == null) return; // キャンセルボタンが押された時は処理しない
var grObj = app.activeDocument.pages[0].groups; // 最初の1ページに割り付ける
var text = fileObj.readln(); // 最初の1行はヘッダーとして読み飛ばす。もし先頭からデータがある場合は、この行を削除。
var No = 1; // 自動レイアウトする項目の先頭番号
while(fileObj.eof == false){ // ファイルの終わりになるまで繰り返す
text = fileObj.readln(); // 一行読み込む
var itemData = text.split(TAB); // タブコードで区切って配列に入れる
var checkFlag = checkTextFrame(grObj, "item"+No);
if (checkFlag == false) break;
try { var tfSubObj = grObj.item("item"+No).textFrames; }catch(e){}
try { var imgObj = grObj.item("item"+No).rectangles; }catch(e){} //割り付ける画像
try { // 写真を設定する
imgObj.item("IMAGE").place(new File(folderObj+"/"+itemData[dt_image]));
imgObj.item("IMAGE").fit(FitOptions.proportionally);
imgObj.item("IMAGE").fit(FitOptions.centerContent);
}catch(e){}
try { tfSubObj.item("COMMENT").contents = itemData[dt_comment]; }catch(e){}
try { tfSubObj.item("COMMENT").contents = txtScale(tfSubObj.item("COMMENT")); }catch(e){}
try { tfSubObj.item("MAKER").contents = itemData[dt_maker]; }catch(e){}
try { tfSubObj.item("MAKER") .contents= txtScale(tfSubObj.item("MAKER")); }catch(e){}
try { tfSubObj.item("NAME").contents = itemData[dt_name]; }catch(e){}
try { tfSubObj.item("NAME").contents = txtScale(tfSubObj.item("NAME")); }catch(e){}
try { tfSubObj.item("CC").contents = itemData[dt_cc]; }catch(e){}
try { tfSubObj.item("CC").contents = txtScale(tfSubObj.item("CC")); }catch(e){}
try { tfSubObj.item("SINCE").contents = itemData[dt_since]; }catch(e){}
try { tfSubObj.item("SINCE").contents = txtScale(tfSubObj.item("SINCE")); }catch(e){}
try { tfSubObj.item("CHECK").contents = itemData[dt_check]; }catch(e){}
try { tfSubObj.item("CHECK").contents = txtScale(tfSubObj.item("CHECK")); }catch(e){}
try { tfSubObj.item("COLOR").contents = itemData[dt_color]; }catch(e){}
try { tfSubObj.item("COLOR").contents = txtScale(tfSubObj.item("COLOR")); }catch(e){}
try { tfSubObj.item("DESIGN").contents = itemData[dt_design]; }catch(e){}
try { tfSubObj.item("DESIGN").contents = txtScale(tfSubObj.item("DESIGN")); }catch(e){}
try { tfSubObj.item("OPTION").contents = itemData[dt_option]; }catch(e){}
try { tfSubObj.item("OPTION").contents = txtScale(tfSubObj.item("OPTION")); }catch(e){}
try { tfSubObj.item("PRICE").contents = itemData[dt_price]; }catch(e){}
//価格については、文字数に合わせて長体をかけるようにしています。
txtlen = itemData[dt_price].length;
if(txtlen > 9){tfSubObj.item("PRICE").texts[0].horizontalScale = 70;}
else if(txtlen > 8){tfSubObj.item("PRICE").texts[0].horizontalScale = 80;}
else if(txtlen > 7){tfSubObj.item("PRICE").texts[0].horizontalScale = 90;}
else{tfSubObj.item("PRICE").texts[0].horizontalScale = 100;}
No = No + 1; // 次の番号にする
}
})();
//
//あふれたら長体、級下げ。くどいスクリプトになりました
function txtScale(selObj){
var limitPer = 60; // 60%未満にはしない
var limitPoint= "7Q"; // 7Q未満にはしない
while (selObj.overflows == true) {
selObj.texts[0].horizontalScale--;
lastscale = selObj.texts[0].horizontalScale;
selObj.texts[0].horizontalScale = 10;
selObj.texts[0].horizontalScale = lastscale;
if (selObj.texts[0].horizontalScale <= limitPer) {
break;
}
}
while (selObj.overflows == true) {
selObj.texts[0].pointSize--;
lastsize = selObj.texts[0].pointSize;
selObj.texts[0].pointSize = "2Q";
selObj.texts[0].horizontalScale = lastscale;
selObj.texts[0].pointSize = lastsize;
if (selObj.texts[0].pointSize <= limitPoint) {
break;
}
}
if(lastsize >= limitPoint){
selObj.texts[0].pointSize = "2Q";
selObj.texts[0].horizontalScale = lastscale;
selObj.texts[0].pointSize = lastsize;
}
}
//
// 割り付けるべきテキストフレームがあるかどうか調べる。あればtrueを返しなければfalseを返す
function checkTextFrame(grObj, tfLabel){
for (var i=0; i<grObj.length; i++){
if (grObj[i].label == tfLabel) return true;
}
return false;
}
//
// 3桁ごとにカンマを入れるは使っていません。
function num3Format(num){
var str = new String(num);
var n = "";
var count = 0;
for (var i=str.length-1; i>=0; i--){
n = str.charAt(i) + n;
count++;
if (((count % 3) == 0) && (i != 0)) n = ","+n;
}
return n;
}