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

prenderà 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" 8

dove 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.djvu

E 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:

  1. 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.
  2. 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.
  3. Unire PDF, a pagina singola o multipagina, in un unico DjVu.
  4. 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 djvu

a chiunque inizi a utilizzare djvulibre su linux.


Autore: Vladimir Komendantsky

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.