sabato 19 settembre 2009

Come avere un libro sul web in pdf


A tutti è capitato di trovare un interessane manuale su internet e di volerlo stampare magari per poterselo leggere con calma durante il tempo libero, ma purtruppo molti di questo sono in formato "html" e sono solo capitoli che contengono i link a quelli successivi e non è prevista l'opzione per poterli stampare e stampare i capitoli uno ad uno è noioso!
Fortunatamente possiamo ricorrere ad uno script che fa tutto per noi. (Funziona su sitemi GNU/Linux)

Per prima cosa dobbiamo installare il pacchetto  htmldoc che è un semplice comando da terminale che converte un documento in formato html in pdf. Per farlo usate il vostro gestore pacchetti!

Ora apriamo il nostro edito di testo e mettiamo lo script per scaricare il le varie pagine e convertirle in un unico documento pdf:

#!/bin/bash

#those are the urls of the pages
path=http://www.ilnomedelsito/pagine
endPath=.html

#get all the pages from the web
for i in {1..55}
do
tmp=$path$i$endPath
wget $tmp
echo "page $i ->got"
done

list=""

#create a string with all the files's name
for i in {1..55}
do
list="$list $path$i$endPath"
done
echo "all file processed"

htmldoc -f book.pdf $list --webpage

#remove the temporary html files
rm -f *.html

echo "all done"

exit 0



Ora spieghiamo un po a cosa serve il tutto:
 #those are the urls of the pages
path=http://www.ilnomedelsito/pagine
endPath=.html

Queste sono due semplici variabili che identificano l'indirizzo da dove scaricare i file. Infatti, di solito questi libri hanno l'indirizzo composto da www.nome-sito.qualcosa/nome-libro/pagina-numero.html. Il nostro compito è semplicememte sostituire il numero con i vari numeri delle pagine da cui è composto il libro. (Ovviamente dovete mettere l'url giusto!)

#get all the pages from the web
for i in {1..55}
do
tmp=$path$i$endPath
wget $tmp
echo "page $i ->got"
done

Qui non si fa altro che un semplice ciclo per completare l'indirizzo con i vari numeri delle pagine identificati dalla variabile i. Nell'esempio abbiamo dalla pagina 1 alla 55, ma voi potete usare quelle che volete. Con wget poi le scharichiamo.

#create a string with all the files's name
for i in {1..55}
do
list="$list $path$i$endPath"
done
echo "all file processed"

Analogamente a prima qui creiamo una variabile che continene tutti i nomi die file che abbiamo appena scaricato.

htmldoc -f book.pdf $list --webpage

#remove the temporary html files
rm -f *.html

Gli ultimi due comandi servono per creare il pdf da tutte le pagine web scaricate (richiederà del tempo, a seconda del numero di pagine) e rimuovere le pagine html una volta finito tutto.

Ora non vi rimane altro che creare una cartella dove volete, mettere dentro il nostro script, renderlo eseguibile (comando chmod) ed eseguirlo.
Attendiamo un paio di istanti ed avremo il nostro documento in pdf che potremo stampare comodamete o farci quello che vogliamo!

ATTENZIONE: ovviamento non dovete usare questo script per cose illegali tipo distribuire il libro scaricato ai vostri amici!

3 commenti:

  1. ciao lorenzo. seguo il forum telefoninux anche e io e ho trovato il link nella tua firma. mi interessa molto l'articolo che hai scirtto ma credo di avere un problema: devo scaricare una guida da html.it. ma li la numerazione delle pagine è diversa: la pagina princiapale è questa: http://programmazione.html.it/guide/leggi/34/guida-c/ , mentre le pagine sono così numerate:
    http://programmazione.html.it/guide/lezione/1149/introduzione/
    http://programmazione.html.it/guide/lezione/1150/la-storia-del-c/

    eccetera eccetera eccetera.. sai darmi una mano?

    RispondiElimina
  2. wow allora c'è qualcuno che legge le firme! :)

    Allora sarà un po incasinato!

    per la prima pagina puoi fare una semplice variabile indice=http://programmazione.html.it/guide/leggi/34/guida-c/ ed aggiungerla all'inizio di list prima di fare il for (in pratica al posto di fare list="" fai list=$indice)

    Per gli altri puoi fare il for che parte da 1149 e arriva a 1198 poi dovresti sostituire la variabile endPath con i vari nomi e qui sta il problema!

    Dando una rapida occhiata ho notato che sono i nomi dei capitoli con i - al posto degli spazi. Quindi io mi farei un file di testo copiandoci dentro il numero e il titolo dei vari capitoli e mettendoci i trattini (è un po noioso ma puoi usare la funzione "sostituisci" che c'è in tutti gli editor)
    poi dentro al for si potrebbe andare a scegliere la riga esatta con qualcosa tipo grep ^$num nomefile.

    Peró non sono molto sicuro, dopo provo a fare qualche esperimento e ti faccio sapere ;)

    RispondiElimina
  3. rieccomi! Ho goichicchiato con gli script e dovrei aver trovato una soluzione.
    Fai un file di testo come ti avevo detto prima con i nomi messi così (attento a togliere le maiuscole i ++ e ? ecc):
    1 introduzione
    2 la-storia-del-c
    ...
    18 listruzione-condizionale
    ...
    50 la-sintassi-di-una-classe-derivata

    e lo salvi nella stessa cartella poi fai il primo ciclo for cosí:
    < code >

    for i in {1149..1198}
    do
    let "n=$i-1148"
    endPath=`grep -w ^$n nome-del-file`
    #attento al carattere ` detto back-quote lo trovi con AltGr+'
    if [ $n -le 10 ]; then
    endPath=$endPath{endPath:2}
    else
    endPath=$endPath{endPath:3}
    fi
    tmp=$path$i$endPath
    wget $tmp
    echo "page $i ->got"
    done

    < /code >
    poi metti il secondo for ricordando di sostituire gli indici!
    L'ho testato solo su un file di prova senza scaricare le cose però credo funzioni. Stai attento all'output e se da qualche errore sul wget controlla bene il nome.

    Lascio a te il divertimento di capire cosa fa il pezzo di script, se hai domande fai pure!

    RispondiElimina