[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:946) Re: [AS-InDesign CS] PDFセーブするドロップレット



ちょっと書き直しました。
これで特に不具合情報がなければ、表に出します。



on open of theFiles
	my ver()
	--書き出しPDFスタイルを選択する
	set pdf_export_presets to my pdf_style()
	
	--ファイルのフィルタリング
	set my_files to my file_kind({"ind", "indd"}, {"IDd3"}, theFiles)
	
	--ファイルを開いて、コントロールルーチンへ
	repeat with i in my_files
		tell application "InDesign CS_J"
			set user interaction level to never interact --ユーザー操作を禁止します
			try
				open i
			on error errMsg number errNum
				set user interaction level to interact with all --ユーザー操作の再開
				my my_error("誤りが起きました;" & i & return & "処理を中断しますか?" & return & errMsg & return & errNum, false)
			end try
			set user interaction level to interact with all --ユーザー操作の再開
			my control_routin(pdf_export_presets)
			close document 1 saving no
		end tell
	end repeat
	
	--終了の合図
	say "Work was finished. " & (length of my_files) & " files were processed."
end open

on run
	my ver()
	my doc_exists()
	--書き出しPDFスタイルを選択する
	set pdf_export_presets to my pdf_style()
	
	my control_routin(pdf_export_presets)
	--終了の合図
	say "Work was finished. "
end run


--------------------------------------------------------●コントロールルーチン
to control_routin(pdf_export_presets)
	
	set save_PDF_path to my make_PDF_path()
	
	try
		my save_PDF(save_PDF_path, pdf_export_presets)
	on error errMsg number errNum
		my my_error("誤りが起きました;" & save_PDF_path & return & "処理を中断しますか?" & return & errMsg & return & errNum, false)
	end try
end control_routin


--------------------------------------------------------●InDesignバージョン確認ルーチン
to ver()
	tell application "InDesign CS_J"
		set my_version to version
		if my_version < 3 and my_version > 3.9 then
			activate
			my my_error("このプログラムはInDesign CS以外では動作しません", true)
		end if
	end tell
end ver


--------------------------------------------------------●書き出しPDFスタイルを選択する
to pdf_style()
	tell application "InDesign CS_J"
		set pdf_export_presets to name of PDF export presets
		set pdf_export_presets to choose from list pdf_export_presets with prompt ("PDF書き出しプリセットを選んでください") as Unicode text
	end tell
	if pdf_export_presets = false then my my_error("処理を中止します", true)
	return pdf_export_presets as Unicode text
end pdf_style


--------------------------------------------------------●ドキュメントが開かれているかどうか
to doc_exists()
	tell application "InDesign CS_J"
		if not (exists document 1) then
			activate
			my my_error("ドキュメントが開かれていません", true)
		end if
	end tell
end doc_exists



----------------------------------------------●必要なファイルだけをフィルタして返します
to file_kind(extention_list, type_list, theFiles)
	set my_files to {}
	set extention_list to my conv_unicode(extention_list)
	set type_list to my conv_unicode(type_list)
	
	ignoring case
		tell application "Finder"
			repeat with i in theFiles
				if extention_list contains ((name extension of i) as Unicode text) then
					set end of my_files to contents of i
				else if (kind of i) is "フォルダ" as Unicode text then
					activate
					display dialog "フォルダ「" & (name of i) & "」の中の全ファイルを処理します" buttons {"キャンセル", "OK"} default button 2 with icon 0
					set my_files to my_files & my file_kind(extention_list, type_list, every file in folder i)
				else if type_list contains ((file type of i) as Unicode text) then
					set end of my_files to contents of i
				else
					activate
					display dialog "ファイル「" & (name of i) & "」は処理ファイルとして不適当です" buttons {"キャンセル", "OK"} default button 2 with icon 0
				end if
			end repeat
		end tell
	end ignoring
	return my_files
end file_kind


--------------------------------------------------------●PDFのパスを生成する
to make_PDF_path()
	tell application "InDesign CS_J"
		tell document 1
			set my_name to (name) as Unicode text
			try
				set my_folder to (file path) as Unicode text
			on error errMsg number errNum
				activate
				set save_PDF_path to choose file name with prompt ("どこにPDFを保存しますか?") as Unicode text default name my_name & ".pdf"
				return save_PDF_path
			end try
			
			--拡張子の変換
			if my_name ends with ".indd" then
				set save_PDF_path to my_folder & my as_replace(my_name, ".indd", ".pdf")
			else
				set save_PDF_path to my_folder & my_name & ".pdf"
			end if
			
		end tell
	end tell
	set save_PDF_path to my filepath_test(save_PDF_path, 1)
	return save_PDF_path
end make_PDF_path


--------------------------------------------------------●ファイルパスの検証と自動生成
--引数に与えられたファイルが存在する場合は、新たに生成し、一意であればそれを返す。
--cnt変数はループ回数、これをファイル名にくっつけていく。最初は必ず1から始めること。
to filepath_test(file_path, cnt)
	tell application "Finder"
		if exists file file_path then --ファイルパスは既に存在する
			--初めてではない時は、cnt識別子を削除する
			if cnt > 1 and cnt < 10 then
				set file_path to (text 1 thru -3 of file_path) as Unicode text
			else if cnt > 9 then
				set file_path to (text 1 thru -4 of file_path) as Unicode text
			end if
			--とりあえず100回チャレンジ!
			if cnt < 100 then
				my filepath_test((file_path & "_" & cnt) as Unicode text, (cnt + 1))
			else --100回以上のトライしてもダメ(一意にならない)でした
				set file_path to choose file name with prompt ("どこに保存しますか?") as Unicode text
				return (file_path as Unicode text)
				--my my_error("ファイル名エラーです", true)
			end if
		else
			return (file_path as Unicode text)
		end if
	end tell
end filepath_test


--------------------------------------------------------●PDFをsaveする
to save_PDF(save_PDF_path, pdf_export_presets)
	tell application "InDesign CS_J"
		with timeout of 3600 seconds
			export document 1 format PDF type to save_PDF_path using PDF export preset pdf_export_presets
		end timeout
	end tell
end save_PDF




----------------------------------●置換
to as_replace(theText, orgStr, newStr)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to orgStr
	set tmpList to every text item of theText
	set AppleScript's text item delimiters to newStr
	set tmpStr to tmpList as text
	set AppleScript's text item delimiters to oldDelim
	return tmpStr
end as_replace

----------------------------------●リストの項目をunicode textにする
to conv_unicode(tmp_list)
	repeat with i in tmp_list
		set contents of i to (contents of i) as Unicode text
	end repeat
	return tmp_list
end conv_unicode

----------------------------------●エラー処理
on my_error(err_str, my_stop)
	set err_str to err_str as Unicode text
	if my_stop then
		set my_stop to {"中止"}
	else
		set my_stop to {"中止", "続行"}
	end if
	tell application "InDesign CS_J"
		activate
		beep
		set ANS to button returned of (display dialog err_str buttons my_stop with icon stop) --警告ダイアログ出してストップ
		if ANS is "中止" then error number -128
	end tell
end my_error