DTP Booster 13のお題(解答編)

| コメント(4)

とりあえず。お題答えてくれた方で、こちらでキャッチできた方。

カネムーメモ: たけうちとおるさんの「DTP Booster 13のお題」をやってみた
var fullName=doc.fullName.absoluteURI←この方法も考えた!
while(docs.length>0){でドキュメントを閉じていく方法も良い方法だと思っています。

Diary NET. 1mgさん InDesign_ エラー処理について考えてみる
pdfPath=doc[i].fullName.toString()の方法は知りませんでした。

ディザInDesignのブログInDesign_ エラー処理について考えてみるへのコメント(お〜まちさん)
本物クオリティを求めるならこちらを。

っていうか、そうそうたるスクリプターの面々。すんごいプレッシャーになります。あのぉまいりました......汗 せうぞーさんからけっこう答えてるよとの連絡があったときしまったーって思いましたよ(笑)

ということで、解答はカネムーさん、mgさん、お〜まちさんのブログを見て下さい。というわけにもいかないので、セミナーでやった解答を。
※正直言うと、さくさく作れないし、回り道も多いしで僕はスクリプト上手ではないんですよ。いつも悩んでますって。

ExportPDFを試行錯誤しながら作成する

開いているドキュメントをPDF/X-1a:2001で保存するスクリプトを開発。ドキュメントが保存されている同一階層にPDFを作成

開いているドキュメントすべてに処理を実行するには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にドキュメントをセット

PDFを保存するためにドキュメントのパスを調べる

まずはドキュメントが保存されている場所を調べる。Documentをオブジェクトモデルビューアで見るとfilePathというプロパティがあるのでこれにアタリをつけデバッグモードで下記を実行

	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を調べてみると保存されたファイルの親フォルダ。欲しいのは親フォルダではなくドキュメントのフルパスなのでこれは違う。

fullNameがドキュメントのフルパス?

次に変数myDocu(現在開いているドキュメント)をデータブラウザで調査。いろいろ項目があり、fullNameが該当する。
displayNameでファイル名が取れることがわかる。
フルパスが分かれば下記のように検索置換で".indd"を".pdf"に置き換えてやれば良い。(ファイル名や親フォルダもわかるので、もっと自由自在にファイル名を付ける事も出来る。)
さっそく下記でテスト
	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」という文字が入ったフォルダがあると動作しないので注意。

PDFの書き出し

次にPDF書き出し方法を調査。オブジェクトモデルビューアで調べるのは面倒なので「InDesign JavaScript PDF 書き出し」でGoogle検索するといくつかのサイトがヒット(今作っているPDF書き出しスクリプトはSapmleScriptに入っているようです。なんだー。またやっちまったよー。まぁいいや。http://d.hatena.ne.jp/seuzo/20080904/1220458928)。
Document.exportFileを使うとPDF書き出しができるらしい(ソースを出して下さっているサイトに感謝(http://tu-kazu.jp/javascript1.php))。

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検索する。

「PDFx/1-a」などを文字列で指定したいのでGoogle検索。「お〜まち」さんのObject Modelが見つかる。StandardsComplianceのところにidPDFX1a2001Standardがあったのでそれと似た項目を再びオブジェクトモデルビューアで調べるがちょっと難しい。

再度「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);
	}

ExportPDF2(ダイアログ版)の解説

//ダイアログ表示のおまじない
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);
			//保存せずに閉じる
		}
	}
}

まとめたら4行にもなる。

でも4行がすごいわけではない。かえって分かりにくい。
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);
}
Comments are nofollow setting

コメント(4)

わたしは別にお題に答えてるわけではないんですが(笑)
折角なのでひとつだけ突っ込みを。

var pdfPath = inddPath.replace(".indd",".pdf");

var pdfPath = inddPath.substr(0, inddPath.length - 4) +".pdf";
のほうがよいです。こうすると途中に「.indd」があっても関係ありません。
さらに言うなら、

var pdfPath = inddPath.substr(0, inddPath.lastIndexOf(inddPath, ".") - 1) +".pdf";

にすると元のファイルの拡張子が「.eps」だろうが「.ai」だろうが「.pdf」に変えてくれます。

.indd に限定するなら,
var pdfPath = inddPath.replace(/\.indd$/, ".pdf");
で置換対象をファイル名末尾の .indd に制限できますよ。

なるほど。こういうところ皆さん上手いですよね。
参考にさせていただきます。
lastIndexOfとかは考えてもいなかったなぁ。正規表現も。
単純に
var pdfPath = inddPath +".pdf";
これでもいいかなとは思ってましたが(笑)

こちらのほうがおもしろくて参考になる!
chalcedonyの外部記憶装置・出張版
http://d.hatena.ne.jp/chalcedony_htn/20100603/1275558823

コメントする

エントリー一覧

OpenID対応しています OpenIDについて
Powered by Movable Type 8.0.2
漢字イラストロジック-脳トレ京
FREE ONLINE SUDOKU