Keynoteでオープン中の最前面の書類で、選択中のスライドだけをデスクトップにPNG画像で書き出すAppleScriptです。Keynote 9.xを必要とします(macOS 10.13以降)。
ちょっとした説明のためにKeynoteの資料の一部だけを画面上でキャプチャして、メールなどに添付して送ることはよくあります(全部送ると量がおおすぎたり、焦点がぼやけたり)。
そこで、複数枚のスライド(ページ)を選択しておくと、それらのみを画像書き出しするAppleScriptを作ってみました。Keynoteにそんな機能はないのですが、「選択中のページ番号」は取れるので、書類全体をPDF書き出ししておいて、書き出したPDFから指定ページを画像として再書き出しを行い、PDFを削除しています。
手品のように見える処理でも、実際に行える機能を組み合わせて地道に作っているだけです。問題は、「手品」が実は地道な調査と機能確認、こまごまとしたライブラリの整備の末に実現されていることが、一般の方にはわかりにくいということでしょうか(いきなり手品を求められて絶句すること多し)。
仕事の合間に作ったので、割と雑な作りです。書き出し画像のファイル名衝突チェックなどは入れていません。
それでも、スクリプトメニューに入れて利用するとなかなか便利です。
AppleScript名:Keynoteで選択中のスライドだけをデスクトップに画像で書き出す.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/06/20 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" — 10.13 or later use framework "Foundation" use framework "Quartz" use framework "AppKit" use scripting additions set dtPath to (path to desktop) as string tell application "Keynote" set aVer to version considering numeric strings if aVer < "9.0" then display dialog "Too old version for this Script." buttons {"OK"} default button 1 with icon 1 return end if end considering tell front document set aSel to selection –選択中のスライドオブジェクトへの参照がリストで入る set pList to {} repeat with i in aSel set tmpPage to slide number of i set the end of pList to tmpPage end repeat end tell end tell –Keynote書類を指定フォルダにPDF書き出し(全ページ書き出し) set savedPDFPath to exportKeynoteDocToPDF(dtPath) of me if savedPDFPath = false then return –Error set aPOSIXpath to POSIX path of savedPDFPath –書き出したPDFから、部分的にPNG画像に書き出す repeat with p in pList –PDFの指定ページをNSImageとして取り出す set tmpNSImage to getNSImageFromPDFPage(aPOSIXpath, p) of me –PDFの書き出しファイル名に子番号にスライド番号をつける set bPath to addStringbeforeExtension(aPOSIXpath, "_" & (p as string)) of me –PDF書き出しファイル名に set newPath to repFilePathExtension(bPath, ".png") of me –指定のNSImageを指定のパスにPNG形式で保存 set sRes to saveNSImageAtPathAsPNG(tmpNSImage, newPath) of me end repeat –書き出したPDFを削除 tell application "Finder" delete savedPDFPath end tell –Keynote書類からPDF書き出し on exportKeynoteDocToPDF(targFolderPath as string) tell application "Keynote" set dCount to count every document if dCount = 0 then return false end if set aPath to file of document 1 end tell set curPath to (current application’s NSString’s stringWithString:(POSIX path of aPath))’s lastPathComponent()’s stringByDeletingPathExtension()’s stringByAppendingString:".pdf" set outPath to (targFolderPath & curPath) tell application "Keynote" set anOpt to {class:export options, export style:IndividualSlides, all stages:false, skipped slides:true, PDF image quality:Best} export document 1 to file outPath as PDF with properties anOpt end tell return (outPath as alias) end exportKeynoteDocToPDF –指定のPDFから、指定のページをNSImageで返す on getNSImageFromPDFPage(aPOSIX, aPage as number) set aURL to (current application’s |NSURL|’s fileURLWithPath:aPOSIX) set aPDFdoc to current application’s PDFDocument’s alloc()’s initWithURL:aURL set pCount to aPDFdoc’s pageCount() set compFactor to 1.0 –1.0 — 0.0 = max jpeg compression, 1.0 = none –Detect Retina Environment set retinaF to current application’s NSScreen’s mainScreen()’s backingScaleFactor() if retinaF = 1.0 then set aScale to 2.0 –Non Retina Env else set aScale to 1.0 –Retina Env end if set thisPage to (aPDFdoc’s pageAtIndex:(aPage – 1)) set anNSImage to (current application’s NSImage’s alloc()’s initWithData:(thisPage’s dataRepresentation())) if anNSImage = missing value then error "Error in getting imagerep from PDF" return anNSImage end getNSImageFromPDFPage –ファイル名の拡張子の直前に子番号的な文字列を入れる on addStringbeforeExtension(aPath, extraString) set pathString to current application’s NSString’s stringWithString:aPath set theExtension to pathString’s pathExtension() set thePathNoExt to pathString’s stringByDeletingPathExtension() set newPath to (thePathNoExt’s stringByAppendingString:extraString)’s stringByAppendingPathExtension:theExtension return newPath as string end addStringbeforeExtension –与えられたパスの拡張子を付け替える on repFilePathExtension(origPath, newExt) set aName to current application’s NSString’s stringWithString:origPath set theExtension to aName’s pathExtension() if (theExtension as string) is not equal to "" then set thePathNoExt to aName’s stringByDeletingPathExtension() set newName to (thePathNoExt’s stringByAppendingString:newExt) else set newName to (aName’s stringByAppendingString:newExt) end if return newName as string end repFilePathExtension –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –true/false end saveNSImageAtPathAsPNG |
More from my site
(Visited 913 times, 2 visits today)