Illustrator CS3/CS4/CS5/CS6編 段落を行単位で分割する

今回はIllustratorで選択されたテキストフレームを行単位で分割するスクリプトです。ポイントテキスト専用です。行間を基準にして位置決めを行っているため、行の途中に大きな文字があると、その行だけずれてしまいます。ただし、他の行には影響を与えません。行間が1/1000単位で指定されている場合は誤差が発生して若干ずれる可能性もあります。
段落内の文字サイズやスタイルは、そのまま引き継がれます。また、以下のスクリプトは縦書きでも横書きでも時自動判別して分割処理を行います。新規に分割された段落は新規レイヤーに作成されるため以前の文字の位置と比較して調整したり一括して削除しやり直すことができます。


// 段落分割
(function(){
var lineH = []; // 行間を入れておく配列
var selObj = app.selection;
if (selObj.length == 0){ return; } // 何も選択されていない場合
var newLayer = app.activeDocument.layers.add();
for(var i=0; i<selObj.length; i++){
var p = selObj[i].paragraphs.length;
for(var j=0; j<p; j++){
lineH[j] = getMaxHeight(selObj[i], j);
}
var linePos = 0;
for(var j=0; j<p; j++){
var dupText = selObj[i].duplicate(newLayer);
removeParagraphs(dupText, j);
if(selObj[i].orientation == TextOrientation.VERTICAL){
dupText.translate(linePos,0);
}else{
dupText.translate(0, linePos);
}
linePos = linePos - lineH[j];
}
}
})();
// 指定した段落以外を消す
function removeParagraphs(txtObj, num){
for(var i=txtObj.paragraphs.length-1; i>num; i--){
txtObj.paragraphs[i].remove();
}
for(var i=txtObj.paragraphs.length-2; i>-1; i--){
txtObj.paragraphs[i].remove();
}
}
// 最終行の最大の行の高さを返す
function getMaxHeight(txtObj, count){
var para = txtObj.paragraphs[count];
var max = 0;
for(var i=0; i<para.characters.length; i++){
var n = para.characters[i].leading;
if (n > max){ max = n; }
}
return max; // 最終行の行の最大の高さを返す
}

全ての文字の高さを調べているため文字数が多いと数分近く待つ場合があります。 また、レイヤー名の設定などはPhotoshopをバックグランドにまわすか、Tabキーを押してパレットを消すと高速に処理されます。

[サンプルをダウンロード]