doc:appunti:prog:screen2pdf

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.

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.

  1. 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.
  2. Installare un programma di cattura schermo scriptabile; deve salvare la schermata senza richiedere interazione.
  3. Assegnare una scorciatoia da tastiera al programma di cattura.
  4. Acquisire tutte le pagine.
  5. Ritagliare le immagini rimuovendo i bordi inutili.
  6. Trasformare le singole immagini nel documento PDF.
  7. 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 SettingsKeyboardApplication 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
doc/appunti/prog/screen2pdf.txt · Last modified: 2023/01/23 10:35 by niccolo