それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

AppleScript でファイルを開いてPDFで保存する例。

AppleScriptって便利そうなんだけど、サンプル少なくて苦労する。 なので、「ファイルを開いて変換する」のサンプルを書いておきました。

Apple Script でファイルを開く

これでファイルが開く

set a to POSIX file "/Users/takuya/Desktop/sample.pages"
tell application "Finder" to open a

これでファイルが開く

Apple Script でApplicationを起動して終了する。

tell application "Pages" to activate
tell application "Pages" to quit

これで、アプリケーションが起動して終了する。

Applicationにファイルを開くよう指示する。

open でたいていは開くけど、具体的に、アプリを指定したい場合

set a to POSIX file "/Users/takuya/Desktop/test.pdf"
tell application "Finder" to open a

これだと、標準アプリで開くので。

Google Chrome で開くには

set a to POSIX file "/Users/takuya/Desktop/test.pdf"
tell application "Google Chrome" to open a

こうなる。

chromeが先に開いてて、開いたことが分からない?

set a to POSIX file "/Users/takuya/Desktop/test.pdf"
tell application "Google Chrome" to open a
tell application "Google Chrome" to activate

PagesやNumbers/Keynoteのファイルを開いてPDFとして保存する

保存したファイルを開く。

set a to POSIX file "/Users/takuya/Desktop/sample.pages"
tell application "Pages" to quit
tell application "Pages" to open a
tell application "Pages" to export document 1 to POSIX file "/Users/takuya/Desktop/test.pdf" as PDF
tell application "Pages" to quit
tell application "Finder" to open POSIX file "/Users/takuya/Desktop/test.pdf"

これでファイルを変換して保存できます。

関数にして変換作業を明確にする。

on convert(in_file)
    in_file
    tell application "Pages" to quit
    tell application "Pages" to open in_file
    set desktop_path to POSIX path of (path to desktop folder)
    set out_file_path to POSIX file (desktop_path & "test.pdf")
    tell application "Pages" to export document 1 to out_file_path as PDF
    tell application "Pages" to quit
    tell application "Finder" to open out_file_path
end convert
set a to POSIX file "/Users/takuya/Desktop/sample.pages"
convert(a)

デスクトップを規定値から読み出す

デスクトップなど規定されたフォルダは、そのまま読み出せます。

set desktop_path to POSIX path of (path to desktop folder)
set a to POSIX file (desktop_path & "test.pdf")
tell application "Finder" to open a

POSIX が分かりやすいのでPOSIXスタイルを使ってファイルを開いた

関数の中身が冗長なので、ブロックにまとめる

tell application が多くて冗長なので省略する。

set a to POSIX file "/Users/takuya/Desktop/sample.pages"
convert(a)
on convert(in_file)
    set desktop_path to POSIX path of (path to desktop  
    set out_file_path to POSIX file (desktop_path & "test.pdf")
    tell application "Pages"
        quit
        open in_file
        export document 1 to out_file_path as PDF
        quit
    end tell
    tell application "Finder" to open out_file_path
end convert

App形式で保存してドラッグドロップを受け付けるようにする。

それでも、まだファイルのパスが残るので、ドラッグドロップでファイルを受け取りたい。

ドラッグされたファイルのパスを解析して、それを変換する。

Appで保存し、『on open 引数』で関数を定義すると、 「ドラッグ・ドロップ」や「送る」でファイルを受け取った時の動作を指定できる。

on open dropped_items
    repeat with _item in 
        set out to convert(_item)
        tell application "Finder" to open out
    end repeat
end open
on convert(in_file)
    set desktop_path to POSIX path of (path to desktop folder)
    set out_file_path to ""
    tell application "Pages"
         quit
         open in_file
         set f_name to name of document 1
         set f_name to text 1 thru -7 of f_name
         set f_name to f_name & ".pdf"
         set out_file_path to desktop_path & f_name
         export document 1 to POSIX file (out_file_path) as PDF
         quit
    end tell
    POSIX file out_file_path
end convert

まとめ

アプリ起動

tell application "Google Chrome" to activate

アプリを起動してファイルを開く

tell application "Google Chrome"  to open file "..."

複数のtell application をまとめる

tell application "Google Chrome" 
   open file "..."
   activate
   quit
end tell

ループ

repeat with i in items
  display dialog i
end repeat

変数定義

set a to 1

変数読みだし

get name of application "Google Chrome"

配列の中の一つを読み出す

複数形が配列を示す。楽しい。

get windows of application "Google Chrome"
get window 1 of application "Google Chrome"

わからないこと

ファイルをPreview.appで開いて「PDFで保存」ってすれば、ほぼすべてのファイルをPDF化できる。 でも、Preview.appのAppleScriptにはExport as PDFのコマンドが無い。詰んだ。

これはSystem Eventsからクリックするしか無いんですかね。

AppleScript難しい。

追記

Preview.appをSystem Events で操作して、PDF保存したけど、いまいちだった。 Pages/Numbers/KeynotePowerPoint/Excel/Word のそれぞれのメニューを使った方が綺麗だったのでこの方法はボツだろうな。。。

tell application "Preview" to activate
tell application "System Events"
    tell process "Preview"
        tell menu bar 1
            tell menu bar item "File"
                tell menu "File"
                    pick menu item "Export as PDF…"
                    delay 1
                    keystroke return
                end tell
            end tell
        end tell
    end tell
end tell