Documentazione · 10 min read · Feb 07, 2026
Creazione di Documenti DjVu Linux HOWTO
versione 0.2 (12 luglio 2006)
1 Sinossi
Questo documento spiega alcuni degli usi dell’implementazione djvulibre di DjVu per creare documenti DjVu di qualità in linux. Il formato DjVu presenta la compressione dei documenti bitmap e una struttura ipertestuale. È utilizzato da numerosi siti web in tutto il mondo per memorizzare e distribuire documenti digitali, inclusi documenti scansionati e immagini ad alta risoluzione. Uno dei vantaggi dei file DjVu è che sono notevolmente piccoli, spesso più piccoli di file PDF o JPEG con lo stesso contenuto. Questo rende DjVu uno strumento utile per digitalizzare libri e riviste, specialmente quelle scientifiche.
Di seguito si considera il caso in cui un documento DjVu venga creato da un numero di file JPEG separati, ciascuno contenente una singola pagina. Qui il formato JPEG non è una limitazione, e gli esempi possono coprire formati di immagine arbitrari. Viene anche discussa la conversione da PDF a DjVu. L’uso di software per scanner non è spiegato: fare riferimento alla documentazione pertinente.
Requisiti. I pacchetti djvulibre, jpeg e netpbm sono richiesti. I pacchetti sane e xpdf sono altamente raccomandati.
2 Creazione di DjVu
2.1 Scansione di un libro
Supponiamo la seguente situazione per questa sezione. Abbiamo un libro che deve essere scansionato e memorizzato in un formato digitale. Per semplicità supponiamo che tutto il contenuto del libro sia in bianco e nero (testo, formule, diagrammi, ecc.) tranne che per la copertina del libro, che è stampata a colori. Ciò che normalmente possiamo fare è scansionarlo pagina per pagina e memorizzare le pagine separatamente in un formato immagine, come JPEG o PDF. Personalmente, credo che JPEG sia la scelta migliore. Ma se trovi, ad esempio, TIFF compresso più adatto ai tuoi scopi, questo HOWTO potrebbe esserti utile. Tuttavia, in questo caso, gli script di esempio dovrebbero essere leggermente modificati. Per il momento, atteniamoci a JPEG.
Nella nostra situazione con il libro, scanniamo la copertina anteriore del libro (e anche la copertina posteriore, se contiene testo o immagini evidenti) in file JPEG a colori. Poi scanniamo il resto in JPEG in bianco e nero. Questo dovrebbe dare le prestazioni ottimali. Quando si salvano le immagini scansionate, prestare attenzione ai nomi dei file. Ai fini della conversione in DjVu, tutte le immagini devono essere disposte in ordine alfabetico rispettando l’ordine delle pagine. Ad esempio,
000.jpg, 001.jpg, 002.jpg, …, 012.jpg
è una numerazione corretta; e
0.jpg, 1.jpg, 2.jpg, …, 12.jpg
è una numerazione errata perché 12.jpg apparirà prima di 2.jpg. Una volta che l’intero libro è stato scansionato, posiziona tutti i file immagine in una directory separata.
A seconda del dispositivo scanner, del software e del metodo di scansione, potrebbe essere necessario ruotare tutte o solo alcune delle immagini JPEG, di solito seguendo uno schema semplice. Lo script jpegsrotate qui sotto può essere molto utile in tal caso. Ad esempio, eseguilo con il parametro –even per ruotare le pagine pari sottosopra nella directory corrente. Il programma jpegtran utilizzato nello script può ruotare i JPEG solo di 90, 180 o 270 gradi in senso orario.
#!/bin/bash
#
# jpegsrotate
#
if [ -z `which jpegtran` ]; then
usage
echo "Errore: jpegtran è necessario"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270
function usage() {
echo
echo "uso:"
echo "$0"
echo " ruota i file con la maschera $DEFMASK di $DEFDEG gradi in senso orario"
echo "$0 --even"
echo " ruota i file pari con la maschera $DEFEVENMASK di 180 gradi"
echo "$0 --odd"
echo " ruota i file dispari con la maschera $DEFODDMASK di 180 gradi"
echo "$0 --params \"REGEXP\" (90|180|270)"
echo " ruota i file con la maschera REGEXP secondo il rapporto d'aspetto dato in senso orario"
echo
}
if [ "$1" == "--even" ]; then
MASK=$DEFEVENMASK
DEG=180
elif [ "$1" == "--odd" ]; then
MASK=$DEFODDMASK
DEG=180
elif [ "$1" == "--params" ]; then
if [ -n "$2" -a -n "$3" ]; then
MASK=$2
DEG=$3
else
usage
exit 1
fi
elif [ -n "$1" ]; then
usage
exit 1
else
MASK=$DEFMASK
DEG=$DEFDEG
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Errore: la directory corrente deve contenere file con la maschera $MASK"
echo
exit 1
fi
echo "$i"
jpegtran -rotate $DEG $i > $i.rotated
mv $i.rotated $i
done
2.2 JPEG a DjVu bitonale
Quando le immagini sono pronte, ciascuna di esse deve essere convertita in una pagina separata nel formato DjVu da un codificatore DjVu, come cjb2 o cpaldjvu, e poi le pagine separate devono essere raggruppate in un unico documento DjVu da djvm. Scrivi il seguente script chiamato any2djvu-bw da qualche parte, ad esempio in ~/bin/. Esegui lo script nella directory contenente le immagini sorgente per convertire le pagine separate in bianco e nero.
#!/bin/bash
#
# any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Errore: anytopnm, ppmtopgm, pgmtopbm e cjb2 sono necessari"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# decommenta la seguente riga per compilare un documento DjVu raggruppato
#OUTFILE="#0-bw.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\"]"
echo " converte pagine singole con la maschera predefinita $DEFMASK (o REGEXP se fornita)"
echo " nella directory corrente in documenti djvu in bianco e nero a pagina singola"
# decommenta la seguente riga per compilare un documento DjVu raggruppato
# echo " e li raggruppa come un file djvu $OUTFILE"
echo
}
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Errore: la directory corrente deve contenere file con la maschera $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# in netpbm >= 10.23 la riga sopra può essere sostituita con la seguente:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done
# decommenta la seguente riga per compilare un documento DjVu raggruppato
#djvm -c $OUTFILE $MASK.djvu
Se esegui lo script come
$ ~/bin/any2djvu-bwprenderà l’azione predefinita e cercherà di convertire tutte le immagini *.jpg nella directory corrente in file DjVu a pagina singola con l’estensione .jpg.djvu. Puoi cambiare questo comportamento definendo una maschera di file (il parametro opzionale). Il valore di dithering 0.499 è stato ottenuto sperimentalmente e rappresenta un’impostazione molto buona (se non la migliore) per le immagini bitonali. Puoi anche decommentare le righe indicate in any2djvu-bw per compilare il documento DjVu finale in bianco e nero in un’unica esecuzione dello script. Se lo fai e se non hai bisogno di pagine a colori, puoi saltare la lettura della prossima sottosezione che parla della conversione di immagini a colori.
2.3 JPEG a DjVu a bassa colorazione
Successivamente, dobbiamo convertire le immagini a colori prese dalle copertine anteriore e posteriore del libro. Supponiamo che la copertina anteriore sia memorizzata in 000.jpg e la copertina posteriore sia memorizzata in 999.jpg, e ciascuna di esse contenga non più di, diciamo, 8 tonalità. L’esecuzione precedente di any2djvu-bw ha lasciato due file DjVu indesiderati dopo di essa, vale a dire le versioni in bianco e nero 000.jpg.djvu e 999.jpg.djvu. Elimina questi due file. Poi converti sia 000.jpg che 999.jpg in pagine DjVu a colori eseguendo il seguente comando (nota, le virgolette sono necessarie):
$ ~/bin/any2djvu-low "+(000|999).jpg" 8dove any2djvu-low è lo script fornito qui sotto che deve essere scritto in ~/bin/ per eseguire il comando.
#!/bin/bash
#
# any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
usage
echo "Errore: cpaldjvu è necessario"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# decommenta la seguente riga per compilare un documento DjVu raggruppato
#OUTFILE="#0-low.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\" [INT]]"
echo " converte pagine singole con la maschera predefinita $DEFMASK (o REGEXP se fornita)"
echo " nella directory corrente in documenti djvu a bassa colorazione a pagina singola con il"
echo " numero di colori $DEFNCOLORS (predefinito) o INT (se fornito)"
# decommenta la seguente riga per compilare un documento DjVu raggruppato
# echo " e li raggruppa come un file djvu $OUTFILE"
echo
}
if [ -n "$1" ]; then
MASK=$1
if [ -n "$2" ]; then
NCOLORS=$2
else
NCOLORS=$DEFNCOLORS
fi
else
MASK=$DEFMASK
NCOLORS=$DEFNCOLORS
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Errore: la directory corrente deve contenere file con la maschera $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
fi
done
# decommenta la seguente riga per compilare un documento DjVu raggruppato
#djvm -c $OUTFILE $MASK.djvu
Le pagine DjVu a colori sono state prodotte da un codificatore a bassa colorazione cpaldjvu piuttosto che da un codificatore bitonale cjb2. Occasionalmente cpaldjvu con l’impostazione a 2 colori può produrre file di output leggermente più piccoli rispetto a quelli di cjb2. Questo può accadere poiché il colore nero appare più chiaro nel caso di cpaldjvu. Pertanto, l’uso di cjb2 è preferibile per le immagini bitonali che di solito sembrano più belle quanto più scuro è il colore nero. Inoltre, la conversione di un’immagine JPEG in un DjVu bitonale utilizzando cpaldjvu richiede circa 1,5 volte più tempo rispetto alla stessa operazione utilizzando cjb2.
Potresti anche aspettarti che cpaldjvu (con il numero predefinito di colori 256) produca un output quasi della stessa dimensione del file JPEG iniziale (anche 16M colori). Ridurre il numero di colori utilizzando l’opzione -colors n di cpaldjvu in molti casi risolve il problema in modo esponenziale lento, ad esempio, ridurre n da 256 a 16 può dare un output solo 4 volte più piccolo.
2.4 Unire DjVu
L’ultimo passo è unire tutte le pagine DjVu separate in un documento DjVu multipagina. Il seguente script binddjvu fa il lavoro.
#!/bin/bash
#
# binddjvu
#
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.jpg.djvu"
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
djvm -c $OUTFILE $MASK
Il file DjVu multipagina #0.djvu può essere dato un nome migliore e significativo:
$ mv #0.djvu illibro.djvuE abbiamo finito con il nostro esempio.
2.5 PDF a DjVu
Il formato PDF è anche utilizzato per digitalizzare documenti, ad esempio da jstor.org, e attualmente è ancora più diffuso di DjVu solo per il motivo che molte persone hanno programmi per leggere PDF e non hanno nulla per leggere DjVu. Ci sono diversi motivi per sostituire PDF con DjVu, inclusi i seguenti:
- Sui documenti scansionati, le prestazioni di DjVu sono decisamente migliori rispetto a quelle di PDF. Questo è il motivo per cui ha senso convertire un documento PDF scansionato nel formato DjVu.
- C’è un altro tipo di situazione in cui abbiamo molti documenti PDF (a pagina singola) che vogliamo unire. Ad esempio, prendi le pagine di un documento PDF scaricato da una biblioteca internet.
- Unire PDF, a pagina singola o multipagina, in un unico DjVu.
- Inoltre, su alcuni scanner è possibile scansionare direttamente in file PDF a pagina singola. Ancora una volta, è conveniente unire PDF in un DjVu multipagina.
Il seguente script pdfs2djvu è sufficiente per ciascuna delle azioni sopra. Per impostazione predefinita, pdfs2djvu prende tutti i file *.pdf nella directory corrente in ordine alfabetico e produce un unico file DjVu multipagina bitonale #0.djvu.
#!/bin/bash
#
# pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Errore: pdftoppm, cjb2 e djvm sono necessari"
echo
exit 1
fi
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.pdf"
DPI=600
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for PDF in $MASK; do
if [ ! -e $PDF ]; then
echo
echo "Errore: la directory corrente deve contenere file con la maschera $MASK"
echo
exit 1
fi
echo $PDF
pdftoppm -mono -r 600 -aa yes $PDF $PDF
for PBM in $PDF*.pbm; do
echo $PBM
cjb2 -dpi $DPI $PBM $PBM.djvu
rm -f $PBM
done
done
djvm -c $OUTFILE $MASK*.pbm.djvu
Dopo l’esecuzione, lo script pdfs2djvu lascia le pagine codificate in DjVu come file *.pbm.djvu nella directory corrente.
3 Osservazioni conclusive
Questo HOWTO è stato scritto non da uno sviluppatore di DjVu ma da un suo utente. Pertanto, il HOWTO potrebbe mancare di alcuni dettagli tecnici. Se desideri ottenere ulteriori informazioni tecniche sui comandi, consulta le manpages o qualsiasi altra documentazione pertinente. Suggerirei un comando molto istruttivo
$ man djvua chiunque inizi a utilizzare djvulibre su linux.
Autore: Vladimir Komendantsky
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.