Skimでオープン中のPDFに対して、現在表示中のページ以降をすべて削除するAppleScriptです。
もともとは、macOS 10.13以前のバージョンのmacOSで、BridgePlusを呼び出すようにしてあったものですが、スクリプトメニューからBridgePlusを呼び出せなくなって、BridgePlus呼び出し部分を別のサブルーチンに置き換えてみたものです。
# 一応、Script Debuggerから拡張アプレットで書き出せば、スクリプトメニューに入れたScript(アプレット?)からBridgePlusの呼び出し自体は行えます。
もともと、SkimにはPDFのページ削除の機能が存在していないので、情報取得後にPDFをいったんクローズ、AppleScriptだけでPDFKitの機能を呼び出して削除処理を行い、再度Skimでオープンするという処理を行なっています。
現在表示中のページから前を削除するScriptも書いて使っていますが、余計に処理に時間がかかります。
SkimのScript本を提案したこともあったのですが、開発チームのとくに誰が許可を出すというわけでもなく、そのまま時間が流れてしまいました。Skimの機能範囲だけだと実現できることに制限がありますが、AppleScriptからPDFKitの機能を呼び出すと、Skim自体で持っていない機能も実装できて便利です。
そういうものを目指していたのですが、いまひとつテンションが上がらずそのまま放置状態に。
AppleScript名:現在表示中のページ以降を削除.scptd |
— Created 2018-06-30 by Takaaki Naganoya — Modified 2024-07-01 by Takaaki Naganoya — 2018–2024 Piyomaru Software use AppleScript version "2.8" use scripting additions use framework "Foundation" use framework "AppKit" use framework "PDFKit" property NSSet : a reference to current application’s NSSet property |NSURL| : a reference to current application’s |NSURL| property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property PDFDocument : a reference to current application’s PDFDocument property NSSortDescriptor : a reference to current application’s NSSortDescriptor tell application "Skim" set docCount to count every document if docCount = 0 then return tell front document set curInd to index of current page set docFile to file of it close without saving end tell end tell set aPOSIX to POSIX path of docFile set aURL to (|NSURL|’s fileURLWithPath:aPOSIX) set aPDFdoc to PDFDocument’s alloc()’s initWithURL:aURL set pCount to aPDFdoc’s pageCount() set pRes to removePDFPageAfter(docFile, curInd) of me tell application "Skim" open docFile tell front document go to last page end tell end tell –指定パスのPDFの指定ページ以降(指定ページも含む)をすべて削除 on removePDFPageAfter(inFile, sPage) set pCount to pdfPageCount(inFile) of me set eCount to pCount – sPage + 1 set targPageList to makeSuccessfulNumArray(sPage, pCount) of me set rList to reverse of targPageList return removeSpecificPagesFromPDF(inFile, rList) of me end removePDFPageAfter –指定PDF書類の複数ページの一括削除 on removeSpecificPagesFromPDF(inFileAlias, targPageNumList as list) set inNSURL to |NSURL|’s fileURLWithPath:(POSIX path of inFileAlias) set theDoc to PDFDocument’s alloc()’s initWithURL:inNSURL –削除対象ページリストをユニーク化して降順ソート(後方から削除) set pRes to theDoc’s pageCount() set t3List to relativeToAbsNumList(targPageNumList, pRes) of me repeat with i in t3List copy i to targPageNum (theDoc’s removePageAtIndex:(targPageNum – 1)) end repeat –Overwrite Exsiting PDF set aRes to (theDoc’s writeToURL:inNSURL) as boolean return aRes end removeSpecificPagesFromPDF –絶対ページと相対ページが混在した削除対象ページリストを絶対ページに変換して重複削除して降順ソート on relativeToAbsNumList(aList, aMax) set newList to {} repeat with i in aList set j to contents of i if i < 0 then set j to aMax + j end if if (j ≤ aMax) and (j is not equal to 0) then set the end of newList to j end if end repeat set t1List to uniquify1DList(newList, true) of me set t2List to sort1DNumListWithOrder(t1List, false) of me return t2List end relativeToAbsNumList –1D/2D Listをユニーク化 on uniquify1DList(theList as list, aBool as boolean) set aArray to NSArray’s arrayWithArray:theList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" return bArray as list end uniquify1DList –Sort 1-Dimension List(String Number List) on sort1DNumListWithOrder(theList as list, aBool as boolean) tell NSSet to set theSet to setWithArray_(theList) tell NSSortDescriptor to set theDescriptor to sortDescriptorWithKey_ascending_("floatValue", aBool) set sortedList to theSet’s sortedArrayUsingDescriptors:{theDescriptor} return (sortedList) as list end sort1DNumListWithOrder –指定PDFのページ数をかぞえる on pdfPageCount(aFile) set aFile to POSIX path of aFile set theURL to |NSURL|’s fileURLWithPath:aFile set aPDFdoc to PDFDocument’s alloc()’s initWithURL:theURL set aRes to aPDFdoc’s pageCount() return aRes as integer end pdfPageCount –連番1D Listを作成 on makeSuccessfulNumArray(sNum, eNum) script spd property aList : {} end script if sNum ≥ eNum then return {} set (aList of spd) to {} repeat with i from sNum to eNum set the end of (aList of spd) to i end repeat return (aList of spd) end makeSuccessfulNumArray |