こっちのブログでは初のAutoHotkey関係の記事なので、最初に少しAutoHotkeyの紹介をしてみます。
AutoHotkeyは、ホットキー(キーボードショートカット)に関する機能が充実しているWindows用のスクリプト言語、およびそれを実行するアプリケーション(無料)です。
大変便利なのですが、言語仕様にはかなりクセがあって、とっつきにくいかもしれません。batファイルみたいなコマンド、サブルーチン系に、JavaScriptみたいな関数、オブジェクト等が建て増しされて若干キメラじみてますが、その分できることは多いです。Windowsで作業効率化したい人なら学ぶ価値は十分あると思います。日本語wikiである程度学べますが、最近追加された機能の情報は公式の英語ドキュメントから仕入れる必要があります。
ホットキーを作るだけでなく、様々な使い方があります。私の思いつく限りで分類してみると、こんな感じ。
【常駐型】
- キーリマップ系(あるキーに別のキーを割り当てる)
- ホットキー系(あるキーが入力されたとき処理を実行する)
- タイマー系(一定間隔で処理を実行する)
- 待ち受け系(特定のアプリケーションが起動した時などに処理を実行する)
【非常駐型】
- 普通に実行する系(ahkファイルをダブルクリックするなどで実行し、処理が終わると終了する)
- ドロップレット系(ahkファイルに処理したいファイルをドラッグ&ドロップする)
でー、今回はAutoHotkeyとPhotoshopとAcrobatを使ったドロップレット系スクリプトです。
pdfファイル(複数ページ可)をラスタライズし、1ページが1枚の画像になったpdfを作成します。
具体的には、
pdfをPhotoshopで開く
↓
統合
↓
jpeg保存
↓
(ページ数分繰り返し)
↓
Acrobatで単一のpdfに結合
を自動化します。
コード
;pdf読み込みカラーモード GRAYSCALE/RGB/CMYK/LAB/
pdfOpenMode=RGB
;pdf読み込みトリミング BOUNDINGBOX/MEDIABOX/CROPBOX/BLEEDBOX/TRIMBOX/ARTBOX
pdfOpenCropPage=MEDIABOX
;pdf読み込み解像度
resolution=150
;jpeg品質
jpegQuality=8
;jpegカラープロファイル埋め込み true/false
jpegEmbedColorProfile=false
;jpegフォーマットオプション STANDARDBASELINE/OPTIMIZEDBASELINE/PROGRESSIVE
jpegFormatOptions=STANDARDBASELINE
;ファイル名に付け加える文字列
fileNameAdd=_rasterized
Loop,%0%
Loop,% %A_Index%
{
pdfPath=%A_LoopFileLongPath%
tempDirPath=%A_Temp%\pdfRasterizeTemp%A_Now%
newPdfPath:=SubStr(A_LoopFileLongPath,1,-4) . fileNameAdd . ".pdf"
FileCreateDir,%tempDirPath%
pdd:=ComObjCreate("AcroExch.PDDoc")
openFlag:=pdd.Open(pdfPath)
If (openFlag!=-1)
Continue
pagesNum:=pdd.GetNumPages()
pdd.Close()
StringReplace, tempDirPathJs, tempDirPath, \ , \\, All
StringReplace, pdfPathJs, pdfPath, \ , \\, All
js=
(
var f0=File("%pdfPathJs%");
var tempFolder="%tempDirPathJs%";
var n=%pagesNum%;
var pdfOpt=new PDFOpenOptions;
pdfOpt.cropPage=CropToType.%pdfOpenCropPage%;
pdfOpt.mode=OpenDocumentMode.%pdfOpenMode%;
pdfOpt.resolution=%resolution%;
jpegOpt=new JPEGSaveOptions;
jpegOpt.quality=%jpegQuality%;
jpegOpt.embedColorProfile=%jpegEmbedColorProfile%;
jpegOpt.formatOptions=FormatOptions.%jpegFormatOptions%;
jpegOpt.scans= 3;
jpegOpt.matte= MatteType.NONE;
for(var i=1;i<=n;i++){
pdfOpt.page=i;
var doc=app.open(f0,pdfOpt)
doc.flatten();
doc.saveAs(File(tempFolder+"/"+i+".jpg"),jpegOpt);
doc.close();
}
)
app:=ComObjCreate("Photoshop.Application")
app.doJavaScript(js)
pdd0:=ComObjCreate("AcroExch.PDDoc")
pdd0.Create()
Loop,%pagesNum%
{
jpegPath=%tempDirPath%\%A_Index%.jpg
avd1:=ComObjCreate("AcroExch.AVDoc")
result:=avd1.Open(jpegPath,"a")
pdd1:=avd1.GetPDDoc()
pdd0.InsertPages(-2,pdd1,0,1,0)
avd1.Close(1)
}
pdd0.Save(1,newPdfPath)
pdd0.Close()
FileRemoveDir, %tempDirPath% ,1
}
使う準備
PhotoshopとAcrobat Pro(Readerはだめ)がインストールされている環境を用意します。
AutoHotkeyをダウンロードし、インストール時のオプションで「Enable drag & drop」をONにしてインストールします。(以前はデフォルトでONだったはずなので、その頃にインストールしている場合はそのままでOKです)
使い方
- 上記スクリプトを適当なエディタにコピペし、UTF-8 BOM付き、拡張子ahkで保存します。
- エクスプローラー上でahkファイルに対して、pdfファイルをD&Dします。
- (元のpdfファイル名)_rasterized.pdf という名前でラスタ化済みpdfが生成されます。
コードの解説
17行目まで
pdf読み込みとかjpeg保存のオプションです。お好みで書き換えてください。
18行目
Loop,%0%
Loop,% %A_Index%
D&Dしたファイルの回数だけループするおまじないです。ループ内ではA_LoopFileLongPathなどの組み込み変数が使えます。
26~33行目
pdd:=ComObjCreate("AcroExch.PDDoc")
openFlag:=pdd.Open(pdfPath)
If (openFlag!=-1)
Continue
pagesNum:=pdd.GetNumPages()
pdd.Close()
Acrobat OLEを使ってpdfのページ数を取得しています。
38行目
js=
(
イコールの後、改行して行頭に(
がくるのがAutoHotkeyのヒアドキュメント記法です。この後の行頭の)
までが文字列として代入されます。%変数名%を使った変数展開もできます。
63行目
app:=ComObjCreate("Photoshop.Application")
app.doJavaScript(js)
PhotoshopにアクセスしてJavaScriptを実行させています。
66~78行目
pdd0:=ComObjCreate("AcroExch.PDDoc")
pdd0.Create()
Loop,%pagesNum%
{
jpegPath=%tempDirPath%\%A_Index%.jpg
avd1:=ComObjCreate("AcroExch.AVDoc")
result:=avd1.Open(jpegPath,"a")
pdd1:=avd1.GetPDDoc()
pdd0.InsertPages(-2,pdd1,0,1,0)
avd1.Close(1)
}
pdd0.Save(1,newPdfPath)
pdd0.Close()
Acrobat OLEで複数の画像を1つのpdfにまとめる処理です。
おしまい
コメントを残す