PDFの連続印刷

リッチテキスト書類をPDFにして提出しなければならない。そんな時、OSXではめちゃくちゃ簡単である。command-Pでプリント...を選択して、「PDFとして保存...」すればいいのである。素晴らしい!

ところが、リッチテキストのファイルがたくさんあると、どうだろう?10ファイルなら10回書類を開いて「PDFとして保存...」すればいい。まだ、頑張れる。
でも、100ファイルあったとしたら...そんなこと面倒くさくてやってられない、と思ってしまうのである。(自分の場合は)そこから、すべてが始まる。

デスクトッププリン

  • そう言えば昔、デスクトッププリンタってあったよな、と思って調べてみると、OSXにもあった。
    • デスクトッププリンタとは、デスクトップにあるプリンタアイコンに書類をドラッグ&ドロップすると印刷されるヤツ。
  • システム環境設定 >> プリントとファクスで表示されるプリンタアイコンをデスクトップにドラッグ&ドロップすればいいのだ。

  • やってみると見事デスクトッププリンタになるのだけど、普通のプリンタでは紙に印刷されてしまう。
  • そこで、以前インストールしたCUPS-PDFをデスクトッププリンタにすると、見事!PDFとして保存された!
  • ところが、PDFになった書類を見てガッカリする。自分が設定した印刷書式とは若干違っているのだ。
  • 書類を開いて、CUPS-PDFプリンタを選択して印刷すれば、設定したとおりの書式で印刷されるのだが、
  • デスクトッププリンタにドラッグした時だけは、印刷設定が無視されるようだ。(解決策はないのだろうか?)

AppleScript その1

  • こうなると、いつものAppleScript頼みになってくる。
  • 「書類を開いて、PDFとして印刷して、閉じる」この繰り返しをコーディングするだけでできるはず。単純である。


property opener_app : "iText Express"

tell application "Finder"
set selection_list to (selection as list) end tell

tell application "System Events"
tell process opener_app
repeat with f in selection_list
my open_activate(f as alias) delay 0.5
keystroke "p" using {command down} --プリント...
delay 1
keystroke tab using {shift down} keystroke tab using {shift down} keystroke tab using {shift down} keystroke tab using {shift down} keystroke tab using {shift down} keystroke tab using {shift down} keystroke space
delay 0.5
key code 125 --
key code 125 --
delay 0.5
keystroke space --PDFとして保存...
delay 1
keystroke return --保存
delay 1
keystroke "r" using {command down} --置き換え
delay 2
keystroke "w" using {command down} --ウィンドウを閉じる
end repeat
end tell
end tell

on open_activate(f) tell application opener_app
open (f) activate
end tell
end open_activate

  • できた、できた。もう忠実にキー操作を再現して繰り返すだけの代物なのだけど、とりあえずは使える。

AppleScript その2

  • しかし、使っているうちに、異なるアプリケーションや、印刷設定が簡易モードか詳細モードかの違いによって、まったく役立たずになってしまうことがある。
  • 下手すると、大事な書類を改変してしまう可能性もある。それは困る。
  • そこで、キー操作でPDFボタンを押すのはやめて、GUIスクリプティングで直接指定することにした。


property opener_app : "iText Express"

tell application "Finder"
set selection_list to (selection as list) end tell

tell application "System Events"
tell process opener_app
repeat with f in selection_list
my open_activate(f as alias) delay 0.5
keystroke "p" using {command down} --プリント...
delay 1
click window 1's sheet 1's menu button "PDF" -->メニューボタン
delay 0.5
key code 125 --
key code 125 --
delay 0.5
keystroke space --PDFとして保存...
delay 1
keystroke return --保存
delay 1
keystroke "r" using {command down} --置き換え
delay 2
keystroke "w" using {command down} --ウィンドウを閉じる
end repeat
end tell
end tell

on open_activate(f) tell application opener_app
open (f) activate
end tell
end open_activate

  • これなら、大抵のアプリケーションで問題なく使えそうである。
  • しかし、GUIスクリプティングを利用しているために、以下の設定を有効にしておく必要がある。
    • システム環境設定 >> ユニバーサルアクセス >> 「補助装置にアクセスできるようにする」
    • これが無効だと、役立たずのスクリプトになってしまう...。


AppleScript その3

  • GUIスクリプティングのコードを眺めていて、閃いた!
  • 「menu button "PDF"」とは、もしかしたらメニューなのかもしれない!
  • メニューであれば、ショートカットの割り当てが可能であると。

  • 試してみると、その予想は見事に当たっていたのである!(嬉しい)

  • ショートカットが割り当てられれば、「補助装置にアクセスできるようにする」の状態はどちらでも大丈夫。
  • AppleScriptコードもさらにシンプルになる。


property opener_app : "iText Express" --"TextEdit"

tell application "Finder"
set selection_list to (selection as list) end tell

tell application "System Events"
tell process opener_app
repeat with f in selection_list
my open_activate(f as alias) delay 0.5
keystroke "p" using {command down} --プリント...
delay 1
keystroke "p" using {command down, option down} --PDFとして保存...
delay 1
keystroke return --保存
delay 1
keystroke "r" using {command down} --置き換え
delay 2
keystroke "w" using {command down} --ウィンドウを閉じる
end repeat
end tell
end tell

on open_activate(f) tell application opener_app
open (f) activate
end tell
end open_activate


これで100ファイル、いや1000ファイルPDFで提出して欲しいと言われても、無敵である。

  • さらに、PDFの連続印刷に限らず、上記スクリプトは雛形となる。
  • Finderで選択したファイルに対して、アプリケーションを指定して、特定の処理を加えて、保存することができるのだ。