Table of Contents
Come salvare in PDF un libro da Google Libri
Se avete acquistato un libro con Google Libri avete molte meno libertà di quelle che avete quando acquistate un libro di carta. Tanto per cominciare potete leggerlo solo con il programma che ha deciso Google: sul telefonino esiste l'app Google Play Libri, sul desktop potete leggerlo nel browser dal sito Google. Impossibile farne una copia PDF per leggerlo ad esempio in un ebook reader oppure per poterlo stampare. E se il vostro account Google smette di funzionare? Il libro scompare. E se volete lasciare in eredità i vostri libri ai vostri figli? Scordatevelo.
Con questa ricetta è possibile salvare un libro in PDF catturando le schermate dal computer. È una soluzione di compromesso al ribasso: il file risultante conterrà le immagini delle pagine, quindi il testo non è cercabile né esportabile in qualche formato modificabile. Il file risultante sarà di dimensioni importanti (circa 20 Mb per 100 pagine). L'eventuale indice deve essere ricostruito a mano.
La ricetta un po' da smanettoni è eseguibile facilmente su un computer desktop GNU/Linux, la sua caratteristica è di poter scegliere la qualità delle immagini (risoluzione in pixel) a piacimento. C'è un po' di lavoro manuale da fare (premere due tasti per ogni pagina) e poi da eseguire degli script per comporre le singole immagini un un solo documento PDF.
- Impostare una risoluzione virtuale elevata. Ciò consente di simulare un monitor ad esempio di 1300×2000 pixel (notare il formato portrait), in modo che il browser visualizzi una pagina intera del libro a risoluzione elevata.
- Installare un programma di cattura schermo scriptabile; deve salvare la schermata senza richiedere interazione.
- Assegnare una scorciatoia da tastiera al programma di cattura.
- Acquisire tutte le pagine.
- Ritagliare le immagini rimuovendo i bordi inutili.
- Trasformare le singole immagini nel documento PDF.
- Aggiungere eventualmente un indice.
Ho provato la procedura su una Debian 10 Buster, ma non ci sono impedimenti ad eseguirla su altre distribuzioni.
Schermo virtuale
Molto semplicemente si utilizza il comando xrandr. Eseguito senza parametri si scopre l'attuale monitor utilizzato e la sua risoluzione. Nel nostro caso si tratti di LVDS-1 a 1366×768. Per attivare la risoluzione virtuale è sufficiente dare il comando (a nome dell'utente che possiede la sessione grafica):
xrandr --output LVDS-1 --mode 1366x768 --panning 1366x2000
Per tornare alla condizione normale è sufficiente ripetere il comando impostando la stessa risoluzione per --mode e --panning.
ATTENZIONE: Quando si cambia risoluzione virtuale si deve riavviare il programma Flameshot in modo che la cattura della schermata avvenga per intero!
Programma di cattura schermata
Ho utilizzato flameshot fornito dall'omonimo pacchetto Debian. È necessaria una configurazione preliminare: si avvia il programma con l'opzione config:
flameshot config
Nell'apposita applet si impostano alcune opzioni:
- Filename editor: impostare il nome che avrà il file salvato, usare ad esempio %F_%T per utilizzare un timestamp comprensivo dei secondi.
- General: Disabilitare lo Show desktop notification, che nel mio caso restano visualizzate troppo a lungo.
Quindi si crea uno script che esegua il cattura schermo, io l'ho salvato in $HOME/bin/cattura-schermo e contiente:
#!/bin/sh flameshot full -p ~/Pictures
Gli screenshot verranno salvati nella cartella $HOME/Pictures/.
Assegnare un tasto scorciatoria
Poiché utilizzo XFCE, ho eseguito Settings ⇒ Keyboard ⇒ Application Shortcuts ed ho creato un nuovo comando associando lo script al tasto PrintScreen.
Acquisire le immagini di tutte le pagine
A questo punto è possibile impostare il browser a tutto schermo (virtuale), aprire il libro sulla prima pagina e zoomare a pagina intera. Si potrà premere ripetutamente PrintScreen e PagDown per salvare tutte le pagine del libro. Fate trascorrere almeno un secondo fra una pagina e l'altra, in modo che il nome del file sia diverso dal precedente.
Ritagliare i bordi inutili
Utilizzando il comando convert fornito dal pacchetto imagemagick-6.q16 è possibile ritagliare automaticamente i bordi inutili a tutte le immagini create. Ecco uno script facilmente adattabile alle proprie esigenze. Le dimensioni di crop (larghezza x altezza + sinistra + alto) si possono determinare aprendo una immagine in Gimp e utilizzando lo strumento ritaglia. In questo esempio tutte le immagini esistenti nella directory corrente verranno ritagliate e salvate nella sottodirectory cropped.
#!/bin/sh mkdir cropped find . -maxdepth 1 -type f -name "*.png" | while read file; do convert $file -strip -crop '1000x1414+120+180' cropped/$file done
Se le immagini sono in bianco e nero (oppure pochi toni di grigio) è possibile risparmiare un po' di spazio usando una codifica a 4 bit (16 toni di grigio), aggiungendo le opzioni -depth 4 -colorspace gray -define png:color-type=0
al comando convert
. Il color-type=0 per PNG significa greyscale e supporta il formato a 2, 3, 4, 8 o 16 bit, vedere Imagemagick png_write.
Trasformare le immagini in PDF
Ho utilizzato il comando img2pdf fornito dall'omonimo pacchetto Debian (oppure installabile con il sistema pip). Il programma consente di creare il PDF senza alterare le immagini originali, cioè queste vengono inserite nel PDF senza ricodificarle come invece farebbe il tool convert.
Questa una ricetta molto semplice per creare il PDF, deve essere eseguito nella directory che contiene le immagini ritagliate:
img2pdf --pagesize a4 --title "Titolo del libro" --author "Nome Cognome" *.png > libro.pdf
Creazione di un indice
Per aggiungere un indice al documento PDF è necessario creare un file che aggiunga ai metadati esistenti (titolo, autore, ecc.) un titolo e una pagina per ogni bookmark. Ad esempio si crea un file pdf_info.txt con:
InfoBegin InfoKey: Title InfoValue: Titolo del libro InfoBegin InfoKey: Author InfoValue: Nome Cognome NumberOfPages: 184 BookmarkBegin BookmarkTitle: Capitolo 1 BookmarkLevel: 1 BookmarkPageNumber: 8 BookmarkBegin BookmarkTitle: Capitolo 2 BookmarkLevel: 1 BookmarkPageNumber: 43
È possibile definire bookmark di primo livello, di secondo livello, ecc. Con il programma pdftk (fornito dal pacchetto Debian pdftk-java) è possibile creare un nuovo PDF aggiungendo le informazioni dell'indice:
pdftk libro.pdf update_info pdf_info.txt output libro_index.pdf