2010年6月アーカイブ

24)白のオーバープリントのチェックと解除

| コメント(3)

●実行環境
IllustratorO.app
Illustrator CS3、CS4のオーバープリント解除処理をします。

AI_CheckOverPrint.app
Illustrator CS3、CS4のオーバープリントを調べオーバープリントのメッセージを表示します。

●インストール
「IllustratorO.app」を好きな場所にコピーしてください。

●実行方法
「IllustratorO.app」をダブルクリックして起動します。
TEXTのみボタン
TEXTのみオーバープリント解除を行います。

パスのみ
パスのみオーバープリント解除を行います。

全て実行
TEXTをパス全てオーバープリント解除を行います。

※アピアランスでフチ文字などが適応されたテキストには効きません。
(これは標準フィルタと同じですがスクリプトで制御できないようです)

白のオーバープリントドキュメント

オーバープリントプレビュー

AI_CheckOverPrint.appでチェックできる。オーバープリントがあればExistの表示

IllustratorO.appは解除。

解除結果のオーバープリントプレビュー

■動作の定義
行間自動の改行に色をつけると行間がくずれるため改行以外にオーバープリント解除をする。

すべてのテキストフレームに対して
改行以外で塗りがグレースケールのK0の文字の塗りにオーバープリント解除
改行以外で塗りがCMYKモードでのC0M0Y0K0の文字の塗りにオーバープリント解除
改行以外で線がグレースケールのK0の文字の線にオーバープリント解除
改行以外で線がCMYKモードでのC0M0Y0K0の文字の線にオーバープリント解除

すべてのパスに対して
塗りがグレースケールのK0のパスの塗りにオーバープリント解除
塗りがCMYKモードでのC0M0Y0K0のパスの塗りにオーバープリント解除
線がグレースケールのK0のパスの線にオーバープリント解除
線がCMYKモードでのC0M0Y0K0のパスの線にオーバープリント解除

グラフアイテムやパターンなどには効きません。

ダウンロードはこちらoverprint.zip

23)テキストを全てアウトライン

| コメント(2)

IllustratorCS4と5で最前面のドキュメントすべてのテキストフレームをアウトライン化します。アウトライン化するまえにバックアップしておく事を強くおすすめします。
たぶん他のバーションのIllustratorでも動くと思います。

DTPBooster13で質問されて、出来るかなーって検証してたら結局作ってしまいました。

こうちゃん犬猫まみれさんもAppleScriptでアップされています。会場ではじめてお会いしました。ずいぶん若い好青年だった。

■■■使い方■■■
Illustratorドキュメントを開いている状態で使用してください。

実行すると
まずは全レイヤーのロックを解除します。
後はテキストフレームのロックを解除してどんどんアウトライン化していきます。
非表示のオブジェクトは一瞬表示してアウトラインして非表示に戻します。

非表示のレイヤーの中などにテキストフレームがあり、失敗した場合はメッセージを出します。

DTPBooster13の質問のお答え。難しいかと思ったら簡単だった。
ちなみにconvert to pathsがあるって質問に答えたんですがAppleScriptでした。

ダウンロードはこちらAiOutline.zip

ソースも

var mydoc = app.documents[0];
//レイヤーのロックだけは解除しておく
layerUnLock(mydoc);
var tfitems = mydoc.textFrames;
var tfcount = tfitems.length;
var mymsg = "";
for(var i = tfcount - 1;i > -1;i--){
	try{
		visiblebak = tfitems[i].hidden;
		tfitems[i].locked = false;
		var newgroup = tfitems[i].createOutline();
		newgroup.hidden = visiblebak;
	}catch(e){
		mymsg = "アウトラインできなかったオブジェクトがあります。";
	}
}
if(mymsg != ""){
	alert(mymsg);
}
function layerUnLock(myObj){
	var lycount = myObj.layers.length;
	for(var n = 0;n < lycount;n++){
		if(myObj.layers[n].visible == true){
			myObj.layers[n].locked = false;
			layerUnLock(myObj.layers[n])
		}
	}
}

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);
}

DTPBooster13フォローアップ

| コメント(2)

DTPBooster13終わりました。
みなさんありがとうございました。会場へ来ていただいた皆さまをはじめ
twitterでも応援していただいてほんとに嬉しかったです。
なんか皆さんに支えられてるって感じです。心強かったですよ!

IllustratorCS5の原点移動によるスクリプトへの影響に付いて
IllustratorCS5では原点が左上になりました。画面上では左上から下に行くに従って0→100→200のように数値が増えていきますが、スクリプト的には0→-100→-200とマイナスになっていきます。いままでは左下原点だったので左下からさらに下に行くと0→-100→-200となっていたのですがCS5からは左上に来るという事になります。ですので座標を数値入力するようなスクリプトとか、用紙中央にオブジェクトを作成するようなスクリプトは注意が必要です。選択したオブジェクトの周りにトンボ的なスクリプトは問題ありません。

Illustratorの文字のアウトラインについて
下記で出来ました。でもドキュメント全てをアウトラインするには工夫が必要。がんばってくださいねー。ってかやっぱアウトライン好きですねー。InDesignに貼ってアウトラインワザを使った方が良いのでは?

app.activeDocument.layers[0].locked = false;
//レイヤーのロックを解除
app.activeDocument.textFrames[0].locked = false;
//テキストフレームのロックを解除
app.activeDocument.textFrames[0].createOutline();
//テキストフレームのアウトライン

スクリプトでしかできない事について
いろいろ話しましたがRRRさんが速く正確に大量に処理させても文句を言わないヤツって言ってました。たしかに人間の手では出来ないですね。

お題の解説は別ページにて。


DTP Transit
DTP Booster 013(Omotesando/100602)が終了しました #dtpbooster013 #cs5seminar

当日のスライドはこちら
スライド1

スライド2

いわもとブログ

カテゴリ

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