9/25土曜日、大阪DTP勉強会にせうぞーさん(名もないテクノ手)が来られます。
また、後半のディスカッションでは私も参加させていただくのですが
秋葉秀樹さん(WebCreator Extends Designer!?)そして
あかねさん(ちくちく日記)も遠方から参加されます。
東京の人もうらやむぐらいのかなり豪華なセミナーです。
(私はカウントしないで。関西ではいつもいますし(笑))
えー。スクリプターの皆さんや正規表現使ってみたい人はもちろん
DTPやってる方はぜひご参加下さい。
9/25土曜日、大阪DTP勉強会にせうぞーさん(名もないテクノ手)が来られます。
また、後半のディスカッションでは私も参加させていただくのですが
秋葉秀樹さん(WebCreator Extends Designer!?)そして
あかねさん(ちくちく日記)も遠方から参加されます。
東京の人もうらやむぐらいのかなり豪華なセミナーです。
(私はカウントしないで。関西ではいつもいますし(笑))
えー。スクリプターの皆さんや正規表現使ってみたい人はもちろん
DTPやってる方はぜひご参加下さい。
7/24日 大阪DTPの勉強部屋の電子書籍勉強会でお話させていただきます。
それを記念して(自分を追い込むために)電子書籍のホームページを立ち上げました。
電子書籍やクロスメディアノートこちらもよろしければご覧下さい。
ePubを少々いじって実験とかしていたのでパネラーとして招待されたのですが、だんだんDRMに興味が出てきてPDFに認証をかけるDEMOをさせていただきます。(そのかわりePubは勉強不足だ)
内容としては
PDFに簡易DRMをしてみる
あたりの話をしたいと思います。自分の中ではiBookStoreやAppStoreをはじめ、その他同様のサービスを使って販売するより、自前でなんとか出来ないかを考えています。もうキャンセル待ちみたいですが、興味のある方は、ぜひご参加ください。(懇親会に?)もしくはご連絡いただければと思います。特に出版系の方はいろいろご意見を聞かせていただけるとありがたいです。
とりあえず。お題答えてくれた方で、こちらでキャッチできた方。
カネムーメモ: たけうちとおるさんの「DTP Booster 13のお題」をやってみた
var fullName=doc.fullName.absoluteURI←この方法も考えた!
while(docs.length>0){でドキュメントを閉じていく方法も良い方法だと思っています。
Diary NET. 1mgさん InDesign_ エラー処理について考えてみる
pdfPath=doc[i].fullName.toString()の方法は知りませんでした。
ディザInDesignのブログInDesign_ エラー処理について考えてみるへのコメント(お〜まちさん)
本物クオリティを求めるならこちらを。
っていうか、そうそうたるスクリプターの面々。すんごいプレッシャーになります。あのぉまいりました......汗 せうぞーさんからけっこう答えてるよとの連絡があったときしまったーって思いましたよ(笑)
ということで、解答はカネムーさん、mgさん、お〜まちさんのブログを見て下さい。というわけにもいかないので、セミナーでやった解答を。
※正直言うと、さくさく作れないし、回り道も多いしで僕はスクリプト上手ではないんですよ。いつも悩んでますって。
開いているドキュメントすべてに処理を実行するにはforを使う
for(var N = 0;N < app.documents.length;N++){
var myDocu = app.documents[N];
}
for(カウンタ=初期値; カウンタ継続条件; 次のカウンタ値){
処理
}
varははじめて登場する変数の前につける約束事
N = 0;はカウンタ=初期値なので変数Nが0スタートということ
N < app.documents.length;はカウンタ継続条件ですのでNがドキュメント数より小さい間繰り返す(app.documents.length;は開いているドキュメントの数)
N++は次のカウンタ値なので次の繰り返し時にNに+1する
var myDocu = app.documents[N];で変数myDocuにドキュメントをセット
for(var N = 0;N < app.documents.length;N++){
var myDocu = app.documents[N];
var myPath = myDocu.filePath;
}


ExtendScript Toolkitでvar myPath = myDocu.filePath;の行に赤い●を付けた状態で実行。スクリプトがストップするのでウィンドウメニューからデータブラウザを表示させる。そしてスクリプトを1行動かすと、変数myPathが出現。myPathを調べてみると保存されたファイルの親フォルダ。欲しいのは親フォルダではなくドキュメントのフルパスなのでこれは違う。

さっそく下記でテスト
for(var N = 0;N < app.documents.length;N++){
var myDocu = app.documents[N];
var myPath = myDocu.fullName;
//変数myPathにドキュメントのフルパス
var pdfPath = myPath.replace(".indd",".pdf");
//replaceで".indd"を".pdf"に検索置換
alert(pdfPath);
//alertでダイアログを表示してみる。
}
var pdfPath = myPath.replace(".indd",".pdf");でエラー
もう一度データブラウザでmyPathを見るとmyPathの横に[File]と出ている。これはフルパス文字列ではなくファイルオブジェクト。展開して見てみると、この中にもdisplayNameやfullNameやfsNameなどがありfullNameを使ってみれば良さそう。
fullName中のfullNameとはややこしいですが試してみましょう。
先ほどの
var myPath = myDocu.fullName;
を変更して下記に
var myPath = myDocu.fullName.fullName;
※または2行にわけて
var myFile = myDocu.fullName; var myPath = myFile.fullName;
実行しするとエラー無しで成功。※パスの途中に「.indd」という文字が入ったフォルダがあると動作しないので注意。

Document.exportFileをオブジェクトモデルビューアで調べる。(DocumentとDocumentsと2つあるがDocumentのほう)
1つめの引数はExportFormat.pdfType
2つめの引数はファイルオブジェクト
4つめの引数はPDFExportPreset
となっています。(3つめはオプション)
1つめの引数ExportFormat.pdfTypeはPDFで書き出しするのでこのままでOKです。(検索ででてきた指定方法)
2つめの引数はファイルオブジェクトなので先ほど作成したフルパスをファイルオブジェクトに変換します。
具体的にはvar pdfFile = new File(pdfPath);です。
4つめの引数はPDFExportPresetでここでPDFx/1-aを設定できそうです。


下記みたいなので動くかテスト。しかしエラー
for(var N = 0;N < app.documents.length;N++){
var myDocu = app.documents[N];
var myFile = myDocu.fullName;
var myPath = myFile.fullName;
//変数myPathにドキュメントのフルパス
var pdfPath = myPath.replace(".indd",".pdf");
var pdfFile = new File(pdfPath);
myPDFExportPreset = "PDFx/1-a";//★ここがエラー
myDocu.exportFile(ExportFormat.pdfType, pdfFile,false, myPDFExportPreset);
}

ウィンドウ下のエラーに注目。myPDFExportPresetが必要なのに値"PDFx/1-a"になっていると言われています。文字列ではダメですということです。
再びPDFExportPresetをオブジェクトモデルビューアで見てみるといろいろあって、どれをつかったらいいかわかりにくい。


再度「PDFExportPreset」でGoogle検索。スバリ下記のようなソースが見つかりました。
var myPDFExportPreset = app.pdfExportPresets.item("PDFの設定名");
でいけるみたいなのでさっそく下記のように設定して試します。
for(var N = 0;N < app.documents.length;N++){
var myDocu = app.documents[N];
var myFile = myDocu.fullName;
var myPath = myFile.fullName;
//変数myPathにドキュメントのフルパス
var pdfPath = myPath.replace(".indd",".pdf");
var pdfFile = new File(pdfPath);
myPDFExportPreset = app.pdfExportPresets.item("PDF/X-1a:2001 (日本)");
//★ここがエラー
myDocu.exportFile(ExportFormat.pdfType,pdfFile,false, myPDFExportPreset);
}
またエラー。こういう場合はデバッグしてpdfExportPresetsにどんな値があるのか調べます。pdfExportPresetsはPDF書き出しプリセットの事なのでアプリケーション直下にあると思われます。
(ドキュメントが変わっても常に同じプリセットがあるので)オブジェクトモデルビューアでlengthというプロパティがあるので下記のようにループしてPDF/X-1a:2001 (日本)がでてくるまでチェックすればよいと思います。実行してみましょう。
for(var N = 0;N < app.pdfExportPresets.length;N++){
var presetname = app.pdfExportPresets[N];
}
presetnameの横に●をつけて実行しpresetnameを展開するとnameのプロパティに日本語が表示されています。
1つづつ見ていくと"[PDF/X-1a:2001 (日本)]"があります。


myDocu.close(SaveOptions.NO);
を使う。ただし閉じるとドキュメントの配列が変わるので逆向きループすると良い。(documents[0]を閉じるとdocument[1]が[0]になるのでうまく行かない)
という事で完成したスクリプトはこちら。myPDFExportPresetはループの中ではなく最初に取得した方が良い。
<pre>
var myPDFExportPreset = app.pdfExportPresets.
item("[PDF/X-1a:2001 (日本)]");
for(var N = app.documents.length - 1;N > -1 ;N--){
var myDocu = app.documents[N];
var myFile = myDocu.fullName;
var myPath = myFile.fullName;
var pdfPath = myPath.replace(".indd",".pdf");
var pdfFile = new File(pdfPath);
myDocu.exportFile(ExportFormat.pdfType, pdfFile, false,myPDFExportPreset);
myDocu.close(SaveOptions.NO);
}
//ダイアログ表示のおまじない
app.scriptPreferences.userInteractionLevel=1699311169;
var preset_count = app.pdfExportPresets.length;
var pdf_preset_name = new Array();//配列pdf_preset_name
for(var i = 0; i < preset_count; i++){
pdf_preset_name.push(app.pdfExportPresets[i].name);
}//配列にPDF書き出しプリセットの名前を入れる。
makedialog(pdf_preset_name);
function makedialog(pdf_preset_name){
//ダイアログを作成する
myDialog = app.dialogs.add({name:"PDF書き出し"});
with(myDialog){with(dialogColumns.add()){
with (dialogRows.add()){//1段増やす
staticTexts.add({staticLabel:"書出プリセット選択"});
}
with (dialogRows.add()){//1段増やす
var pdf_preset = dropdowns.add
({stringList:pdf_preset_name, selectedIndex:0,minWidth:120});
}
with (dialogRows.add()){//1段増やす
var window_close = checkboxControls.add
({staticLabel:"ドキュメントを閉じる", checkedState:true})
}
}}
var myReturn = myDialog.show();//ダイアログ表示
//ここから処理を行う
if (myReturn == true){
pdf_preset_num = pdf_preset.selectedIndex;
//選ばれた書出プリセット番号をpdf_preset_numに
var window_close_flg = window_close.checkedState;
//ドキュメントを閉じるかどうか
myDialog.destroy();//ダイアログを破棄する
export_pdf(pdf_preset_num,window_close_flg);
//export_pdfを呼ぶ(下記)
}else{myDialog.destroy();}//キャンセル時
}
function export_pdf(export_pdf_name,window_close_flg){
var myPDFExportPreset =
app.pdfExportPresets[pdf_preset_num];
//myPDFExportPresetに選択されたプリセットを入れる
for(var N = app.documents.length - 1;N > -1 ;N--){
var myDocu = app.documents[N];
var myFile = app.documents[N].fullName;
var inddPath = myFile.fullName;
var pdfPath = inddPath.replace(".indd",".pdf");
var pdfFile = new File(pdfPath);
app.documents[N].exportFile(ExportFormat.pdfType,pdfFile, false,myPDFExportPreset);
if(window_close_flg == true){
myDocu.close(SaveOptions.NO);
//保存せずに閉じる
}
}
}
for(var N = 0;N < app.documents.length;N++){
app.documents[N].exportFile(ExportFormat.pdfType, File(app.documents[N].fullName.fullName.replace(".indd",".pdf")), false,app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]"));
myDocu.close(SaveOptions.NO);
}