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

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

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


■ソースコード
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; // 画像を内包している矩形を取得
iSize = pageObj.allGraphics[i].geometricBounds; // 元画像のサイズ
imgY1 = iSize[0];
imgX1 = iSize[1];
imgY2 = iSize[2];
imgX2 = iSize[3];
imgW = imgX2 - imgX1;
imgH = imgY2 - imgY1;
gSize = parentObj.geometricBounds; // 座標を取得
gY1 = gSize[0];
gX1 = gSize[1];
gY2 = gSize[2];
gX2 = gSize[3];
gW =gX2 - gX1;
gH = gY2 - gY1;
if (imgW > imgH)
{ // 画像も横長の場合
d = gW / imgW;
imgW = imgW * d;
imgH = imgH * d;
}else{ // 画像が縦長の場合
d = gH / imgH;
imgW = imgW * d;
imgH = imgH * d;
}
gSize[2] = imgY1 + imgH;
gSize[3] = imgX1 + imgW;
pageObj.allGraphics[i].geometricBounds = gSize; // 座標を設定(サイズ設定)
}
}
}

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()でエラー回避するか、正規表現で行末にマッチするようにすれば回避することができます。
 また、数回スクリプトを実行しないと、一部テキストフレームに画像やデータが設定されないことがあります。読み込むデータの種類によっては、この方法ではなくfitプロパティにFitOptions.contentToFrameなどが使用できるかもしれません。

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

写真素材 PIXTA