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

(DTPtechNote:587) InDesignへの画像張り込み



左綴じにしか対応していないのだけど、
とりあえず、画像をどんどん張ります。
ええ、張りますとも(笑)。
#要 Mac OS X<sortの部分だけね。

property yoko : 595 --ページサイズ ヨコ
property tate : 842 --ページサイズ タテ
property space_var : 120 --貼り込み間隔
property space_way : "absolute" --貼り込み間隔(絶対)<-->"relative"(相対)


--ファイルをドラッグ&ドロップされたら、フィルタをしてから、ソートしてコントロールに渡す
on open of theFiles
	set my_files to my file_kind(theFiles) --必要なファイルのみフィルタする
	if my_files is {} then my my_error("貼り込みファイルとして有効なファイルは見つかりませんでした")
	repeat with i in my_files --ソートするための処理。テキストにしておく
		set contents of i to i as text
	end repeat
	set my_files to my_sort(my_files) --ファイル名でソートしておく
	my my_control(my_files)
end open

--ダブルクリックされたら、貼り込みリスト(テキスト)を読み込んで、フィルタをして渡す
on run
	tell application "Finder"
		set listFile to choose file with prompt "貼り込む画像のフルパスを記述したテキストを選択してください" of type {"TEXT"}
		set my_files to my read_file_list(listFile)
		set my_files to my file_kind(my_files) --必要なファイルのみフィルタする
		my my_control(my_files)
	end tell
end run




----------------------------------------------●コントロールルーチン
to my_control(my_files)
	my ver() --InDesignバージョン確認
	set {yoko, tate} to makedoc() --ドキュメントが開かれているかどうか。開かれていなければ、新規で作成、ドキュメントサイズを返す
	set space_var to my sub_space() --貼り込み間隔を入力
	my do_it(yoko, tate, my_files, space_var) --実処理
	say "Work was finished. " & (length of my_files) & " files were processed."
end my_control


--------------------------------------------------------●設定読み込み(改行区切りテキストファイルを読み込んでリストを返す)
to read_file_list(listFile)
	set tmp_list to {}
	try --text fileにアクセスして情報をgetします
		set fh to open for access listFile
		set read_list to (read fh as text using delimiter {return}) --段落を区切りにリストとして読み込み
	on error errMsg number ERRNO --ここからエラー処理
		close access fh
		if ERRNO = -39 then
			display dialog "設定ファイルがありません" & return & errMsg & ERRNO with icon 2
			error number ERRNO
		else
			display dialog "処理は中止されました(設定読み込み中)" & return & errMsg & ERRNO with icon 2
			error number ERRNO
		end if
	end try
	close access fh
	
	--余計な改行(空リスト)や、タブから始まる項目(コメント)をリストから取り除く
	repeat with i in read_list
		set str to (contents of i) as Unicode text
		if str is not "" and str does not start with tab then set end of tmp_list to str
	end repeat
	
	return tmp_list
end read_file_list




--------------------------------------------------------●InDesignバージョン確認ルーチン
to ver()
	tell application "InDesign 2.0.2J"
		if version is not 2.02 then
			my my_error("このプログラムはInDesign2.0.2J以外では動作しません")
		end if
	end tell
end ver

----------------------------------------------●ドキュメントが開かれているかどうか。開かれていなければ、新規で作成、ドキュメントサイズを返す
to makedoc()
	tell application "InDesign 2.0.2J"
		if (exists document 1) then --ドキュメントが開かれているかどうか
			tell document 1
				tell document preferences
					set yoko to page width
					set tate to page height
				end tell
			end tell
		else --開かれていなければ、新規で作成
			set {yoko, tate} to my sub_docsize()
			set my_doc to make document --ドキュメントの生成
			tell my_doc
				--ドキュメント寸法(単位付き数字でもOKです)
				tell document preferences
					set page width to yoko
					set page height to tate
				end tell
			end tell
		end if
	end tell
	return {yoko, tate}
end makedoc


