InDesign MY-NOTEBOOK

Sunday, April 4, 2010

InDesign CS3/CS4 で "スマートテキストのリフロー処理 をする" 的な JavaScript

InDesign勉強の部屋で勉強していたら スマートテキストのリフロー処理 をする を発見。これは便利、と思ったが、諸事情によりJavaScriptで直接リフロー処理するコードを書きました。

reflow.jsx

//
// InDesign Extend Script
// テキストフレームからオーバーフローしたら新しいテキストフレームを追加して連結.
//


// 1) テスト用ファイルを開く
var testfile = new File("/c/home/test.indd");
app.open( testfile );
var myDoc  = app.activeDocument;


// 2) テキストフレームが存在していることが前提
var myPage = myDoc.pages.item(0);
var tf1    = myPage.textFrames.item(0);


// 3) オーバフローが解消されるまでページ追加とテキストフレーム追加および連結を繰り返す
while( tf1.overflows ){
	// ページを追加
	var myPage2 = myDoc.pages.add();

	// テキストフレームを作成
	var tf2     = createTextFrame(myDoc,myPage2);

	// 連結
	tf1.nextTextFrame = tf2;

	tf1 = tf2
}



// 以下は便利メソッド

function createTextFrame(myDoc,myPage){
	var myTextFrame=myPage.textFrames.add();
	var myBounds = myGetBounds(myDoc,myPage);
	myTextFrame.geometricBounds=myBounds;

	return myTextFrame;
}

function myGetBounds(myDoc, myPage){
	with(myDoc.documentPreferences){
		var myPageHeight = pageHeight;
		var myPageWidth = pageWidth;
	}
	with(myPage.marginPreferences){
		var myTop = top;
		var myLeft = left;
		var myRight = right;
		var myBottom = bottom;
	}
	myRight = myPageWidth - myRight;
	myBottom = myPageHeight- myBottom;
	return [myTop, myLeft, myBottom, myRight];
}



説明

c:
home
test.indd にテスト用のファイルを配置しておきます。このファイルは、1ページ目にテキストフレームが一つだけ存在していて、テキストがオーバーフローしている状態にしておきます。

そうした上でこのコードを実行すると、必要なだけページ作成とテキストフレームの作成を繰り返し、テキストフレームのあふれを解消します。