InDesign CS5自動化作戦 (InDesign CS5 Automation Operation)

全ページのフレームに自動的に文字や画像を読み込ませる(画像フィット)

■プログラム説明(ソースコード説明)
 先頭のページのテキストフレーム内に自動的にファイルから読み込んで文字や画像を表示させるには、あらかじめ読み込むファイルのパスをテキストフレームに入れておきます。サンプルではMacintosh HD:img:0001.jpgのようにファイルパスを表記しています。すでに文字が入っている場合に内容が入れ替わってしまうのはよくないため拡張子を調べてJPEG画像かテキストファイルの場合のみ処理を行います。この処理をドキュメントのページ数分だけ繰り返すことで全ページで自動的にレイアウトが行われます。
 画像をフレームサイズに合わせるには一度レイアウトした後に処理を行います。配置された画像はtextFramesでは読み出す事ができないため、代わりにallGraphics配列を使って読み出す必要があります。これはビットマップ画像(JPEGやPSD、TIFFなどの画像)のデータが入っています。このallGraphicsの配列の数だけ繰り返し処理を行います。すでにレイアウトされている矩形枠に画像を合わせますが、画像は矩形枠の子という扱いになっています。このため、画像から矩形枠を見ると親という関係になります。矩形枠のサイズに画像を合わせるには画像の親のサイズを子に設定すればよいことになります。
 サイズはgeometricBoundsとvisibleBoundsがあり、この値を親(矩形枠)から読み出し子(画像)に設定すれば矩形枠に画像がフィットすることになります。


■ソースコード
function fitting()
{
docObj = app.activeDocument.pages;
for (j=0; j<docObj.length; j++)
{
for (i=0; i<docObj[j].allGraphics.length; i++)
{
pageObj = docObj[j];
parentObj = pageObj.allGraphics[i].parent; // 画像を内包している矩形を取得
gSize = parentObj.geometricBounds; // 座標を取得
pageObj.allGraphics[i].geometricBounds = gSize; // 座標を設定(サイズ設定)
vSize = parentObj.visibleBounds; // 表示領域を取得
pageObj.allGraphics[i].visibleBounds = vSize; // 表示領域を設定
}
}
}
function setData()
{
docObj = app.activeDocument.pages;
for (j=0; j<docObj.length; j++)
{
for (i=0; i<docObj[j].textFrames.length; i++)
{
pageObj = docObj[j];
filePath = pageObj.textFrames[i].contents;
if (filePath.indexOf(".jpg") > -1)
{
pageObj.textFrames[i].place(filePath);
}
if (filePath.indexOf(".txt") > -1)
{
fileObj = new File(filePath);
flag = fileObj.open("r");
if (flag)
{
txt = fileObj.read();
pageObj.textFrames[i].contents = txt;
fileObj.close();
}
}
}
}
}
setData();
setData();
fitting();


■ポイント
 テキストに.jpgや.txtの文字があるとエラーになります。try...catch()でエラー回避するか、正規表現で行末にマッチするようにすれば回避することができます。

■実際のスクリプトをダウンロード(sample.jsx.zip)

写真素材 PIXTA