お知らせの最近のブログ記事

大阪DTP勉強会

| コメント(0) | トラックバック(0)

9/25土曜日、大阪DTP勉強会にせうぞーさん(名もないテクノ手)が来られます。

OSAKA0925.gif

また、後半のディスカッションでは私も参加させていただくのですが
秋葉秀樹さん(WebCreator Extends Designer!?)そして
あかねさん(ちくちく日記)も遠方から参加されます。

東京の人もうらやむぐらいのかなり豪華なセミナーです。
(私はカウントしないで。関西ではいつもいますし(笑))

えー。スクリプターの皆さんや正規表現使ってみたい人はもちろん
DTPやってる方はぜひご参加下さい。

7/24日 大阪DTPの勉強部屋電子書籍勉強会でお話させていただきます。

それを記念して(自分を追い込むために)電子書籍のホームページを立ち上げました。
電子書籍やクロスメディアノートこちらもよろしければご覧下さい。

ePubを少々いじって実験とかしていたのでパネラーとして招待されたのですが、だんだんDRMに興味が出てきてPDFに認証をかけるDEMOをさせていただきます。(そのかわりePubは勉強不足だ)


======================
 セキュリティ 
PDFに認証をかけて違法コピー出来ないようにする仕組みが いくつかのベンダーさんから提供されていますが、

もう少し簡単なものを試験的に作ってみました。 
======================

 

内容としては
PDFに簡易DRMをしてみる

iPad用に本棚をHTML5で作る

あたりの話をしたいと思います。自分の中ではiBookStoreやAppStoreをはじめ、その他同様のサービスを使って販売するより、自前でなんとか出来ないかを考えています。もうキャンセル待ちみたいですが、興味のある方は、ぜひご参加ください。(懇親会に?)もしくはご連絡いただければと思います。特に出版系の方はいろいろご意見を聞かせていただけるとありがたいです。

DTP Booster 13のお題(解答編)

| コメント(4) | トラックバック(1)

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

カネムーメモ: たけうちとおるさんの「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);
}

エントリー一覧

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja
たけうちとおるのホームページ「単福」 Word、ExcelのマクロやTips、GooglePicasaのAPIなど JAGAT認定クロスメディアノートの受験対策、php、JavaScript、Flash、css、MovableTypeなどweb系の情報 自動車の維持費をシミュレーション、エコカー、レンタカーとの比較 印刷通販の価格比較 印刷会社、大阪の遊文舎 議案書、 規約、予算書等の冊子の印刷、製本サービスの専門サイト 報告書・論文集等の印刷製本など小冊子のモノクロ印刷専門サイト