HAKADORI その他

InDesign で自動組版【データ結合編】

2018.07.27 金

こんにちは、デジタル事業本部の藤田です。

InDesign にはデータ結合という自動組版の機能がデフォルトで備わっています。データ結合を使用するとデータソース(CSV または TEXT ファイル)を InDesign ドキュメントにマージして、定型でバリエーションの違うドキュメントを簡単に作成できます。

● データ結合とは

詳細は Adobe のヘルプをご覧になった方がよく分かると思いますので、ここでは要点のみを。

用意するもの
・CSV または TEXT 形式のデータソースファイル
・テンプレートとなる InDesign ドキュメント
これだけです。

データソースファイルと InDesign ドキュメント

データソースファイルと InDesign ドキュメント

データソースファイルはフィールドとレコードで構成されており、フィールドが情報のグループで、レコードが情報セットの行となります。カンマ区切り(.csv)またはタブ区切りファイル(.txt)ファイルで作成されている必要があります。

データソースファイルのイメージ(CSV ファイル)

データソースファイルのイメージ(CSV ファイル)

データ結合に使用される InDesign ドキュメントはデータソースの対応フィールドを用意したテンプレートファイルとなります。

データ結合に使用される InDesign ドキュメント

データ結合に使用される InDesign ドキュメント

データ結合は InDesign のウィンドウ > ユーティリティ > データ結合を選択し表示されたパネルより設定を行います。設定はデータソースファイルを読み込ませて、InDesign ドキュメントのテキストフレームまたは画像フレームへデータソースのフィールドを挿入するだけです。これでデータフィールドが作成されます。

対応フィールドのイメージ

対応フィールドのイメージ

「結合ドキュメントを作成」コマンドを実行すると、テンプレートをもとにデータソース行数分のデータマージドキュメントが作成されます。作成されたドキュメントのコマはそれぞれ独立しています。

ドキュメントが作成される

ドキュメントが作成される

ちなみに、「データ結合」という言葉はもともとプログラミングでの専門用語で、モジュール結合度という尺度において最も弱いモジュール同士の関連レベルを意味します。InDesign においてモジュールをコマとみなせば、データソースのレコードをパラメータで渡すことで独立したコマができるためこの名称が付いたのでしょう。

● データソースファイルを作成する

さて、データソースファイルは CSV または TEXT を用意する必要がありますが、業務では自分で用意するよりもクライアントから Excel を支給されるケースが多いと思います。この支給 Excel をデータ結合に適した形式にするために整形作業を行います。

Excel で改行を置き換える

よくある困ったケースが、Excel のセル内に改行があるパターンです。残念ながらデータ結合ではデータソースファイルのレコードに改行が含まれていると認識できません。

セル内に改行があるパターン

セル内に改行があるパターン

というわけで Excel でセル内改行を置き換える方法です。暫定的に改行を違う文字に置き換えます。文字列の置き換えには SUBSTITUTE 関数を使用しますが、改行をテキストとして認識するには工夫が必要です。

① 改行があるセルの横のセルにカーソルを置くか数式パレットより SUBSTITUTE 関数 を入力。セルA1に対して設定する場合は引数「文字列」 A1 を入力。

文字列にA1を入力

「文字列」にA1を入力

② 引数「検索文字列」には CHAR(10) を入力。この CHAR 関数は文字を数値で指定する関数です。10を指定すると改行(LINE FEED/LF)を指定できます。

検索文字列に CHAR(10) を入力

「検索文字列」に CHAR(10) を入力

③ 引数「置換文字列」には改行とわかる任意の文字列を入力。ここでは <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> に置き換え

改行が CR+LF の場合

改行が CR+LF の場合

Excel からデータソースの書き出し

Excel から CSV または TEXT にファイルを書き出すには ファイル > 名前をつけて保存 を選択します。とはいえファイル形式には「*.csv」「*.txt」に該当する選択肢がいくつか存在するのでどれを選べばよいのか迷うところです。

ファイル形式(Excel 2016)

ファイル形式(Excel 2016)

ピックアップしてみると
・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)」と表記されています(ますますまぎらわしい…)。

ファイル形式(Excel 2016 for Mac)

ファイル形式(Excel 2016 for Mac)

● 結合ドキュメントを作成

データソースファイルができれば InDesign で読み込ませてデータフィールドを挿入し「結合ドキュメントを作成」を実行します。ダイアログがあらわれて複数レコードレイアウトでマージンや配置方法、間隔を設定します。

結合ドキュメントを作成

結合ドキュメントを作成

ダイアログの設定ができたら OK ボタンを押します。すると、レコードごとにコマが配置されたドキュメントができあがります。しかし、ドキュメントを見開きページで設定しても単一連続ページで出来てしまいます。どうもこれは InDesign の仕様のようです。

単一連続ページでドキュメントが作成される

単一連続ページでドキュメントが作成される

単一連続ページを見開きにするには、ページパレットより「ドキュメントページの移動を許可」を選択します。ダイアログがあらわれ「各スプレッドの現在のページ数を維持しますか?」というメッセージに対し「いいえ」をクリック。

すると、ドキュメントは見開きとなります。

ドキュメントは見開きとなる

ドキュメントは見開きとなる

しかし、単一連続ページを見開きにしたことによってコマがページマージンでずれてしまいました。ノドと小口が違っておりページを左右で移動させたためコマの位置も変わってしまったということです。困ったもんですね。

コマがページマージンでずれてしまった

コマがページマージンでずれてしまった

さらに、CC2014 以前のバージョンではコマが正確な位置に配置されず設定したマージンからずれてしまうという現象も起こっていました。下図では、X 座標を 26 mm、Y 座標を 20 mm のマージン左端に設定したにもかかわらずデータ結合で配置したコマの座標がずれてしまっている例です。おそらく InDesign の中でミリメートルをポイント換算しており、そのため微妙な誤差が生じてしまったのでしょう。

コマが正確な位置に配置されない

コマが正確な位置に配置されない(図はCS6)

コマがずれる問題は 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 で補えばいい感じに使えそうです。また、あらかじめレイヤーパネル(もしくはスクリプトラベル)でオブジェクトに名前をつけておけば結合ドキュメントを作成したあとも細かい調整はできそうです。コマの種類を判別するパラメータをテキストフレームにつけておけば種類ごとに色を変えるなんてこともできますね。
とはいえ、スクリプトを使わなくても手軽に自動組版ができるので簡単な組版なら自分で作成できるのが魅力です。自動組版の概念を知りたい方には最適といえますね。

  • この記事を書いた人

Noriaki Fujita

藤田 徳朗(フジタノリアキ) デジタル事業本部 DXソリューショングループ所属 Scriptを書いたり、アクセス解析をしています。どうぞよろしくお願いします。

-HAKADORI, その他
-, , , ,