InDesign MY-NOTEBOOK

Monday, April 12, 2010

InDesign で自動組み、一つのテキストフレームにテーブル(表組)とテキストを混在させる

FrameMaker的発想で、InDesingnでも自動組版できないかと実験中。一つのテキストフレームにをXMLを流し込んで、組版完成というやり方。
このとき問題になったのが、ひとつのテキストフレームにどうやって内容を詰めていくか、ということ。

ちなみに このエントリーは、InDesign 標準機能のXML読み込みの話ではありませんので。

何が問題なのか

ExtendScript(JavaScript)を使って、InDesignで自動組版する場合に、よくサンプルに出てくるように、テキストフレームにテキストを入れるのは簡単。


textFrame.contents = "hogehoge";

同じようにテーブルをテキストフレームに入れる場合も以下のようなコードで簡単に実現できる。


textFrame.tables.add();

しかし、一つのテキストフレームにテキストとテーブルを混在させる方法はどうしたらいいのか?

解決方法

テキストフレームに順次内容を追加していくメソッドがあればいいと思って探したが見つからなかった。
流し込みタイプの自動組版では必須だと思ったがそういう考え方をInDesignはしないのかも。(というか、単に大島が知らないだけの可能性も高いが。)

結論としては、生成時に別々のテキストフレームに入れておいて、それらのテキストフレームは連結しておく。その上で、最初のテキストフレーム以外を削除してしまえばよい。

連結しているので内容は一つのストリートしてつながっているため、消えない。結果として一つのテキストフレームにテキストとテーブル(や画像など)を混在させることができる。

テキストフレームからコンテンツがオーバーフローしたら、 InDesign スマートテキストのリフロー処理 をする" 的な > JavaScript で問題を解消する。

コード

#target "InDesign"


//
// InDesign Extend Script
// 一つのテキストフレームにテーブルとテキストを混在させる.
//


var br = "\r";

var myDoc=app.documents.add();
setupDoc( myDoc );
var myPage = myDoc.pages.item(0);

var tf1    = createTextFrame(myDoc,myPage);
tf1.contents = "hoge"+br;

var tf2    = createTextFrame(myDoc,myPage);
tf2.contents = "fuga"+br;

var tf3    = createTextFrame(myDoc,myPage);
var myBounds = myGetBounds(myDoc,myPage);
createDummyTable( tf3,myBounds )

var tf4    = createTextFrame(myDoc,myPage);
tf4.contents = "hogehoge"+br;


tf1.nextTextFrame = tf2;
tf2.nextTextFrame = tf3;
tf3.nextTextFrame = tf4;


tf2.remove();
tf3.remove();
tf4.remove();


//app.quit();


function createDummyTable( myTextFrame,myBounds ){

	// create a table(5x5) object in the textframe
	var myTable=myTextFrame.tables.add();
	myTable.columnCount = 5;
	myTable.bodyRowCount = 3;
	//myTable.bodyRowCount = 5;
	
	// calc table cell size
	var gap=1;
	var w=myBounds[3]-myBounds[1]-gap;
	var h=myBounds[2]-myBounds[0]-gap;
	var cellW = w/myTable.columnCount;
	var cellH = 20;//h/myTable.bodyRowCount;
	//var cellH=h/myTable.bodyRowCount;
	
	// set up size to cells
	for(var i=0; i<myTable.bodyRowCount; i++){
	    var myRow=myTable.rows.item(i);
	    for(var j=0; j<myTable.columnCount; j++){
	        var myCell=myRow.cells.item(j);
	        myCell.width=cellW;
	        myCell.height=cellH;
	        myCell.contents="hoge ("+i+","+j+")";
	    }
	}
	
}



function setupDoc( myDoc ){
    myDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;
    myDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;

    with(myDoc.documentPreferences){
        //A5 landscape
        //pageOrientation=PageOrientation.LANDSCAPE;

        //A5 portrait
        pageOrientation=PageOrientation.PORTRAIT;
        pageWidth   = 419.528;
        pageHeight  = 595.276;
	facingPages = false;
    }
}


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];
}


実行結果