====== 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 **[[https://play.google.com/store/apps/details?id=com.google.android.apps.books&gl=IT|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.
{{google2pdf.png?512|Da Google Libri a PDF}}
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 1300x2000 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 **1366x768**. 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 **[[https://legacy.imagemagick.org/Usage/formats/#png_write|Imagemagick png_write]]**.
===== Trasformare le immagini in PDF =====
Ho utilizzato il comando **img2pdf** fornito dall'omonimo pacchetto Debian (oppure installabile con il sistema **[[wp>Pip_(package_manager)|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