09.08.2009 | 00:02
Hm, baš sam gledao... Preview nema svoj Apple Script Dictionary, barem kod mene, u mom Script Editoru. Đipi, help...
To the rescue!
Preview definitivno nema svoj AS dictionary, ali to ne znači da nema lijeka. Dapače, ovo je dobar primjer za "think different" unutar samog AppleScripta.
Da ne duljim, skripta...
-- PDF Front Page Stripper (using Preview)
-- (08/08/2009) 1.00 release
-- NOTES:
-- turn ON "Enable access for assistive devices" (System Preferences/Universal Access")
-- save this script as Application (File Format)
-- quit Preview BEFORE using this script
-- don't click mouse during execution
on run
display dialog "Drag multiple PDF files or a single folder containg PDF files onto this icon!"
end run
on open draggeditems
set sourcefiles to filelistFromSelection(draggeditems)
-- main loop
repeat with thisFile in sourcefiles
-- convert AppleScript path to POSIX path
set pdfRef to POSIX path of thisFile
-- load PDF into Preview using system shell
do shell script "open /Applications/Preview.app '" & pdfRef & "'"
-- emulate clicking
tell application "System Events"
tell application "Preview" to activate
tell process "Preview"
tell menu bar 1
tell menu bar item "Edit"
tell menu "Edit"
-- dirty hack...
click menu item "Insert Blank Page" -- ...to get pointer to the front page
click menu item "Delete Selected Page" -- then remove inserted page
click menu item "Delete Selected Page" -- and remove the front page
end tell
end tell
tell menu bar item "File"
tell menu "File"
click menu item "Save"
end tell
end tell
end tell
end tell
-- quit Preview
tell application "Preview" to quit
end tell
end repeat
end open
-- returns dragged files OR files at first level of one dragged folder
on filelistFromSelection(theselection)
set hasfolder to false
tell application "Finder"
repeat with thisItem in (theselection as list)
if (class of item thisItem is folder) or (class of item thisItem is disk) then
set hasfolder to true
end if
end repeat
end tell
if ((count item of (theselection as list)) > 1) and hasfolder then
display dialog "Drag multiple files or a single folder." buttons {"OK"} default button 1
return ""
end if
tell application "Finder"
if hasfolder then
set filelist to (every item of folder (item 1 of (theselection as list))) as alias list
else
set filelist to (theselection as list)
end if
end tell
return filelist
end filelistFromSelection
Skripta ima 4 "preduvjeta" korištenja. Dokumentirao sam ih na vrhu same skripte, ali ne škodi ponoviti.
Prvo, potrebno je kliknuti na checkbox "Enable asscess for assitive devices" u System Preferences/Universal Access kako bi se AppleScriptu omogućilo emuliranje kliktanja po izbornicima.
Drugo, potrebno je snimiti skriptu kao droplet ("Application" file format, bira se tijekom Save As u Script Editoru), da bi se na nju moglo dovući (drag&drop) datoteke koje će obraditi.
Treće, treba ugasiti Preview PRIJE pokretanja skripte (ako je slučajno dignut) jer će se u protivnom skripta "izgubiti" (nema nikakav error checking).
I zadnje, tijekom izvršavanja skripte NE smije se kliktati mišem jer zbunjuje emulaciju.
Zanemarimo li funkciju filelistFromSelection() koju smo već vidjeli na Jabučnjaku, skripta je zgodna jer je priseljena koristiti shell za otvaranje dokumenta u Previewu s obzirom da ne možemo (čak ni s emulacijom kliktanja po izbornicima) otvoriti datoteku u Previewu izravno iz AppleScripta. Zaobilazni put je taj da prvo dokučimo POSIX path datoteke koju ćemo obraditi (AppleScript radi sa HFS pathom), a potom ga proslijedimo shellu koji će, koristeći naredbu "open" otvoriti Preview.app i učitati proslijeđenu datoteku (odnosno njezin path). Time smo riješili manji problem.
Veći problem je kako ubiti prvu stranicu. Naime, kad otvorimo PDF u Previewu, pogotovo ako PDF ima index (prikazuje se u Sidebaru), nije nam dostupna opcija Edit/Delete Selected Page - jer nije odabrana konkretna stranica. S obzirom da nemamo pametnog načina za "odabrati" stranicu koju želimo, a defaultno se nalazimo na prvoj stranici, koristimo "prljavi trik" - dodamo jednu praznu stranicu (Insert Blank Page - opcija koja nam je uvijek dostupna) i time dobijemo pointer na nju. Sad možemo "kliknuti" (emulirano) na Delete Selected Page i to dvaput - prvi put ubijemo dodanu stranicu, a drugi put "naslovnu".
Ovdje ima
kvaka! Preview pamti stranicu na kojoj smo stali (automatski "bookmark" ). Drugim riječima, ako PDF dokument ima 42 stranice, a zadnji put smo ga učitali i quitali Preview dok smo bili na 21. stranici, kad sljedeći put otvorimo isti dokument, nalazit ćemo se tamo gdje smo stali - na 21. stranici. To znači da bi "prljavi trik" mogao napraviti kaos ako korisnik nije siguran da li su svi dokumenti automatski bookmarkirani na prvoj stranici! Očito nema smisla da korisnik sam provjeri jer bi to značilo otvaranje N dokumenata, odlazak na prvu stranicu i izlazak iz Previewa, a ako to već radi, onda može usput i pobrisati naslovnicu pa ne mora ni čitati ovaj post.
Rješenje kvake? U korisnikovom Library/Preferences folderu nalazi se "com.apple.Preview.bookmarks.plist". Ako ga pobrišemo, Preview će "zaboraviti" sve bookmarke i PDF datoteke koje potom učitamo u njega bit će, defaultno, na naslovnici (page 0).
Naravno, ne moramo ga pobrisati, možemo ga i spremiti ili preimenovati pa kasnije vratiti nazad (ako je potrebno pamtiti stare bookmarke).
Ostatak skripte je trivijalan - nakon što smo uklonili naslovnicu, snimimo preinačeni PDF i ugasimo (quit) Preview. Proces se ponavlja za sve datoteke koje smo odvukli na ikonicu skripte.
Nadam se da je dovoljno elegantno. A i besplatno je.