M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2008年9月21日 14:11

あふれテキストフレームの中の文字をつぶしてあふれ解消するInDesign JavaScript(書き直し版)

このエントリーをはてなブックマークに追加 mixiチェック

過去に書いたInDesignのJavaScriptであふれテキストフレームの中の文字を、あふれなくなるまでつぶす、というものを書き直しました。

3年半ぶりのInDesign JavaScriptなんで書き方おかしいところはご容赦。Windows版InDesign CS3で動作確認しています。

あふれ解消したいテキストフレーム(複数可)を選んで、実行してください。

最新版はCodeReposにコミットすることにしました。
http://svn.coderepos.org/share/platform/indesign/fit_text/javascript/trunk/fit_text.jsx

CodeReposには、InDesignのスクリプトを開発する場所がなかったので、application/indesignていうのを新たに作ったけど、良かったのかな。

Filename: fit_text.jsx

/*
filename: fit_text.jsx
ver. 0.1 初版 http://blog.dtpwiki.jp/dtp/2005/03/indesigncsjavas_1.html
ver. 0.2 
         テキストフレーム内のすべてのパラグラフで実行
         縦組・横組で判断して個別対応
         テキストフレーム内のテキストを選択していた場合に対応
         TextFrameオブジェクトにメソッドを拡張する形で実装
ver. 0.3 http://blog.dtpwiki.jp/dtp/2008/09/indesign-javasc.html
         パラグラフ選択ではなくparentStoryで選択するようにした
*/
 
(function(){
  
  
  //TextFrameオブジェクトにfitTextHolizontalScaleメソッドを拡張
  TextFrame.prototype.fitTextHolizontalScale = function(limit) {
    var self = this;
    for ( var i = 100; i >= limit; i--) { // 100からlimitまで
                                          // 1ずつ減らす
      if ( !self.overflows ) break; // あふれ解消したらループ
                                    // 抜ける
      self.parentStory.horizontalScale = i;
    }
    return;
  };
  
  //TextFrameオブジェクトにfitTextVerticalScaleメソッドを拡張
  TextFrame.prototype.fitTextVerticalScale = function(limit) {
    var self = this;
    for ( var i = 100; i >= limit; i--) { // 100からlimitまで
                                          // 1ずつ減らす
      if ( !self.overflows ) break; // あふれ解消したらループ
                                    // 抜ける
      self.parentStory.verticalScale = i;
    }
    return;
  };
  
  // ストーリーの方向により処理を分岐(実際に呼ぶのは
  // このメソッド)
  TextFrame.prototype.fitText = function(limit) {
    var self = this;
    var idStoryOrientation = {
      1752134266: 'idHorizontal',
      1986359924: 'idVertical',
    };
    if (idStoryOrientation[
          self.parentStory.storyPreferences.storyOrientation
        ] == 'idHorizontal') {
      this.fitTextHolizontalScale(limit);
    } else {
      this.fitTextVerticalScale(limit);
    }
    return;
  };
  
  
  // メインルーチン
  
  // InDesign上で選択中のオブジェクトの一覧を取得
  var selObjs = app.activeDocument.selection;
  
  // 選択しているオブジェクトのコンストラクタを確認して、
  // フィットするしない判断
  for (var i = 0; i < selObjs.length; i++) {
    var selObj = selObjs[i];
    if ( selObj.constructor.name == 'TextFrame' ) {
      // テキストフレームだった場合
      var textFrameObj = selObj;
      textFrameObj.fitText(10); // 最小10%まで文字つぶす
    }
    else if ( selObj.constructor.name == 'Text' ) {
      // テキストフレーム内のテキストが選択されていた場合
      // テキストが所属するフレームを選択してfit
      var textFrameObj = selObj.parentTextFrames[0];
      textFrameObj.fitText(10); // 最小10%まで文字つぶす
    }
  }
  return; // メインルーチン終わり
 
})()

投稿 大野 義貴 [InDesign] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2605

コメント(3)

さっそくこのスクリプトを使わせていただいております。

この機能にテキストオブジェクトを自動で全て選択させる機能と、グループを解除しなくてもあふれを解消できるようにしたいのですが色々試してみてもうまくいきません。

ものによっては「Error Number:45」というエラーを出してしまうInDesignデータもありました。

どうすればいいのか全くわかりません。助けて下さい。

現在のスクリプトは、選択したオブジェクトの中のTextFrameだけを処理していたわけですが、「選択したオブジェクト」というのを、「すべてのアイテム」と変更してみるのは検討されたでしょうか。

変更箇所は、

  // InDesign上で選択中のオブジェクトの一覧を取得
  var selObjs = app.activeDocument.selection;

になります。

次に、グループを解除しなくても、ということですが、Groupオブジェクトになっているもののアクセス方法は、
http://kanemu1117nc.blogspot.com/2008/09/blog-post.html
が参考になります。

今回のスクリプトでいえば、

  // 選択しているオブジェクトのコンストラクタを確認して、
  // フィットするしない判断
  for (var i = 0; i < selObjs.length; i++) {
    var selObj = selObjs[i];
    if ( selObj.constructor.name == 'TextFrame' ) {
      // テキストフレームだった場合
      var textFrameObj = selObj;
      textFrameObj.fitText(10); // 最小10%まで文字つぶす
    }
    else if ( selObj.constructor.name == 'Text' ) {
      // テキストフレーム内のテキストが選択されていた場合
      // テキストが所属するフレームを選択してfit
      var textFrameObj = selObj.parentTextFrames[0];
      textFrameObj.fitText(10); // 最小10%まで文字つぶす
    }
  }

の箇所を、関数にしてしまい、再帰処理が出来るようにします。たとえば、
function fitText() {
...
}
でくくります。

その上で、selObj.constructor.name == 'Group'のとき、fitText(selObj.allPageItems);で、再帰呼び出しが出来ます。

エラーが出るものに関しては、再現するデータをいただけないことにはこちらではどうしようもありませんので、申し訳ありません。

see also revision 22328

お早い回答ありがとうございます。勉強不足で誠に申し訳有りません。
さっそく改造してみたいと思います!

コメントする