Documentación técnica · 10 min read · Feb 07, 2026
Creando Documentos DjVu Linux HOWTO
versión 0.2 (12 de julio de 2006)
1 Sinopsis
Este documento explica algunos de los usos de la implementación djvulibre de DjVu para crear documentos DjVu de calidad en linux. El formato DjVu presenta compresión de documentos en mapa de bits y estructura de hipertexto. Es utilizado por numerosos sitios web en todo el mundo para almacenar y distribuir documentos digitales, incluidos documentos escaneados y fotos de alta resolución. Una de las ventajas de los archivos DjVu es que son notablemente pequeños, a menudo más pequeños que los archivos PDF o JPEG con el mismo contenido. Esto hace que DjVu sea una herramienta útil para digitalizar libros y revistas, especialmente científicas.
A continuación, se considera el caso en el que se crea un documento DjVu a partir de varios archivos JPEG separados, cada uno conteniendo una sola página. Aquí, el formato JPEG no es una limitación, y los ejemplos pueden cubrir formatos de imagen arbitrarios. También se discute la conversión de PDF a DjVu. No se explica el uso de software de escáner: consulte la documentación relevante.
Requisitos. Se requieren los paquetes djvulibre, jpeg y netpbm. Se recomiendan encarecidamente los paquetes sane y xpdf.
2 Creando DjVu
2.1 Escaneando un libro
Supongamos la siguiente situación para esta sección. Tenemos un libro que necesita ser escaneado y almacenado en un formato digital. Para simplificar, supongamos que todo el contenido del libro es en blanco y negro (texto, fórmulas, diagramas, etc.) excepto por la portada del libro, que está impresa en color. Lo que normalmente podemos hacer es escanearlo página por página y almacenar las páginas por separado en algún formato de imagen, como JPEG o PDF. Personalmente, creo que JPEG es la mejor opción. Pero si encuentras, por ejemplo, que TIFF comprimido es más adecuado para tus propósitos, este HOWTO podría ser de alguna ayuda para ti también. Sin embargo, en este caso, los scripts de ejemplo deberían ser ligeramente modificados. Por el momento, mantengámonos con JPEG.
En nuestra situación con el libro, escaneamos la portada del libro (y la contraportada también, si contiene algún texto o imágenes notables) a archivos JPEG en color. Luego escaneamos el resto a JPEGs en blanco y negro. Esto debería dar el rendimiento óptimo. Al guardar las imágenes escaneadas, presta atención a los nombres de los archivos. Para los propósitos de conversión a DjVu, todas las imágenes deben estar organizadas alfabéticamente respetando el orden de las páginas. Por ejemplo,
000.jpg, 001.jpg, 002.jpg, …, 012.jpg
es una numeración correcta; y
0.jpg, 1.jpg, 2.jpg, …, 12.jpg
es incorrecta porque 12.jpg aparecerá antes que 2.jpg. Una vez que se escanea todo el libro, coloca todos los archivos de imagen en un directorio separado.
Dependiendo del dispositivo de escáner, el software y el método de escaneo, es posible que necesites rotar todas o solo algunas de las imágenes JPEG, generalmente siguiendo un patrón simple. El script jpegsrotate a continuación puede ser bastante útil en tal caso. Por ejemplo, ejecútalo con el parámetro –even para girar las páginas pares al revés en el directorio actual. El programa jpegtran utilizado en el script puede rotar JPEGs solo en 90, 180 o 270 grados en el sentido de las agujas del reloj.
#!/bin/bash
#
# jpegsrotate
#
if [ -z `which jpegtran` ]; then
usage
echo "Error: jpegtran es necesario"
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 " rota archivos con la máscara $DEFMASK en $DEFDEG grados en el sentido de las agujas del reloj"
echo "$0 --even"
echo " rota archivos pares con la máscara $DEFEVENMASK en 180 grados"
echo "$0 --odd"
echo " rota archivos impares con la máscara $DEFODDMASK en 180 grados"
echo "$0 --params \"REGEXP\" (90|180|270)"
echo " rota archivos con la máscara REGEXP en el aspecto dado en el sentido de las agujas del reloj"
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 "Error: el directorio actual debe contener archivos con la máscara $MASK"
echo
exit 1
fi
echo "$i"
jpegtran -rotate $DEG $i > $i.rotated
mv $i.rotated $i
done
2.2 JPEG a DjVu bitonal
Cuando las imágenes están listas, cada una de ellas necesita ser convertida a una página separada en formato DjVu por un codificador DjVu, como cjb2 o cpaldjvu, y luego las páginas separadas deben ser agrupadas en un solo documento DjVu por djvm. Escribe el siguiente script llamado any2djvu-bw en algún lugar, por ejemplo, en ~/bin/. Ejecuta el script en el directorio que contiene las imágenes fuente para convertir páginas separadas en blanco y negro.
#!/bin/bash
#
# any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Error: anytopnm, ppmtopgm, pgmtopbm y cjb2 son necesarios"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# descomentar la siguiente línea para compilar un documento DjVu agrupado
#OUTFILE="#0-bw.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\"]"
echo " convierte páginas individuales con la máscara predeterminada $DEFMASK (o REGEXP si se proporciona)"
echo " en documentos djvu en blanco y negro de una sola página"
# descomentar la siguiente línea para compilar un documento DjVu agrupado
# echo " y los agrupa como un archivo djvu $OUTFILE"
echo
}
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Error: el directorio actual debe contener archivos con la máscara $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# en netpbm >= 10.23 la línea anterior puede ser reemplazada por la siguiente:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done
# descomentar la siguiente línea para compilar un documento DjVu agrupado
#djvm -c $OUTFILE $MASK.djvu
Si ejecutas el script como
$ ~/bin/any2djvu-bwtomará la acción predeterminada e intentará convertir todas las imágenes *.jpg en el directorio actual a archivos DjVu de una sola página con la extensión .jpg.djvu. Puedes cambiar este comportamiento definiendo una máscara de archivo (el parámetro opcional). El valor de dithering 0.499 se obtuvo experimentalmente y representa una configuración muy buena (si no la mejor) para imágenes bitonales. También puedes descomentar las líneas indicadas en any2djvu-bw para compilar el documento DjVu final en blanco y negro en una sola ejecución del script. Si lo hiciste y si no necesitas páginas en color, puedes omitir la lectura de la siguiente subsección que habla sobre la conversión de imágenes en color.
2.3 JPEG a DjVu de bajo color
A continuación, necesitamos convertir imágenes en color tomadas de las portadas del libro. Supongamos que la portada delantera se almacena en 000.jpg, y la contraportada se almacena en 999.jpg, y cada una de ellas contiene no más de, digamos, 8 tonos. La ejecución anterior de any2djvu-bw dejó dos archivos DjVu no deseados después de ella, a saber, las versiones en blanco y negro 000.jpg.djvu y 999.jpg.djvu. Elimina estos dos archivos. Luego convierte tanto 000.jpg como 999.jpg a páginas DjVu en color ejecutando el siguiente comando (nota, las comillas son necesarias):
$ ~/bin/any2djvu-low "+(000|999).jpg" 8donde any2djvu-low es el script que se da a continuación que debe ser escrito en ~/bin/ para ejecutar el comando.
#!/bin/bash
#
# any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
usage
echo "Error: cpaldjvu es necesario"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# descomentar la siguiente línea para compilar un documento DjVu agrupado
#OUTFILE="#0-low.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\" [INT]]"
echo " convierte páginas individuales con la máscara predeterminada $DEFMASK (o REGEXP si se proporciona)"
echo " en documentos djvu de bajo color de una sola página con el"
echo " número de colores $DEFNCOLORS (predeterminado) o INT (si se proporciona)"
# descomentar la siguiente línea para compilar un documento DjVu agrupado
# echo " y los agrupa como un archivo 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 "Error: el directorio actual debe contener archivos con la máscara $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
fi
done
# descomentar la siguiente línea para compilar un documento DjVu agrupado
#djvm -c $OUTFILE $MASK.djvu
Las páginas DjVu en color fueron producidas por un codificador de bajo color cpaldjvu en lugar de un codificador bitonal cjb2. Ocasionalmente, cpaldjvu con la configuración de 2 colores puede producir archivos de salida ligeramente más pequeños en comparación con los de cjb2. Esto puede suceder ya que el color negro parece ser más claro en el caso de cpaldjvu. Por lo tanto, el uso de cjb2 es preferible para imágenes bitonales que generalmente se ven mejor cuanto más brillante es el color negro. Además, la conversión de una imagen JPEG a un DjVu bitonal utilizando cpaldjvu toma aproximadamente 1.5 veces más tiempo que hacer lo mismo usando cjb2.
También podrías esperar que cpaldjvu (con el número predeterminado de colores 256) produjera una salida casi del mismo tamaño que el archivo JPEG inicial (incluso de 16M colores). Reducir el número de colores utilizando la opción -colors n de cpaldjvu en muchos casos resuelve el problema exponencialmente lento, por ejemplo, reducir n de 256 a 16 puede dar una salida solo 4 veces más pequeña.
2.4 Uniendo DjVu
El paso final es unir todas las páginas DjVu separadas en un documento DjVu multipágina. El siguiente script binddjvu hace esto.
#!/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
El archivo DjVu multipágina #0.djvu puede recibir un nombre mejor y más significativo:
$ mv #0.djvu ellibro.djvuY hemos terminado con nuestro ejemplo.
2.5 PDF a DjVu
El formato PDF también se utiliza para digitalizar documentos, por ejemplo, por jstor.org, y en la actualidad sigue siendo más ampliamente utilizado que DjVu solo por la razón de que muchas personas tienen programas para leer PDF y no tienen nada para leer DjVu. Hay varias razones para reemplazar PDF con DjVu, incluyendo las siguientes:
- En documentos escaneados, el rendimiento de DjVu es estrictamente mejor que el de PDF. Por eso tiene sentido convertir un documento PDF escaneado a formato DjVu.
- Hay otro tipo de situación cuando tenemos muchos documentos PDF (de una sola página) que queremos unir. Por ejemplo, tomar páginas de un documento PDF descargado de una biblioteca en internet.
- Fusionar PDFs, de una sola página o multipágina, en un solo DjVu.
- También en algunos escáneres es posible escanear directamente a archivos PDF de una sola página. Entonces, nuevamente es conveniente unir PDFs en un DjVu multipágina.
El siguiente script pdfs2djvu es suficiente para cada una de las acciones anteriores. Por defecto, pdfs2djvu toma todos los archivos *.pdf en el directorio actual en orden alfabético y produce un solo archivo DjVu multipágina bitonal #0.djvu.
#!/bin/bash
#
# pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Error: pdftoppm, cjb2 y djvm son necesarios"
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 "Error: el directorio actual debe contener archivos con la máscara $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
Después de ejecutar el script pdfs2djvu, deja páginas codificadas en DjVu como archivos *.pbm.djvu en el directorio actual.
3 Observaciones finales
Este HOWTO no fue escrito por un desarrollador de DjVu, sino por su usuario. Por lo tanto, el HOWTO puede carecer de algunos detalles técnicos. Si deseas obtener más información técnica sobre los comandos, consulta las páginas del manual o cualquier otra documentación relevante. Sugeriría un muy instructivo
$ man djvupara cualquiera que comience a usar djvulibre en linux.
Autor: Vladimir Komendantsky
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.