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

tomará 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" 8

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

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

  1. 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.
  2. 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.
  3. Fusionar PDFs, de una sola página o multipágina, en un solo DjVu.
  4. 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 djvu

para cualquiera que comience a usar djvulibre en linux.


Autor: Vladimir Komendantsky

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.