はじめに
100個とか大量のWord文書をPDFに変換したいときに、1つ1つ開いて「ファイル/プリント」→「PDFとして保存」を実行していくのは大変です。AppleScriptで自動化出来ないかとぐぐってみると先人がいました。
ということで、この記事のスクリプトはほぼPDFの連続印刷 - ザリガニが見ていた...。の「AppleScript その3」の流用となっています(元スクリプトのライセンスは現在問い合わせ中です)。ありがとうございます!
事前準備
「補助装置にアクセスできるようにする」をオンにする
「システム環境設定」→「アクセシビリティ」を開き、「補助装置にアクセスできるようにする」にチェックを付けます。
「PDF として保存」メニューにキーボードショートカットを設定する
- 「システム環境設定」→「キーボード」を選びます
- 「キーボードショートカット」タブを選びます
- 左のリストで「アプリケーション」を選びます
- 「すべてのアプリケーション」を選んで「+」を押します
- 「PDF として保存…」と入力しショートカットに「⌥⌘P」と設定します
Wordで「ファイル」/「プリント」メニューを選び、「PDF」ボタンを押すと「PDF として保存」メニューに「⌥⌘P」というショートカットが設定されたことを確認します。
スクリプト
property opener_app : "Microsoft Word"
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)
-- 表示/変更履歴メニューをトグル
click menu bar item "表示" of menu bar 1
click menu item "変更履歴" of menu 1 of menu bar item "表示" of menu bar 1
keystroke "p" using {command down} --プリント...
delay 1
-- NOTE: 予め「システム環境設定/キーボード」で「すべてのアプリケーション」に
-- 「PDF として保存…」を追加し⌥⌘Pというショートカットを割り当てておいてください。
keystroke "p" using {command down, option down} --PDFとして保存...
delay 1
-- 作成者をクリア
keystroke tab
keystroke tab
key code 51 -- delete
keystroke return --保存
delay 1
keystroke "w" using {command down} --ウィンドウを閉じる
delay 1
keystroke "d" 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
元のスクリプトからの変更点
変更履歴の表示/非表示を切り替える
今回扱うWord文書は変更履歴の表示がオンの状態で保存されていました。PDFに変換するときに変更履歴を非表示にしたかったので、「表示」/「変更履歴」メニューを押すようにしました。
PDFの作成者を空にする
特になにもしないで印刷するとPDFの作成者に自分の名前が入ってしまいます。これを消すようにTABを2回押してdeleteを押すようなキー操作を追加しました。
キーコードの送信についてはGUIスクリプティングで使いたくなる道具 - ザリガニが見ていた...。を参照しました。
Word文書を閉じるときに保存しないようにする
上記の通り、変更履歴を非表示に切り替えたせいか、Word文書を閉じるときに保存するか確認するダイアログが表示されました。
⌘Dを押すことで「保存しない」ボタンを選択するようにしました。
OS X のキーボードショートカットによると「保存しない」ボタンを含むダイアログから「保存しない」を選択するには、Mac OS X v10.6.8 以前では Command + D (⌘D)、LionとMountain LionではCommand + deleteとのことです。
実際に試した時はこのドキュメントを見ずにうろ覚えで⌘Dを試しました。⌘DはMountain Lionでも効くようです。
試行錯誤のメモ
変更履歴メニューのチェック状態を取得したかったが断念
以下のコードで状態をチェックしてみました。
tell application "System Events"
tell process "Microsoft Word"
activate
set props to (properties of menu item "変更履歴" of menu 1 of menu bar item "表示" of menu bar 1)
log props
end tell
end tell
AppleScriptエディタのイベントログには以下のように表示されました。
チェックありのときのログ
(*class:menu item, description:メニュー項目, orientation:missing value, position:0, 495, role description:メニュー項目, accessibility description:missing value, focused:missing value, title:変更履歴, size:233, 19, value:missing value, help:missing value, enabled:true, maximum value:missing value, role:AXMenuItem, entire contents:, subrole:missing value, selected:false, name:変更履歴, minimum value:missing value*)
チェックなしのときのログ
(*class:menu item, description:メニュー項目, orientation:missing value, position:221, 517, role description:メニュー項目, accessibility description:missing value, focused:missing value, title:変更履歴, size:233, 19, value:missing value, help:missing value, enabled:true, maximum value:missing value, role:AXMenuItem, entire contents:, subrole:missing value, selected:false, name:変更履歴, minimum value:missing value*)
selectedとかenabledというプロパティはあるのですが、checkedとかはありません。ということでチェック状態を取得するのは断念しました。
変更履歴の表示/非表示を切り替えるかをダイアログで聞くようにしてみた→ボツ
一部変更履歴の表示がオフの文書もあったので、ダイアログを表示して聞くようにしてみました。
変更履歴の表示がオンの場合は普通は文書の右に変更内容が表示されます。が、なぜか表示されない場合もあったので、「表示」/「変更履歴」メニューを表示して、チェック状態を目視確認してから、ダイアログで「はい」か「いいえ」を押すようにしてみました。
property opener_app : "Microsoft Word"
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)
click menu bar item "表示" of menu bar 1
select menu item "変更履歴" of menu 1 of menu bar item "表示" of menu bar 1
delay 0.5
set dialogResult to display dialog "変更履歴の表示/非表示を切り替えますか?" buttons {"はい", "いいえ"}
if (button returned of dialogResult) = "はい" then
-- 対象ドキュメントのウィンドウをアクティブにするために開き直す
my open_activate(f as alias)
click menu bar item "表示" of menu bar 1
click menu item "変更履歴" of menu 1 of menu bar item "表示" of menu bar 1
else
my open_activate(f as alias)
end if
keystroke "p" using {command down} --プリント...
delay 1
-- NOTE: 予め「システム環境設定/キーボード」で「すべてのアプリケーション」に
-- 「PDF として保存…」を追加し⌥⌘Pというショートカットを割り当てておいてください。
keystroke "p" using {command down, option down} --PDFとして保存...
delay 1
-- 作成者をクリア
keystroke tab
keystroke tab
key code 51 -- delete
keystroke return --保存
delay 1
keystroke "w" using {command down} --ウィンドウを閉じる
delay 1
keystroke "d" 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
が、文書の数が多いと面倒なので結局ボツにしました。変更履歴を常に切り替えるにしてひと通り変換してからPDFを確認して、変更履歴が元からオフのものは変更履歴を切り替えないようにスクリプトを書き換えてから再度実行するほうが楽でした。
実行手順
1. Finderで対象のWord文書を選択
今回は特定のフォルダ以下の複数のサブフォルダにWord文書が分散していました。
そこでFinderの右上の検索欄に.docxと入力し、「検索:」の右で「この Mac」が選ばれているところの右にフォルダ名があるのでそれをクリックします。するとそのフォルダ配下のWord文書をリストアップできます。一覧のうちPDFに変換したいWord文書を選択します。
2. AppleScriptエディタでスクリプト実行
AppleScriptエディタを起動し、上記のスクリプトを貼り付けて⌘Rで実行します。
たまにエラーで止まりましたがリトライで変換成功
これでWordが自動操縦されて、Word文書を開いてはPDFに変換して閉じる操作が繰り返し実行されます。実行中に何か操作すると処理がおかしくなりそうなので、触らずに実行を見守っていました。
ですが、たまにWordのフォントのダイアログがなにかが表示され、AppleScriptエディタにエラーが出て止まってしまうことがありました。
Finderで変換が終わっていないWord文書を選びなおして、再度AppleScriptエディタで実行することでひと通り変換できました。
まとめ
完全自動とは行きませんが、ほぼ自動化できて手で1つ1つ変換するよりはかなり楽でした。AppleScript便利ですね。