[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