----------------------------------------------●ドキュメントサイズの入力
to sub_docsize()
	tell application "Finder"
		with timeout of 3600 seconds
			set yoko to text returned of (display dialog "ドキュメントの左右寸法を入力してください。" default answer yoko buttons {"キャンセル", "OK"} default button 2 with icon 1)
			set tate to text returned of (display dialog "ドキュメントの天地寸法を入力してください。" default answer tate buttons {"キャンセル", "OK"} default button 2 with icon 1)
		end timeout
		try
			set yoko to yoko as number
			set tate to tate as number
		on error errMsg number errNum
			my my_error("入力された値が不正でした。半角数字で入力してください")
		end try
	end tell
	return {yoko, tate}
end sub_docsize


----------------------------------------------●貼り込み間隔の入力
to sub_space()
	tell application "Finder"
		with timeout of 3600 seconds
			set ANS to (display dialog "画像の貼り込み間隔を入力してください。" & return & "absolute -->絶対間隔  relative -->相対間隔" default answer space_var buttons {"キャンセル", "absolute", "relative"} default button space_way with icon 1)
			set space_var to text returned of ANS
			set space_way to button returned of ANS
			
			try
				set space_var to space_var as number
			on error errMsg number errNum
				my my_error("入力された値が不正でした。半角数字で入力してください")
			end try
		end timeout
	end tell
	return space_var
end sub_space



----------------------------------------------●必要なファイルだけをフィルタして返します
to file_kind(theFiles)
	set my_files to {}
	ignoring case
		tell application "Finder"
			repeat with i in theFiles
				--display dialog (file type of i) as Unicode text
				set my_path to i as Unicode text
				if not (exists file my_path) then
					display dialog "ファイル「" & my_path & "」は存在しないファイルです" buttons {"キャンセル", "OK"} default button 2 with icon 0
				else if my_path ends with ":" then
					display dialog "フォルダ「" & (name of i) & "」の中の全ファイルを処理します" buttons {"キャンセル", "OK"} default button 2 with icon 0
					set my_files to my_files & my file_kind(every file in folder i)
				else if ("EPSF, PDF , TIFF, 8BPS" contains file type of file my_path) or ツ
					(my_path ends with ".eps") or ツ
					(my_path ends with ".pdf") or ツ
					(my_path ends with ".ai") or ツ
					(my_path ends with ".psd") or ツ
					(my_path ends with ".tif") or ツ
					(my_path ends with ".tiff") then
					set end of my_files to contents of i
				else
					display dialog "ファイル「" & (name of file my_path) & "」は貼り込みファイルとして不適当です" buttons {"キャンセル", "OK"} default button 2 with icon 0
				end if
			end repeat
		end tell
	end ignoring
	return my_files
end file_kind



----------------------------------------------●ページの生成、グラフィックフレームの生成、画像の貼り付け
to do_it(yoko, tate, my_files, space_var)
	tell application "InDesign 2.0.2J"
		tell document 1
			set old_zero_piont to zero point --現在の0ポイントを確保
			set zero point to {0, 0} --0ポイントの変更
			set page_obj to page -1 --一番最後のページです<current pageが取れないって不便だわ〜
			set {m_top, m_left, m_bottom, m_right} to my get_margin(page_obj, "left") --ページのマージンをGET
			set {y1, x1} to {m_top, m_left}
			repeat with graphic_file in my_files --ファイル分だけリピート
				set {page_obj, y1, x1} to my place_control(page_obj, yoko, tate, m_top, m_left, m_bottom, m_right, y1, x1, space_var, graphic_file)
			end repeat
			set zero point to old_zero_piont --0ポイントを戻す
		end tell
	end tell
end do_it

