Home About Contact
InDesign , DTP

InDesign , ExtendScript で表を作成するときの覚え書き

HTMLのテーブルをそのまま ExtendScript 経由で自動組版しようと思っている。 当然 colspan, rowspan がガンガンにはいっている。 CSSで指定されているボーダーにも対応しなければならない。

問題その1 セルのマージ

よくありがちなセル結合のサンプルコードは、非常に単純な例しか載っていない。実践ではその程度では対応できない。 もっとも説明用のサンプルコードが複雑だと理解できないから、単純な例しか載っていないのは仕方ないのかもしれないが。 セルのマージで一番問題になるのは、複数箇所でセルをマージしていくとき、先にマージしたことにより、列・行の値が変化してしまうのだ。 このことに気づいていないとはまる。(気づいていたとしてもいまのところ、スマートな解決コードを思いついてないが。)

対処方法

まず列や行オブジェクトを信用するのはやめること。

通常 InDesign のオブジェクトモデルは

var aCellObj = aTableObj.rows.item( 行インデックス ).cells.item( 列インデックス );

のようにアクセスできるのだが、 セルの結合を行うと、この行列のインデックスが当初の状態から変化してしまうのだ。

いまのところ、それなりにうまく機能している方法は、セル結合を行う前に、 まずはすべてのセルオブジェクトを取得しておく。 (セルオブジェクトである点に注意、行オブジェクトや列オブジェクトではない。) 次にマージしたいセルを計算しておいて、順にマージする。

ポイントはこの マージ順

テーブルの左上から右下に向かってマージを行うと問題がおきやすい …というか複雑なセルマージがあれば確実に問題がおきる。 そうではなく、右下から左上に向かって順にマージしていく。そうすれば行・列のインデックス値の変化がおきにくくなるので、うまくマージできる。 (いまのところはこの方法でうまくいっている)

問題その2 ボーダー競合

HTMLのテーブルの td 要素におけるボーダーのスタイル指定では、 top,bottom,left,right のボーダーをどうするか(線の太さ/線のタイプ/色)を指定する。 しかし、上下に並んだセルの間にあるボーダーは、 上のセルの bottom であると同時に、下のセルの top でもあるので、 これらでコンフリクトするようなボーダー設定がされていた場合にどちらを優先するのか?

... という問題。