Illustratorで宛名印刷

差し込み自体はデータセット機能もあるしスクリプトもあるし、結構どうとでもなるんですが、レイアウトとか文字組とかが大変だったって話。

レイアウト

通常は名前をセンターに持ってきますが、連名があったら?名前が二行になったら?
データセットで頑張るなら行数に応じて表示状態を切り替えて、差し込む枠を切り替える感じでしょうか。。

住所はどうしましょうか。これも二行、下手したら三行も考えられます。
また「原則一行目より下に置きたいけど、入らなければ上にずらして頑張る」とか難しいです。後述する文字組みアキ量設定を使うか、あるいは。。

ただまあここはWordの差し込み印刷などでも調節しませんし、今回はあきらめることにしました。

番地

これはそもそもどう書くと見栄えいいのかよくわかっていないです。
漢数字より算用数字の方が読みやすいじゃないですかーということにして「縦組み中の欧文回転」を使ったので、そこの変換は書かずに済みました。

番地の区切りは横書きならハイフンないし全角マイナスを使えばいいんですが、

  • ハイフン:全角数字と並べると短い。欧文回転オンだと横棒になってしまう。
  • マイナス:文章方向とは関係ない記号なので、縦書きだろうと常に横棒。

でちょっと長い気はするんですが、ダッシュと縦罫で悩んで縦罫にしました。見た感じカーニングと太さがちょっと違うようです。

名前

長さがばらばらなんですよ。4〜5文字が多い気はしますが、3文字や6文字の人もいます。
これも言葉で書くなら「名字と名前は分けたい、短ければ間隔を広くしたり文字を大きくしたり、長ければ上から下まで詰める」みたいな。

今回は以下のように作りました。

  • エリア内文字、均等割り付けにしておく
  • 短い名前はデータセット変換時に姓名間のスペースを増やす
  • 文字組みアキ量設定で「段落先頭 -> 非約物」の最大値を増やす(字間より優先して広げてくれるので、長い時だけここを詰めてくれる)

ここまで来るともう宛名印刷専門の文字組やレイアウト処理を実装するしかないじゃないですかーってなりますね。年賀状ソフトは偉大だ。

おまけ:差し込み

変換はこんな感じに。

Func<string,string> convName = _ => _.Replace(" ", _.Length < 5 ? "  " : " ");
Func<string,string> convAddr = _ => _.Replace('-', '|');
var data = @"";
data.Split('\n')
.Select(_ => _.Split('\t'))
.Select(_ => new Dictionary<string, string>{
	{"name1", convName(_[0])},
	{"name2", convName(_[1])},
	{"post1", _[2].Substring(0, 3)},
	{"post2", _[2].Substring(3)},
	{"address1", convAddr(_[3])},
	{"address2", convAddr(_[4])}
})
.Select(_ => string.Format(
	"<v:sampleDataSet dataSetName=\"{0}\">{1}</v:sampleDataSet>",
	_["name1"],
	string.Join("", _.Select(__ => string.Format("<{0}><p>{1}</p></{0}>", __.Key, __.Value)))
	)
).Dump();

印刷の方法については、おそらくバッチ機能を使うのが一番簡単です。
印刷をするだけのアクションを記録しておいて、アクションパネルのメニューから「バッチ」、ソースをデータセットにすればいけます。同じようにしてPDFや画像として書き出せないかと思いましたが、どうもできない仕様のようです。
http://helpx.adobe.com/jp/illustrator/using/automation-actions.html#WS714a382cdf7d304e7e07d0100196cbc5f-62a7a
直接印刷はなんとなく心配だったので、VisualStudioでイラレのタイプライブラリを読み込み、こんなプログラムでPDFを一括出力しました。

    static void Main()
    {
        var app = new Application();
        var doc = app.ActiveDocument;
        var opts = new PDFSaveOptions();
        opts.PreserveEditability = false;

        foreach (DataSet ds in doc.DataSets)
        {
            ds.Display();
            doc.SaveAs(string.Format(@"R:\nenga\{0}.pdf", ds.Name), opts);
        }
    }

C#で書いてしまいましたが、JSで書けばイラレのメニューから呼び出せますよ。