3 返信 最新の回答 日時: Sep 4, 2007 9:59 AM ユーザー:k-ooishi

    複数のテキストフレームにわたる文章から索引を作成するには?

    k-ooishi
      IndesignCS3 WindowsVista Javascriptです。<br />複数のテキストフレームにわたる文章から索引を作成するために、JavaScriptでテキストフレームから該当頁のテキストを抽出しようとしています。<br /><br />result="";<br />for (j=0; j<pageObj[k].textFrames.length; j++){<br />     result = result + pageObj[k].textFrames[j].contents;<br />}<br />       <br />このresultで集めた各頁のテキストから項目を検索すれば、索引を作成できると考えましたが、pageの下のテキストフレームはストーリー順に並んでいないため、収集されたテキスト の順番がデタラメになってしまい、この方法ではテキストフレームの境目をまたがる語句は正確にヒットしません。<br />では、テキストフレームのリンクを生かして収集すればよいと考え、下記のように変更しました。<br />       <br />result="";<br />function get_textframe_contents(some_textFrame,original_text){     <br />     var result = original_text + some_textFrame.contents;<br />     if(some_textFrame.nextTextFrame!=null){<br />          result=get_textframe_contents(some_textFrame.nextTextFrame,result)<br />     }<br />     return result;<br />}<br /><br />for (j=0; j<pageObj[k].textFrames.length; j++){<br />     if(pageObj[k].textFrames[j].previousTextFrame==null){     <br />          result = result + get_textframe_contents(pageObj[k].textFrames[j],""); <br />     }<br />}<br /><br />こんどは、テキストフレームのリンクを生かして順番にテキストを収集できました。この方法ではテキストフレームの境目の語句も正確に拾うことができます。<br />しかし、テキストフレームが次のページにまたがっているものは、正しい頁がとれないことになります。<br />テキストフレームのparent属性でpageが取れれば(頁またがりの語句は除いて)なんとかなると思うのですが、テキストフレームのparent属性では、page,spread, pageitemのどれが取れるか定まっていないらしく、役に立ちません。<br /><br />ということは、テキストフレームから該当頁のテキストを抽出し、そこから索引を作成するという考え方自体が、Indesignのオブジェクト体系とマッチしていないということでしょうか ?<br />複数頁にわたる複数のテキストフレームの文章から索引を作るにはどう考えるのが適切なのでしょうか?
        • 1. Re: 複数のテキストフレームにわたる文章から索引を作成するには?
          Level 1
          >テキストフレームのparent属性では、page,spread,pageitemのどれが取れるか定まっていない

          たしかにそうですが、インラインフレームや図形中にいれたもの、グループ化しているもの以外
          (つまりページ上に直接配置したもの)についてはpageまたはspreadが返って来ると思います。
          pageが返って来ればページ数は取得できるはず。
          もしspreadが返って来たときはテキストの座標から、右ページか左ページを特定できると思います。
          (試してませんが)
          text.horizontalOffset(テキストのx座標)
          text.baseline(テキストのベースラインのy座標)
          つまりこの2つのプロパティを使うことで、テキストの座標(イラストレータでいうとポイント
          テキストを左揃えで作成したときのアンカーポイントの位置)が取得できると思います。(あくまで推測)

          また、次の方法で取得する手もあります。
          http://forums.adobe.co.jp/cgi-bin/WebX/.38b834ad/2

          別の方法としてInDesignの索引機能を利用する方法があります。
          索引項目の取り方は次を参照。
          http://forums.adobe.co.jp/cgi-bin/WebX/.39b19831/3
          http://www15.ocn.ne.jp/‾preopen/idjs/idjsreadindex.html
          ここでよみ(sortOrder)を書き出したい順になるように設定し、索引を作成してから書き出す方法です。
          • 2. Re: 複数のテキストフレームにわたる文章から索引を作成するには?
            k-ooishi Level 1
            お〜まちさん
            いつもお世話になります。
            下記のコードでテキストフレームのparent属性を確認してみましたら、ほとんどがPageでしたが2件だけGroupが帰ってきました。
            (GroupのdocumentOffsetを取得しようとして異常終了していました)
            if(some_textFrame.parent.constructor.name=="Page"){
            //通常処理;
            }else{
            alert(some_textFrame.parent.constructor.name + fname);
            }
            今回のデータはほとんど頁単位で収まっており、例外的に頁をまたがるテキストフレームが無いかを確認する目的だったので、この2件だけ例外として目視確認して流すようにしました。
            ありがとうございました。

            教えていただいた他の方法も考えてみました。
            索引作成はInDesignの索引機能を利用する方法が一番スマートなんでしょうね。
            今回は、項目の抽出も、頁の抽出も、それぞれEXCELで出校し、加筆訂正後索引にまとめるという仕様なので、この方法は取りにくいですし、Bookに全頁をまとめなくてはならないのも、印刷 業の作業実態とはちょっとかけ離れているのですが、この方法も習得しておきたいと思います。
            どうも、ありがとうございました。
            • 3. Re: 複数のテキストフレームにわたる文章から索引を作成するには?
              k-ooishi Level 1
              InDesignの索引機能を利用する方法をためしています。
              気づいたのですが、
              CS2では、索引語句のInsertionPointを得るのは、
              var newEntries = app.activeDocument.search(...);
              という文法でしたが、
              CS3ではsearch()が廃止されて、

              var newEntries = app.activeDocument.findText();
              とか、
              var newEntries = app.activeDocument.findGrep();
              で、探すようです。
              (InDesign CS3 スクリプティング ガイド JS.pdf)

              このあたりは、CS、CS2、CS3みんな書き方が変わってますね…。やれやれ。
              (覚書として書き込み)