AutoHotkey(略称:AHK)でアプリを操作といえば、キー入力を送ったり特定の位置にマウスクリックを発生させたりというようなのがAHKの得意とするところなのですが、今回はそういうのではなく、OLEあるいはCOMと呼ばれる仕組みを使ってAcrobatとやりとりする話です。VBSでやれと言われそうですけど、案外書きやすいんです、AHKスクリプト。
AHKを公式のインストーラーでインストールすると、エクスプローラー上で.ahkファイルに対して任意のファイルをドラッグ&ドロップして、そのファイルについての処理をすることができます。adobeユーザーにはこういうの『ドロップレット』っていう言葉で定着してるのかな?私は最近まで知らなかったけど。
たとえばこんなのができます。
D&Dしたpdfのタイトルをファイル名(拡張子除く)にして、作成者名を空欄にして上書き保存するドロップレット
Loop,%0%
Loop,% %A_Index%
{
name:=A_LoopFileName
path:=A_LoopFileLongPath
d:=ComObjCreate("AcroExch.PDDoc")
d.Open(path)
d.SetInfo("Title",SubStr(name,1,-4))
d.SetInfo("Author","")
d.Save(0,path)
d.Close()
}
MsgBox,完了!
えー、スクリプトの解説をしようと思うんですが、まず最初の2行が超説明しづらいのでおまじないと思ってください。これにより以下の"{"から"}"までが、D&Dしたファイルの個数分ループします。
ループの中では、A_LoopFileNameという変数にD&Dしたファイルの名前が入っています。
2回目のループでは2つ目のファイル、3回目のループでは3つ目のファイル…です。便利ですね。
ファイル名以外にもいろいろ取得できます(→
AutoHotkey Wiki)。
d:=ComObjCreate("AcroExch.PDDoc")
でAcrobatのPDDocオブジェクトを生成します。
AcrobatのドキュメントオブジェクトはPDDocとAVDocの2つがあるんですが、AVDocは主にドキュメントの画面表示に関することなので今回は使いません。
PDDocのメソッドについては
pdf-file.nnn2.com にすばらしい解説があるので、AHKだとこれくらいシンプルに書けるよーということ以外、特に言うことはありません。
なお、昔AHKをインストールして、ドロップレットにできないって人もいるかもしれません。私もいつかのWindowsアップデートでできなくなりました。再インストールすればできるようになるはずです。
つぎはもう少しAHKらしい使い方をしてみます。常駐させてホットキーで動作するタイプのAHKスクリプト。
Acrobatでpdfファイルを開いている状態で、
・F1を押すと、Acrobatで現在開いているファイルをエクスプローラーで参照
・F2を押すと、Acrobatで現在開いているファイルをデスクトップにコピー
できるようにします。
#IfWinActive ahk_class AcrobatSDIWindow
F1::
filePath:=getAcrobatActiveFilePath()
Run,explorer /select`,%filePath%
Return
F2::
MsgBox,4,,pdfをデスクトップにコピーしますか?
IfMsgBox, Yes
{
filePath:=getAcrobatActiveFilePath()
FileCopy, %filePath%, %A_Desktop%\
}
Return
getAcrobatActiveFilePath(){
f:=ComObjCreate("AcroExch.App").GetActiveDoc().GetPDDoc().GetJSObject().path
f:=RegExReplace(f,"^/(.)/","$1:/")
f:=RegExReplace(f,"^/(.+?)/","//$1/")
f:=RegExReplace(f,"/","\")
Return f
}
今回はAcrobatには開いているファイルのパスを教えてもらうだけなんですが、これが意外と大変でした。
Acrobat OLEのメソッドやプロパティは pdf-file.nnn2.comさん の「
オブジェクトの連携図」に網羅されているのですが、ここにファイルパスらしいものが見つからないのです。
しかし、AcrobatにはOLEとは別にJavaScriptによる自動化があります。そしてこのJavaScriptと同等のことができることになっている(が実際はそんなにできない)JSObjectというものにOLEからもアクセスできるようになっています。
f:=ComObjCreate("AcroExch.App").GetActiveDoc().GetPDDoc().GetJSObject().path
で、AcrobatのAppオブジェクトから、アクティブなドキュメントのAVDocオブジェクトを取得して、それに関連付けられたPDDocオブジェクトを取得して、そのJSObjectを取得し、そこからパスを取得しています。
ほんとにこんな回りくどいことをしなくちゃいけないのか、定かではないんですが…
ほかの部分を簡単に解説すると、
#IfWinActive ahk_class AcrobatSDIWindow
これは「以下のホットキーをAcrobatのウインドウがアクティブのときだけ有効にする」という意味。
F1::
から
Return
までがF1キーが押されたとき呼ばれるサブルーチン。
MsgBoxは1つ目の引数でタイプを指定できて、4だと「はい」「いいえ」のボタンがあるダイアログになります。
IfMsgBoxは直前のMsgBoxで押されたボタンにより分岐します。
続くかも?
PR