Come aggirare la protezione dei PDF con blocchi di modifica, selezione testo e simili con Hazel ed Applescript
Premetto che questo articolo è un po’ particolare; mette insieme svariate tematiche prevalentemente legate all’automazione.
Tutto è iniziato con un problema relativamente banale: volevo archiviare in modo automatico gli estratti conto digitali della mia banca. Tuttavia l’estratto conto che scarico dal sito della banca è un PDF speciale: bloccato in alcune sue parti. Qui è nato il problema, non particolarmente difficile da risolvere (vi spiegherò il trucco per sbloccare certi tipi di PDF più oltre nell’articolo), complesso da ottimizzare con un sistema automatico come quelle che, di fatto dopo 3 settimane di tentativi, ho risolto.
Quest’articolo è il motivo per cui ho pubblicato “Come salvare velocemente qualsiasi documento in PDF con il trucco di David Sparks”, a cui rinvio per la sua parte di spiegazione e che qui darò per scontata.
Vi suggerisco di leggere l’intero articolo anche se non dovete risolvere un problema simile. Le tecniche che ho usato per risolvere il mio problema infatti possono essere utilizzate anche in altri contesti e per altre necessità.
1. Il Problema: l’errore in dettaglio di Hazel
Come potete vedere nell’immagine sottostante la regola di Hazel, che ho creato per archiviare automaticamente gli estratti conto scaricati dalla banca, aveva problema.
Ho esaminato il preview, ovvero l’anteprima della regola fatta su un documento reale, ed ho notato che il problema risiedeva nella regola di match della data dell’estratto conto. L’errore in particolare indicava che era impossibile importare il testo dal documento (Could not import text from – come mostrato nel riquadro rosso dell’immagine).
1.1 La porzione da cui estrarre il match della data
Come potete vedere il match della data era relativamente semplice (per motivi evidenti vi allego solo la parte iniziale dell’estratto conto). Il testo “estratto conto al 31 marzo 2016” era selezionatile senza problemi; tuttavia Hazel non riusciva ad accedervi per fare le sue magie …
1.2 Spiegazione della regola di base
Ho già spiegato come utilizzare le funzioni di match delle date in Hazel. Come potete vedere Hazel non aveva problemi ad esaminare il contenuto del documento rispetto ad una specifica porzione di testo ma il match della data non funzionava.
La regola di fatto fa un controllo sul numero del conto corrente ed altre caratteristiche tipiche di questo estratto conto per evitare che la regola si attivi quando non è necessario. L’utilizzo del match della data dell’estratto conto, l'ho inserito per utilizzare il dato ai finie della rinomina del documento e per archiviare i singoli documenti in una cartella e suddividere gli estratti conto in sottocartelle legate al singolo anno.
1.3 La regole di confronto (match) dello schema della data in dettaglio
Di seguito vi faccio vedere la regola di confronto della data. Come potete vedere ho creato il match con quanto individuato al punto 1.1 nel frontespizio dell’estratto conto.
Fatte le dovute premesse vediamo come risolvere il problema.
2. Come si accede alle proprietà di un PDF in Acrobat
L’errore indicato da Hazel è legato a dei blocchi imposti al PDF dalla banca.
Per vedere di che blocchi si tratta, tuttavia, occorre utilizzare Acrobat di Adobe (ho fatto i miei test con la versione Pro DC ma credo funzioni anche con la versione Reader gratuita).
Andate nel menù “File” e premete "Proprietà…" o usate la scorciatoia a tastiera ⌘D.
2.1 I limiti di esame di un PDF con Anteprima o il pannello delle informazioni di macOS
Prima di esaminare i risultati in Acrobat segnalo come Anteprima in questo caso abbia dei limiti. Come potete vedere nell’immagine sottostante nel pannello delle informazioni del documento (apribile con la scorciatoia a tastiera ⌘I), Anteprima restituisce delle informazioni incomplete; segnala solo che il PDF è protetto da una password (sicurezza: password encrypted), nulla più. Acrobat invece ci permette di analizzare più in dettaglio le limitazioni del PDF.
2.2 Il Problema visto all’interno delle proprietà del PDF con Acrobat
Aprendo il pannello delle proprietà del documento di Acrobat Pro DC, nel tab legato alla protezione del documento vediamo, nel Riepilogo limitazioni del documento , le attività di utilizzo del PDF consentite o meno.
Come si vede nell’immagine sottostante, punto 1 e 2, non è consentita la modifica del documento e, in particolare, l’estrazione pagina. Questa limitazione è quella che non permette ad Hazel di estrarre la data dal documento. Hazel, infatti, per eseguire il match (confronto) deve recuperare l’intero contenuto testuale del PDF.
Segnalo, da ultimo, che, esaminando le limitazioni del documento, è permessa la stampa del documento. Questa possibilità, come vedremo oltre, è fondamentale per aggirare i blocchi di protezione. Se fosse inibita anche la stampa del PDF il trucco che vi mostrerò a breve non funzionerà.
3. Come aggirare il problema e sbloccare il PDF
Come vi ho mostrato qui, macOS ha la possibilità di stampare in PDF qualsiasi tipo di documento: anche i PDF stessi!
Il PDF così generato non avrà le protezioni del PDF originale (di fatto è come una stampa su carta) ma manterrà tutte le altre caratteristiche del PDF originale.
Stampare in PDF (anche se utilizziamo il trucco di David Sparks) richiede tempo. Dovremo infatti premere 2 volte ⌘P, scegliere dove salvare il nostro PDF, (eventualmente) rinominarlo e premere il tasto “Salva”. L’operazione diventa tediosa se al posto di un solo documento ne abbiamo vari, per esempio 10 o 15.
L’idea di fondo che volevo applicare era la seguente: 1. automatizzare con AppleScript tutti i passaggi di stampa e salvataggio del PDF, 2. usare una regola di Hazel piuttosto semplice (cambiare l’etichetta di una selezione di documenti) per far scattare l’Applescript e sbloccare in un colpo N documenti.
4. La regola di Hazel
Vediamo innanzitutto la regola di Hazel per attivare l’Applescript, prima di spiegare in dettaglio come ho creato e come funziona l’Applescript.
Come condizione per attivare la regola ho imposto che il colore dell’etichetta (label) fosse rossa (ma può essere un colore a vostra scelta); ho poi indicato che la specie (kind) del documento fosse un PDF, per rendere la condizione più specifica ed evitare errori.
Quando la condizione si perfeziona Hazel provvederà anzitutto a togliere l’etichetta dal documento onde evitare che ripeta successivamente l’operazione (selezionate l’azione Set color label e poi premete il tasto x indicato nell’immagine sottostante dalla freccia rossa); aprirà (open) il PDF con l’applicazione Anteprima (Preview in inglese) e, a questo punto, eseguirà l’AppleScript salvato (endebbed) all’interno della regola di Hazel (vedremo il testo dello script a breve non preoccupatevi).
4.1 Un errore da evitare: i label (le etichette) sono differenti dai tags.
Segnalo un errore in cui ero incappato originariamente: i label (le etichette) sono differenti dai tags. Vedete nell’immagine sottostante che avevo dato come regola ad Hazel di rimuovere il tag (Remove tags in inglese) Rosso (Red). Etichette e tag in macOS sono rappresentati similmente ma non sono la stessa cosa!
5. Creare un AppleScript: Abilitare nelle funzionalità di accessibilità Script Editor
Vediamo, quindi, come creare il nostro script.
Vi ho spiegato come si apre lo Script Editorqui (nella parte finale dell’articolo).
Una cosa che non ho spiegato (per chi apre l’editor per la prima volta) è la necessità di abilitare questo programma nelle funzioni di accessibilità. Nell'immagine sottostante si vede l'avviso che compare se lo Script Editor non è stato abilitato.
5.1 Abilitare lo Script Editor
Andate nelle Preferenze di Sistema, alla voce Sicurezza e Privacy cercate il tab Privacy (come mostrato nell’immagine sottostante). Potete vedere che, lo Script Editor non ha il flag (la spunta) come altre applicazioni e che tutto il pannello delle applicazione è di colore grigio (è disabilitato). Questo perché il pannello Privacy è bloccato (come si vede nell’immagine, freccia rossa).
5.2 Script Editor abilitato
Cliccate quindi sull’icona del lucchetto per sbloccarlo (vi verrà chiesta la password) e poi aggiungete la spunta allo Script Editor come mostrato nell’immagine sottostante.
6. Come creare l’AppleScript: pensare a cosa si vuole fare
Premetto che sono arrivato a tentoni all’illuminazione ed inizialmente ho avuto un approccio un po' troppo complesso. Qui di seguito vi illustro come avrei dovuto ragionare fin dall’inizio (per risparmiare del tempo e per fare, fin da subito, ricerche più mirate).
Secondariamente, come vi ho già detto altre volte, non sono un esperto di AppleScript, anzi tutto il contrario. Vediamo in dettaglio i vari passaggi.
Il primo è relativamente semplice, basta dare il comando di stampa alla programma Anteprima che sarà stato aperto da Hazel con il PDF da sbloccare (immagine sottostante).
6.1 Il problema del salvataggio come PDF di una stampa
Il primo problema che ho dovuto affrontale è occorso quando ho premuto il tasto ⌘P ovvero “Salva come PDF… ” (secondo il trucco di David Sparks).
La finestra di dialogo che si apre per eseguire il salvataggio infatti ricorda l’ultima cartella in cui è stato salvato un documento con questo metodo. Il problema è che, così facendo, il PDF sbloccato viene potenzialmente salvato in modo casuale all'interno dell'ultima cartella in cui abbiamo salvato con questo metodo un PDF.
6.2 Modificare la cartella di salvataggio delle stampe
Dopo aver consultato vari forum ho scoperto qualcosa di relativamente banale ma essenziale per permettermi di automatizzare questa parte del flusso di lavoro.
Invece di dover cliccare sul pulsante blu con le doppie frecce che apre il menù a tendina di “Situato in:” basta premere la scorciatoia a tastiera ⇧⌘G ovvero il comando del Finder "Vai alla cartella…" (trovate il comando del Finder nel menù “Vai”).
Questo comando a tastiera permette di impostare una cartella specifica di salvataggio senza utilizzare il pulsante con il menù a tendina.
6.3 Cosa ho fatto quindi?
Quando finalmente ho trovato “il pezzo mancante” ho creato un AppleScript piuttosto semplice, lo vedremo tra poco. Di fatto ho scelto di utilizzare le capacità di Applescript di simulare la pressione dei tasti. Lo script in pratica simula le azioni che avrei svolto manualmente facendole compiere in modo più rapido dal computer.
Col senno di poi parte dello script poteva essere fatto attraverso Keyboard Maestro e le sue funzioni di simulazione della digitazione dei tasti; credo tuttavia che usando Hazel ed AppleScript il grado di automazione raggiunto sia maggiore.
7. Importare attributi dal file manipolato da Hazel nell’AppleScript
Lo script che avevo originariamente creato salvava i documenti sbloccati in una cartella predefinita impostata direttamente all'interno del testo dallo script. Mentre testavo l’integrazione con Hazel, tuttavia, ho scoperto un’altra grande capacità di questo programma.
Hazel, infatti, permette di interagire con lo script e di inserire all’interno dello stesso i dati reperiti dal documento che sta manipolando. Oltre a ciò (ma non useremo questa opzione oggi) può anche estrarre risultati dallo script stesso da riutilizzare altrove.
Io non mi sono addentrato nei meandri di queste funzioni, non ne ho le capacità. Tuttavia questa profonda integrazione permette, avendone le conoscenze, di far svolgere compiti molto avanzati ad Hazel.
Vediamo come estrarre un dato fondamentale per il mio script: il percorso del file che si sta manipolando.
Ottenendo questo dato, infatti, ho potuto far salvare il documento sbloccato direttamente nella stessa cartella del PDF originale. Questo ottimizza molto il flusso di lavoro per me poiché la cartella in cui scarico i documenti da sbloccare è la medesima in cui ho tutte le mie automazioni di Hazel, che può quindi procedere ad archiviare (grazie ad altre regole) il documento senza che io faccia nulla (come illustrato al punto 1).
Hazel può passare all'Applescript degli attributi che vengono inseriti all'interno della variabile "InputAttributes". All’interno di Hazel nell’azione che attiva lo script va detto ad Hazel quali attributi vogliamo estrarre dal nostro documento.
Come ho detto a me interessava estrarre solo il percorso del file. Per fare ciò ho premuto il tasto + (punto 1 dell’immagine che segue) ed aggiunto un attributo (di prassi viene inserito il Nome – punto 2). Premete sulle due frecce (come mostrato nel punto 3), vedrete varie voci, ma voi selezionate “Other…” (altro in inglese) questo vi permetterà di accedere a tutti i parametri gestiti dall'indicizzazione di macOS. Come mostrato al punto 4 nel capo di ricerca (con l’icona della lente) iniziate a digitare "percorso file". A questo punto dovrebbe risultare una sola voce, selezionatela e premete il tasto Done (punto 5). Ora, all'interno della variabile InputAttributes Hazel inserirà il percorso del file manipolato.
8. Lo Script per Hazel che ho creato
Di seguito vi lascio il testo dello script per poterlo copiare ed incollare nello Script Editor.
tell application "System Events" to tell process "Preview" set frontmost to true -- attiva Anteprima click menu item "Stampa..." of menu 1 of menu bar item "File" of menu bar 1 delay 0.5 keystroke "p" using command down -- Simula la pressione della combinazione ⌘P delay 1 keystroke "g" using {command down, shift down} -- Simula Ia pressione del tasto ⇧⌘G set filesavepath to inputAttributes tell sheet 1 keystroke filesavepath delay 0.5 keystroke (ASCII character 13) -- simula la pressione del taste invio delay 0.5 key code 124 -- Simula la pressione del tasto freccia a destra delay 0.5 keystroke " - shloccato" -- aggiungere un testo che differenzi il PDF sbloccato dal PDF originale delay 0.5 keystroke (ASCII character 13) -- simula la pressione del tasto invio delay 0.5 tell application "Preview" to close the front window -- chiusura della finestra di Anteprima aperta con il PDF end tell end tell
Nell’immagine sottostante vedete lo script come risulterà importato nello Script Editor e dopo aver premuto il tasto a forma di martello (per la validazione dello script).
Ho commentato le varie righe del codice, specificando cosa fa ogni singola linea. Di seguito quindi vi descriverò brevemente le azioni una di seguito all’altra.
Lo script dice all’applicazione Anteprima di attivarsi (grazie ad Hazel sarà già aperta sul PDF da sbloccare); dirà poi di premere il comando "Stampa…" dal menù "File"; quindi aspetterà (delay) 0,5 secondi; premerà il tasto ⌘P; altra pausa; premerà la combinazione di tasti ⇧⌘G per selezionare la cartella di salvataggio; a questo punto il percorso originale del file verrà salvato nella variabile filesavepath e verrà digitato tale testo nel menù “Vai alla cartella…” aperto con ⇧⌘G; verrà simulato la pressione del tasto invio per chiudere il menù; simulato poi la pressione del tasto freccia a destra, per deselezionare il nome del documento; simulata la digitazione del testo "- sbloccato" che verrà aggiunto in fondo al nome del file (che, così facendo, cambierà nome del documento); infine premuto il tasto invio che procederà a Salvare il documento sbloccato.
Per finire, onde evitare di avere tante finestre aperte dei singoli PDF da sbloccare, ho impostato l’Applescript per chiudere la finestra di Anteprima.
NOTA CONCLUSIVA sullo script: quello che avete tra le mani non è uno script avanzato e fatto da un programmatore serio; quindi su vari fronti non presenta quelle finezze che, sia per incapacità sia per i tempi ristretti, non mi sono potuto permettere di inserire. Sui vari forum ho letto di come sarebbe meglio avere delle procedure di sicurezza per evitare che lo script faccia qualcosa di differente da quanto programmato. Nel caso specifico segnalo, infatti, che lo script preme alla “cieca” i tasti e, quindi, se la situazione non è quella che ho prospettato io, potrebbe dare degli errori o bloccarsi. Tipico esempio è se esiste già un documento sbloccato con il medesimo nome (nei miei vari test ed è stato uno dei casi tipici di blocco).
9. La configurazione dell’Applescript in Hazel
Di seguito vedete come inserire lo script nella regola di Hazel e come ho importato l’attributo “Percorso file”.
10. Risorse utili
Lascio, infine, a “futura memoria” per chi si volesse cimentare i codici per simulare la pressione attraverso dei tasti speciali come le frecce o il tasto invio in un AppleScript.
10.1 I codici per le frecce
- Sinistra: key code 123
- Destra: key code 124
- Su: key code 126
- Giù: key code 125
- Invio: key code 36
Esempio pratico
tell application "System Events" key code 123 using {control down, option down, command down} end tell `
10.2 Esempio TAB ed INVIO con i caratteri ASCII
keystroke (ASCII character 9) -- pressione tasto tab keystroke (ASCII character 13) -- pressione tasto invio
In conclusione
Anzitutto, un grazie se siete ancora qui a leggere i miei sproloqui informatici.
Aver affrontato questa sfida mi ha permesso di risolvere un altro “problema” legato alla mia necessità di automatizzare il salvataggio delle email. Nelle prossime settimane vi mostrerò la macro che ho creato con Keyboard Maestro ed una regola di Hazel per inserire in automatico la data di ricezione / spedizione di una email nel nome del file EML di salvataggio.
Ovviamente se testate lo script lasciatemi un feedback qui sotto nei commenti (nota a margine: se volete lasciare un commento utilizzate Firefox o Chrome; Safari ha dei notevoli problemi con l'interfaccia di SquareSpace per lasciare un commento).
Alla prossima!