------画像張り込みのページコントロール 
to place_control(page_obj, yoko, tate, m_top, m_left, m_bottom, m_right, y1, x1, space_var, graphic_file)
	tell application "InDesign 2.0.2J"
		tell document 1
			tell page_obj
				--画像を配置
				set {my_Rectangle, rectangle_bounds} to my place_graphic(page_obj, {y1, x1, y1 + 10, x1 + 10}, graphic_file)
				
				--張り込まれた画像のチェック
				if item 4 of rectangle_bounds > yoko then --配置した画像の左右がページを超えてしまった
					my my_error("貼り込まれた画像のヨコ幅がページサイズを超えてしまいました" & return & graphic_file)
				else if y1 = m_top and item 3 of rectangle_bounds > tate then --1番目に配置した画像の天地がページを超えてしまった
					my my_error("貼り込まれた画像の高さがページサイズを超えてしまいました" & return & graphic_file)
				else if item 3 of rectangle_bounds > (tate - m_bottom) then --生成した画像フレームがボトムマージンを超えた
					delete my_Rectangle
					set page_obj to my makepage(applied master of page_obj)
					set {m_top, m_left, m_bottom, m_right} to my get_margin(page_obj, "left") --ページのマージンをGET
					set {y1, x1} to {m_top, m_left}
					set {page_obj, y1, x1} to my place_control(page_obj, yoko, tate, m_top, m_left, m_bottom, m_right, y1, x1, space_var, graphic_file)
					--end if
					
					--次の画像張り込み位置を決定(y1の書き換え)
				else if space_way is "absolute" then
					if item 3 of rectangle_bounds > (y1 + space_var) then --生成した画像フレームが前の画像と重なった
						repeat while item 3 of rectangle_bounds > y1
							set y1 to y1 + space_var
						end repeat
					else
						set y1 to y1 + space_var
					end if
				else --space_way = "relative"だったばあい
					set y1 to (item 3 of rectangle_bounds) + space_var
				end if
				
				return {page_obj, y1, x1}
			end tell
		end tell
	end tell
end place_control


------pageの生成、ページオブジェクトを返す
to makepage(applied_master)
	tell application "InDesign 2.0.2J"
		tell document 1
			set page_obj to make new page at end with properties {applied master:applied_master}
			return page_obj
		end tell
	end tell
end makepage

-----画像の貼り込み、Pageitemオブジェクトを返す
to place_graphic(page_obj, rectangle_bounds, graphic_file)
	tell application "InDesign 2.0.2J"
		tell page_obj
			set my_Rectangle to make rectangle with properties {geometric bounds:rectangle_bounds}
			tell my_Rectangle
				place graphic_file
				fit my_Rectangle given frame to content --フレームを内容に合わせる
				set rectangle_bounds to geometric bounds --画像フレームの大きさ
				return {my_Rectangle, rectangle_bounds}
			end tell
		end tell
	end tell
end place_graphic

------page_objのマージンを返す(toji = "left" ならば左綴じ、toji = "right" ならば右綴じ)
to get_margin(page_obj, toji)
	tell application "InDesign 2.0.2J"
		if exists page_obj then
			--page_objは偶数ページかどうか
			tell applied section of page_obj
				set start_page_number to page number start
				set page_length to length
				set odd_f to my my_odd(start_page_number + page_length - 1)
				if toji is "right" then set off_f to not odd_f --右綴じならば
			end tell
			set {margin top:m_top, margin left:m_left, margin bottom:m_bottom, margin right:m_right, parent:p_obj, column count:c_count, column gutter:c_gutter} to properties of margin preference 1 of page_obj
			--見開きドキュメントで、かつ偶数ページは、左右のマージンを逆にする。
			if (pages per spread of document preference 1 of document 1) = 2 and odd_f then
				return {m_top, m_left, m_bottom, m_right, p_obj, c_count, c_gutter}
			else
				return {m_top, m_right, m_bottom, m_left, p_obj, c_count, c_gutter}
			end if
		else
			return false --pagenumberがなければfalseを返す
		end if
	end tell
end get_margin



----------------------------------------------★以下はこまごまとした下請け
----------------------------------------------○リストをソートします
to my_sort(theList)
	set tmp_str to my as_join((ASCII character 10), theList)
	set tmp_str to do shell script "echo " & quoted form of tmp_str & "| sort "
	return my as_split(return, tmp_str)
end my_sort

----------------------------------------------○リストをデリミタで分割
to as_split(thedelimit, theText)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpList to every text item of theText
	set AppleScript's text item delimiters to oldDelim
	return tmpList
end as_split

----------------------------------------------○リストをデリミタで結合
to as_join(thedelimit, theList)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpStr to theList as text
	set AppleScript's text item delimiters to oldDelim
	return tmpStr
end as_join

----------------------------------------------○渡された数字が奇数ならばtrue,偶数ならばfalseを返します。
to my_odd(num)
	if num mod 2 = 0 then
		return false
	else
		return true
	end if
end my_odd

----------------------------------------------○エラーダイアログ-->スクリプト停止
to my_error(err_mess)
	tell application "Finder"
		beep 2
		display dialog err_mess buttons {"スクリプト停止"} default button 1 with icon 0
		error number -128
	end tell
end my_error