:note

スプレッドごとにドキュメントを分割

InDesignでいわゆる長いドキュメントをスプレッドごとに分割するスクリプト。

少し前に、 http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=5517 でAppleScript版が出ていたのですが、自分で書いてみたらえらい手こずってすっかり出遅れてしまいました。

当然のことながら見開きでページデータが完結しているものを分割することを想定してますので、テキスト連結されているドキュメントでは実行するとものすごい惨状になります。

やっていることはドキュメントを各スプレッドがそれぞれ残るように順番に削除しながら、別名保存をしていくというものです。なので不要なスタイルやスウォッチなどの処理はしてません。

こんな長いドキュメントを

スプレッドごとにドキュメントを分割 /images/2011/01/divide_this.png

普通にスプレッドを削除するだけだと、ページの移動やスプレッドの移動を許可している場合、ごちゃごちゃページが動き回る場合があるのでまず固定、

スプレッドごとに現在の index やページ範囲などの情報をカスタムラベルに設定していきます。

オリジナルにごちゃごちゃ手を加えるのはちょっとイヤなのでバックアップファイルを別名保存しこれを作業用ファイルとしていき、後で抹消します。

実行すると

スプレッドごとにドキュメントを分割 /images/2011/01/divide_result.png

オリジナルと同じ階層に「div」というフォルダをつくって、分割ドキュメントをページ範囲の名前で生成していきます。

スプレッドごとにドキュメントを分割 /images/2011/01/divide_1415.png

分割されたドキュメントは、こんな感じでスプレッドがロックされますので、開始番号によって崩れることがないです。開始番号もリストアするので維持されます。

/**
 *  divide document by per spread
 *  2011-01-13.
 */
(function () {
  var doc = app.documents[0];
  if ( doc.saved === false || doc.modified === true) {
    alert("please save document");
    exit();
  };
  // disallow document page shuffling ドキュメントページの移動を許可しない
  doc.documentPreferences.allowPageShuffle = false;

  var spr_obj = doc.spreads;

  for (var i=0, iL=spr_obj.length; i < iL ; i++) {
    // disallow pages of each spreads shuffing 各選択スプレッドの移動を許可しない
    spr_obj[i].allowPageShuffle = false;
    var pag_obj = spr_obj[i].pages;
    var spr_name = pag_obj.length > 1 ? pag_obj[0].name+"-"+pag_obj[pag_obj.length-1].name : pag_obj[0].name;
    spr_obj[i].insertLabel('sp_id', ""+i);

    // store spread range (ex. 1, 2-3, 4-5) for each indd name
    spr_obj[i].insertLabel('sp_name', spr_name);

    // store first page number of spread 
    spr_obj[i].insertLabel('start_p_num', pag_obj[0].name.replace(pag_obj[0].appliedSection.name,""));
  };
  // remember document path to re-open
  var org_doc_path = doc.fullName;
  // remember spread length
  var iiL = spr_obj.length;
  // create "div" folder for divided documents
  var new_fd_path = org_doc_path.parent + "/div/";
  Folder(new_fd_path).create();

  // create touch up indd as backup
  doc.close(SaveOptions.NO, new File(org_doc_path+".bk"));

  // re-open
  for (var is=0, isL = iiL; is < isL; is++){
    var doc2 = app.open(File(org_doc_path+".bk"), false);
    var spr_obj2 = doc2.spreads;

    // remove other spreads
    for (var ii = iiL - 1; ii >= 0; ii--){
      if (spr_obj2[ii].extractLabel('sp_id') !== "" + is) {
        spr_obj2[ii].remove();
      };
    }

    // set page number start after disable continueNumbering
    doc2.sections[0].continueNumbering = false;
    doc2.sections[0].pageNumberStart = doc2.spreads[0].extractLabel('start_p_num') * 1;  

    // save as new document with page-range name
    doc2.close(SaveOptions.NO, new File(new_fd_path + spr_obj2[0].extractLabel('sp_name') + ".indd"));
  };

  // remove touch up .indd
  File(org_doc_path+".bk").remove();
}())

ちなみに、検証用のサンプルドキュメントをこんなので生成してテストしました。

/**
 *  create sample
 */

var doc = app.documents.add();
doc.documentPreferences.pagesPerDocument = 30;
doc.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN;
var col = ["Cyan","Magenta", "Yellow"]
for (var i=0; i < doc.pages.length; i++) {
  for (var ii=0; ii < 10; ii++) {
    var r = doc.pages[i].rectangles.add({geometricBounds : [0,0,50,50]});
    r.fillColor = col[ii%3];
    r.move([140 * Math.random(),200 * Math.random()]);
  };
  var lab = doc.pages[i].textFrames.add({geometricBounds : [20,20,100,100]});
  lab.parentStory.pointSize = "120pt";
  lab.parentStory.contents = doc.pages[i].name;
};
 
comments powered by Disqus
back to top