フォルダ内の画像を自動配置する

今回はフォルダ内にあるJPEG画像を自動的にページにレイアウトするスクリプトです。が、その前に基礎となるスクリプトから説明します。また、今回はMacOS Xでの場合について説明しています。

以下のスクリプトはMacintosh HDボリューム(ディスク)にある、つまりドライブアイコンをダブルクリックした時に表示されるところにある0001.jpgファイルをInDesign CSのページに表示します。

obj = app.activeDocument.textFrames.add();
obj.visibleBounds = ["1cm","0.5cm","5cm","10cm"];
obj.contentType = ContentType.graphicType;
obj.place("Macintosh HD:0001.jpg");


まず、InDesign CSで画像を配置するには最初にテキストフレームを作成しておく必要があります。しかし、作成されるのはテキストフレームなので画像フレームに変更する必要があります。画像フレームにしている部分が

obj.contentType = ContentType.graphicType;

になります。画像を配置する場合は、このように指定しておきます。
2行目の["1cm","0.5cm","5cm","10cm"]はフレームの表示位置になります。順番に上側、左側、下側、右側の順番に位置を指定します。単位を省略すると環境設定で指定されている単位が使われます。
一番最後の行でMacintosh HDボリューム内の0001.jpgを指定しています。MacOS Xの場合はフォルダの区切り記号は:(コロン)になります。例えば

Macintosh HDフォルダ内にあるABCフォルダ内にあるsample.jpgファイル

のパスを指定するには以下のようになります。

Macintosh HD:ABC:sample.jpg

フォルダ内の画像をまとめて自動は位置するにはテキストフレームを作ってファイルのパスを指定していけばできあがります。
次にフォルダ内のファイル一覧を取得するスクリプトが必要です。以下のスクリプトは選択したフォルダ内のjpegファイル一覧を取得しテキストフレームに書き出すものです。

CR = String.fromCharCode(13);
folderObj = Folder.selectDialog("フォルダを選択してください");
fileList = folderObj.getFiles("*.jpg");
tfObj = app.activeDocument.textFrames.add();
txt = "";
for (i=0; i<fileList.length; i++)
{
txt = txt + fileList[i].name + CR;
}
tfObj.contents = txt;
tfObj.visibleBounds = ["0cm","0cm","20cm","10cm"];


フォルダ指定は

folderObj = Folder.selectDialog("フォルダを選択してください");

の部分です。ここでは手動で選択させています。自動化するには、この手作業部分は不要なので直接フォルダのパスを指定します。これは以下のようになります。

folderObj = new Folder("フォルダへのパス");

得られたフォルダ内にあるファイル一覧を求めるにはgetFiles()を使います。

fileList = folderObj.getFiles();

とすると全部のファイル一覧が取得できます。しかし配置したいのはJPEG画像ファイルなので以下のようにして拡張子が.jpgのみのファイルを取得するようにします。

fileList = folderObj.getFiles("*.jpg");

eps画像であれば

fileList = folderObj.getFiles("*.eps");

となります。必要に応じて拡張子を変更して使ってください。
得られたファイルリストは配列として参照することができます。配列なので配列の長さ分繰り返せばフォルダ内の全ての画像を連続して自動配置することができます。
以下のスクリプトはMacintosh HDボリュームにあるimagesフォルダ内にあるJPEG画像を横5枚ずつ配置していきます。

CR = String.fromCharCode(13);
basePath = "Macintosh HD:images:"; // 画像のあるフォルダへのパス
startX = 0; // 開始位置(横)
startY = 0; // 開始位置(縦)
w = 30; // 横幅
h = 20; // 縦幅
maxCount = 5; // 横の最大枚数
x = startX;
y = startY;
cnt = 0;
folderObj = new Folder(basePath);
fileList = folderObj.getFiles("*.jpg");
txt = "";
for (i=0; i<fileList.length; i++)
{
tfObj = app.activeDocument.textFrames.add();
tfObj.visibleBounds = [y,x,y+h,x+w];
tfObj.contentType = ContentType.graphicType;
imgPath = basePath + fileList[i].name;
tfObj.place(imgPath);
tfObj.fit(FitOptions.frameToContent);
x = x + w;
cnt++;
if (cnt >= maxCount)
{
cnt = 0;
x = 0;
y = y + h;
}
}


2行目がJPEGファイルのあるフォルダのパスを指定している部分です。ここを必要に応じて書き換えてください。startX, startYが画像配置の開始位置になります。w, hが配置する画像の横幅と縦幅になります。ここでは単位なしの値になっているので環境設定で指定しておいてください。(スクリプトで単位付きにすることもできます)
macCountが横に配置する画像の最大枚数になります。これを超えると縦幅の分だけ位置を下にずらして再度左側から配置していきます。サンプルでは配置した画像にフレームを合わせています。これは以下の行になります。

tfObj.fit(FitOptions.frameToContent);

他にも以下のような指定ができます。

tfObj.fit(FitOptions.centerContent); 内容を中央に揃える
tfObj.fit(FitOptions.proportionally); 内容をフレーム内に合わせる
tfObj.fit(FitOptions.contentToFrame); 内容をフレームに合わせる


同じような方式でテキストも配置することができます。あと、ファイルパスで:でなく/を使うとうまく動作しない場合があります。フォルダ名に日本語が含まれている場合も、うまく動作しない場合があるので、なるべく日本語フォルダ名やファイル名は指定しない方が良いでしょう。



[サンプルをダウンロード]