TAWAMIラボ

2021/05/31 AutoHotkey

AutoHotkey+Photoshop+Acrobatでpdfをラスタ化済みpdfにする

こっちのブログでは初の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です)

使い方

  1. 上記スクリプトを適当なエディタにコピペし、UTF-8 BOM付き、拡張子ahkで保存します。
  2. エクスプローラー上でahkファイルに対して、pdfファイルをD&Dします。
  3. (元の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にまとめる処理です。

おしまい


コメントを残す

メールアドレスが公開されることはありません。