こんにちは、デジタル事業本部の藤田です。
InDesign にはデータ結合という自動組版の機能がデフォルトで備わっています。データ結合を使用するとデータソース(CSV または TEXT ファイル)を InDesign ドキュメントにマージして、定型でバリエーションの違うドキュメントを簡単に作成できます。
目次
● データ結合とは
詳細は Adobe のヘルプをご覧になった方がよく分かると思いますので、ここでは要点のみを。
用意するもの
・CSV または TEXT 形式のデータソースファイル
・テンプレートとなる InDesign ドキュメント
これだけです。
データソースファイルはフィールドとレコードで構成されており、フィールドが情報のグループで、レコードが情報セットの行となります。カンマ区切り(.csv)またはタブ区切りファイル(.txt)ファイルで作成されている必要があります。
データ結合に使用される InDesign ドキュメントはデータソースの対応フィールドを用意したテンプレートファイルとなります。
データ結合は InDesign のウィンドウ > ユーティリティ > データ結合を選択し表示されたパネルより設定を行います。設定はデータソースファイルを読み込ませて、InDesign ドキュメントのテキストフレームまたは画像フレームへデータソースのフィールドを挿入するだけです。これでデータフィールドが作成されます。
「結合ドキュメントを作成」コマンドを実行すると、テンプレートをもとにデータソース行数分のデータマージドキュメントが作成されます。作成されたドキュメントのコマはそれぞれ独立しています。
ちなみに、「データ結合」という言葉はもともとプログラミングでの専門用語で、モジュール結合度という尺度において最も弱いモジュール同士の関連レベルを意味します。InDesign においてモジュールをコマとみなせば、データソースのレコードをパラメータで渡すことで独立したコマができるためこの名称が付いたのでしょう。
● データソースファイルを作成する
さて、データソースファイルは CSV または TEXT を用意する必要がありますが、業務では自分で用意するよりもクライアントから Excel を支給されるケースが多いと思います。この支給 Excel をデータ結合に適した形式にするために整形作業を行います。
Excel で改行を置き換える
よくある困ったケースが、Excel のセル内に改行があるパターンです。残念ながらデータ結合ではデータソースファイルのレコードに改行が含まれていると認識できません。
というわけで Excel でセル内改行を置き換える方法です。暫定的に改行を違う文字に置き換えます。文字列の置き換えには SUBSTITUTE 関数を使用しますが、改行をテキストとして認識するには工夫が必要です。
① 改行があるセルの横のセルにカーソルを置くか数式パレットより SUBSTITUTE 関数 を入力。セルA1に対して設定する場合は引数「文字列」に A1 を入力。
② 引数「検索文字列」には CHAR(10) を入力。この CHAR 関数は文字を数値で指定する関数です。10を指定すると改行(LINE FEED/LF)を指定できます。
③ 引数「置換文字列」には改行とわかる任意の文字列を入力。ここでは <br> にしました。
④ 関数を入力して [enter] を押すか数式パレットの [完了] ボタンを押すと改行が置き換わります。SUBSTITUTE 関数の最後の引数「置換対象」は省略してかまいません。
数式は以下の通りです。
=SUBSTITUTE(A1,CHAR(10),"<br>")
⑤ 同じ改行でも復帰文字(CARRIAGE RETURN/CR)が使われている場合は、 CHAR(13) を指定します。また、改行が CR+LF の場合もあり得るのでいっぺんに置き換えられるようにします。
数式は以下の通りです。
=SUBSTITUTE(SUBSTITUTE(A1,CHAR(10),"<LF>"),CHAR(13),"<CR>")
※ LF:CHAR(10) → <LF>、CR:CHAR(13) → <CR> に置き換え
Excel からデータソースの書き出し
Excel から CSV または TEXT にファイルを書き出すには ファイル > 名前をつけて保存 を選択します。とはいえファイル形式には「*.csv」「*.txt」に該当する選択肢がいくつか存在するのでどれを選べばよいのか迷うところです。
ピックアップしてみると
・CSV UTF-8(コンマ区切り)(*.csv)
・テキスト(タブ区切り)(*.txt)
・Unicode テキスト(*.txt)
・CSV(コンマ区切り)(*.csv)
の4種類が該当します。このうち、「テキスト(タブ区切り)」「CSV(コンマ区切り)」はファイルの文字コードが Shift-JIS 形式で書き出されます。なので新しい常用漢字が使用されている場合は文字化けを起こす可能性があります。
また、「CSV UTF-8(コンマ区切り)」は UTF-8、「Unicode テキスト」は UTF-16 で書き出されます(まぎらわしい…)。どちらでもよさそうですが大は小を兼ねるってことで UTF-16 の「Unicode テキスト」を選んでおけば文字化けの心配もないでしょう。ちなみに Mac 版の Excel では書き出しのファイル形式一覧に「UTF-16 Unicode テキスト(.txt)」と表記されています(ますますまぎらわしい…)。
● 結合ドキュメントを作成
データソースファイルができれば InDesign で読み込ませてデータフィールドを挿入し「結合ドキュメントを作成」を実行します。ダイアログがあらわれて複数レコードレイアウトでマージンや配置方法、間隔を設定します。
ダイアログの設定ができたら OK ボタンを押します。すると、レコードごとにコマが配置されたドキュメントができあがります。しかし、ドキュメントを見開きページで設定しても単一連続ページで出来てしまいます。どうもこれは InDesign の仕様のようです。
単一連続ページを見開きにするには、ページパレットより「ドキュメントページの移動を許可」を選択します。ダイアログがあらわれ「各スプレッドの現在のページ数を維持しますか?」というメッセージに対し「いいえ」をクリック。
すると、ドキュメントは見開きとなります。
しかし、単一連続ページを見開きにしたことによってコマがページマージンでずれてしまいました。ノドと小口が違っておりページを左右で移動させたためコマの位置も変わってしまったということです。困ったもんですね。
さらに、CC2014 以前のバージョンではコマが正確な位置に配置されず設定したマージンからずれてしまうという現象も起こっていました。下図では、X 座標を 26 mm、Y 座標を 20 mm のマージン左端に設定したにもかかわらずデータ結合で配置したコマの座標がずれてしまっている例です。おそらく InDesign の中でミリメートルをポイント換算しており、そのため微妙な誤差が生じてしまったのでしょう。
コマがずれる問題は CC2015 で修正されましたが、いずれにせよコマを正しい位置に配置してあげなくてはいけません。数ページなら手作業で直すところですが、大量にページ数があると手間のかかる作業です。というわけで AppleScript で正しい位置にコマを移動するようにしてみました。
● AppleScript でページ内全オブジェクトの位置を移動する
下記の AppleScript をデータ結合処理後のドキュメントに対して実行するとページごとにすべてのオブジェクトがまるごと指定した位置に移動します。
ページ内のオブジェクトを全選択(⌘A)してコントロールパネルで X 座標と Y 座標を指定する作業をスクリプトが自動で処理するイメージです。
property targetPointX : 26 -- 移動したいページ X 座標(左) property targetPointY : 20 -- 移動したいページ Y 座標 property slidePoint : -12 -- 左右ページの小口とノドのマージン差分 tell application id "com.adobe.inDesign" activate set mainDocument to active document tell mainDocument -- ルーラー原点を保存 set savedRulerOrigin to ruler origin of first view preference -- ルーラー原点をページ原点に set ruler origin of every view preference to page origin -- 計測単位を保存 set savedHorizontalMeasurementUnits to horizontal measurement units of first view preference set savedVerticalMeasurementUnits to vertical measurement units of first view preference -- 計測単位をミリメートルに set horizontal measurement units of every view preference to millimeters set vertical measurement units of every view preference to millimeters end tell repeat with p from 1 to count every page of mainDocument set active page of active window to page p of mainDocument -- ページごとに位置を調整 tell page p of mainDocument -- 左右の違いで小口側の差分を係数として算出する if side is left hand then set a to 0 else set a to slidePoint end if -- すべてのページアイテム tell every page item tell geometric bounds set posYList to first item -- Y 座標のリスト set posXList to second item -- X 座標のリスト end tell set minY to my getMinPos(posYList) -- 左上の Y 座標を求める set minX to my getMinPos(posXList) -- 左上の X 座標を求める select it -- 特に選択する必要はない -- ターゲットとする座標への差分移動 move by {targetPointX + a - minX, targetPointY - minY} end tell -- 再描画する recompose mainDocument end tell end repeat tell mainDocument -- 計測単位を元に戻す set horizontal measurement units of every view preference to savedHorizontalMeasurementUnits set vertical measurement units of every view preference to savedVerticalMeasurementUnits -- ルーラー原点を元に戻す set ruler origin of every view preference to savedRulerOrigin end tell end tell return use AppleScript version "2.4" use scripting additions use framework "Foundation" to getMinPos(posList as list) set posArray to current application's NSArray's arrayWithArray:posList set minRes to (posArray's valueForKeyPath:"@min.self") -- 最小値を求める return minRes as real end getMinPos
※ページ内すべてのオブジェクトのうち最も左上の座標を算出し、プロパティで設定した座標からずれた分だけ移動します。
※左右ページで小口とノドのが違う場合はマージン差分(小口−ノド)をプロパティで設定します。
※Cocoa の機能を使用しているため OS X Yosemite 以降で使用可能となっています。
● テキスト検索で改行を戻す
最後に Excel で処理したセル内改行を InDesign で戻してあげます。テキスト検索で検索文字列に改行をあらわす文字列(ここでは<br>)、置換文字列は^pで[すべてを置換]ボタンを押下します。検索形式に段落スタイルを指定してあげると安心です。
● データ結合の応用
もうちょっとがんばって欲しいデータ結合機能ですが、足りない部分を AppleScript で補えばいい感じに使えそうです。また、あらかじめレイヤーパネル(もしくはスクリプトラベル)でオブジェクトに名前をつけておけば結合ドキュメントを作成したあとも細かい調整はできそうです。コマの種類を判別するパラメータをテキストフレームにつけておけば種類ごとに色を変えるなんてこともできますね。
とはいえ、スクリプトを使わなくても手軽に自動組版ができるので簡単な組版なら自分で作成できるのが魅力です。自動組版の概念を知りたい方には最適といえますね。