====== 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