InDesignドキュメントのテキストをテキストファイルに書き出すスクリプト

[6353]InDesignドキュメントのテキストをテキストファイルに書き出すスクリプト | 投稿者:ラーマ | 投稿日:2011/12/13(Tue) 21:39:05
はじめまして。
InDesignドキュメント(500ファイル以上あります)の
テキストだけを別のテキストファイルに書き出す」という
業務が発生しそうなので、超初心者ながらスクリプトに
挑戦してみることにしました。

InDesign CS3自動化作戦 with JavaScript
*http://www.openspc2.org/book/InDesignCS3/)にある
"選択されたテキストフレーム内の文字をファイルに書き出す"
を一部書き換え(同ページ内の"テキストフレームのみ選択する"
のサンプルを使い、自動で選択できるようにしました)実行してみました。

テキストファイルに書き出す事は成功したのですが、書き出された
テキストファイルをチェックしてみると非表示レイヤーのテキストを
拾ってしまっています。
また、版面外のテキストフレームの内容が取得出来ていないようです。
以下の2点について、どういう書き方をしたらいいか教えていただけないでしょうか?

・非表示レイヤーにあるテキストフレームの内容を拾わないようにする
・版面外にあるテキストフレームの内容も取得する


また、上の話とは少し別なのですが例えば新ゴLと中ゴが使われている
テキストボックスのみを選択してその内容をテキストファイルに
書き出すようなことは出来るのでしょうか?

環境はWindowsXP、InDesignCS3のJavaScriptです。
よろしくお願いします。
» 1
現状のソースを提示していただければ、より明確に指摘できるんですが、
 そういうわけでアテズッポでいきます。

・非表示レイヤーにあるテキストフレームの内容を拾わないようにする
仮に処理対象を obj とします。
if(obj.itemLayer.visible==true){ 目的の処理 }
など挟んでみてください。


・版面外にあるテキストフレームの内容も取得する
おそらくfor文でdocument.pages を参照していると思われます。
版面外のオブジェクトの親はpageではなくspreadとなります。
ページごとじゃなくて構わないのであれば、for文のpages をspreadsに置換する事でとりあえず解決すると思います。
» 2
この手のスクリプトを書いたことがなかったので、自分も勉強がてらスクリプトを書いて試してみたのですが...
自分なりに書いてみて、(テキストの書き出し順やマスター上のアイテムの扱いは置いておいて)一応、動いたのですが、動作検証していると、いくつかのテキストフレームが書き出されませんでした。どうもShift-JIS範囲外の文字があると書き出せないようです。(Mac版CS5です)
どのみち使えないとは思いますが、こんな感じで書いてみました。

(function (){
var filename = File.saveDialog("書き出すファイル名を入力してください");
if (filename){
var fileObj = new File(filename);
var flag = fileObj.open("w");
if (flag){
var docObj = app.activeDocument;
for(var i=0; i<docObj.spreads.length; i++){
var pageObj = docObj.spreads[i].allPageItems;
for(var j=pageObj.length-1; j>-1; j--){
if((pageObj[j].constructor.name=="TextFrame")&&(pageObj[j].itemLayer.visible==true)){
if(pageObj[j].contents !=""){
fileObj.writeln(pageObj[j].contents+"\r");
}
}
}
}
fileObj.close();
alert("ファイルに書き出しました");
}else{
alert("ファイルが作成できません。アクセス権があるか確認してください");
}
}
})();

InDesign CS3自動化作戦 with JavaScript の"選択されたテキストフレーム内の文字をファイルに書き出す"のところにも、"もしかしたら、文字コードの関係で~"とありますが、十分な検証というより、別アプローチが必要な気がします。(Text.exportFile(~)だとUnicodeでテキスト書き出しできそうですが)

...。

あと、こちらが参考になると思います。
IndesignSecrets.com(*http://indesignsecrets.com/exporting-all-stories-text-rtf.php)
InDesign CS3のサンプルスクリプトの中に、全ストーリーを個別のテキストファイルに書き出すスクリプトがあるようです。
» 3
すみません、過去ログにこんなのがありました。別アプローチ云々は忘れていただいて...
*http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=4253
» 4
横から失礼します。

オメガ様

TextExportPreferences.CharacterSet

idUTF16 = 1937125686
辺りを設定してからの書き出しで
「Shift-JIS範囲外の文字」
には対応できませんか?
CS3だと,
idUnicode = 1249209961
を渡してあげる必要があります。
» 5
かえってややこしくしてしまったみたいで、すみません。
過去ログを参照して、上のスクリプトの6行目にあるif(flag){の次の行に
fileObj.encoding="UTF-8";
と入れるとShift-JIS外の文字も書き出せました。

あとは、どういった紙面の、どういった用途でのテキストが必要なのかに依りますが、
・テキストの書き出し順の制御(カネムーさんのテキスト連結スクリプト(記事No.6344参照)が参考になるはず)
・マスター上のアイテムの処理(マスターを使ってなければ必要なし)
・表の中のテキストの処理(表組機能を使ってなければ...以下略)
までできれば、実用レベルになるのではと思います。


流星光輝様

レスありがとうございます。
先に述べた別アプローチですが、過去ログでころっけさんが述べている通り
>全部のストーリーのコンテンツを連結したストリングを、新規テキストボックスを作って流し込み、それをテキスト書き出し
という手順を考えておりました。
おっしゃる通り、スクリプトからエンコーディングをUnicodeに指定してテキスト書き出しするには、
app.textExportPreferences.characterSet=TextExportCharacterSet.UTF8;
(CS3ではapp.textExportPreferences.characterSet=TextExportCharacterSet.UNICODE;)
としてから
text.exportFile(ExportFormat.TEXT_TYPE, fileObj);
というような手順で行う必要がありますね。
» 6
返信が遅くなり申し訳ありません。
教えていただいた書き方でなんとか出来ました。
レスをいただいたみなさま、ありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)