Documentation · 11 min read · Feb 07, 2026

Création de documents DjVu Linux HOWTO

version 0.2 (12 juillet 2006)

1 Synopsis

Ce document explique certains des usages de l’implémentation djvulibre de DjVu pour créer des documents DjVu de qualité sous linux. Le format DjVu présente des fonctionnalités de compression de documents bitmap et de structure hypertexte. Il est utilisé par de nombreux sites web à travers le monde pour stocker et distribuer des documents numériques, y compris des documents scannés et des images haute résolution. Un des avantages des fichiers DjVu est qu’ils sont remarquablement petits, souvent plus petits que les fichiers PDF ou JPEG contenant le même contenu. Cela fait de DjVu un outil utile pour la numérisation de livres et de revues, en particulier scientifiques.

Ci-dessous, il est considéré le cas où un document DjVu est créé à partir d’un certain nombre de fichiers JPEG séparés, chacun contenant une seule page. Ici, le format JPEG n’est pas une limitation, et les exemples peuvent couvrir des formats d’image arbitraires. La conversion de PDF à DjVu est également discutée. L’utilisation de logiciels de scanner n’est pas expliquée : référez-vous à la documentation pertinente.

Exigences. Les paquets djvulibre, jpeg et netpbm sont requis. Les paquets sane et xpdf sont fortement recommandés.

2 Création de DjVu

2.1 Numérisation d’un livre

Supposons la situation suivante pour cette section. Nous avons un livre qui doit être numérisé et stocké dans un format numérique. Pour simplifier, supposons que tout le contenu du livre est en noir et blanc (texte, formules, diagrammes, etc.) sauf pour la couverture du livre qui est imprimée en couleur. Ce que nous pouvons normalement faire est de le numériser page par page et de stocker les pages séparément dans un certain format d’image, comme JPEG ou PDF. Personnellement, je crois que JPEG est le meilleur choix. Mais si vous trouvez, par exemple, que le TIFF compressé est plus adapté à vos besoins, ce HOWTO pourrait également vous être utile. Cependant, dans ce cas, les scripts d’exemple devraient être légèrement modifiés. Pour l’instant, restons avec JPEG.

Dans notre situation avec le livre, nous numérisons la couverture avant du livre (et la couverture arrière aussi, si elle contient du texte ou des images notables) en fichiers JPEG couleur. Ensuite, nous numérisons le reste en JPEG noir et blanc. Cela devrait donner des performances optimales. Lors de l’enregistrement des images numérisées, faites attention aux noms de fichiers. Pour les besoins de la conversion en DjVu, toutes les images doivent être arrangées par ordre alphabétique en respectant l’ordre des pages. Par exemple,

000.jpg, 001.jpg, 002.jpg, …, 012.jpg

est une bonne numérotation ; et

0.jpg, 1.jpg, 2.jpg, …, 12.jpg

est une mauvaise numérotation car 12.jpg apparaîtra avant 2.jpg. Une fois que tout le livre est numérisé, placez tous les fichiers image dans un répertoire séparé.

Selon le dispositif de numérisation, le logiciel et la méthode de numérisation, vous devrez peut-être faire pivoter toutes ou juste certaines des images JPEG, généralement en suivant un schéma simple. Le script jpegsrotate ci-dessous peut être très utile dans ce cas. Par exemple, exécutez-le avec le paramètre –even pour retourner les pages paires à l’envers dans le répertoire actuel. Le programme jpegtran utilisé dans le script peut faire pivoter les JPEG uniquement de 90, 180 ou 270 degrés dans le sens des aiguilles d’une montre.

#!/bin/bash
#
# jpegsrotate
#

if [ -z `which jpegtran` ]; then
  usage
  echo "Erreur : jpegtran est nécessaire"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270

function usage() {
  echo
  echo "usage:"
  echo "$0"
  echo "    fait pivoter les fichiers avec le masque $DEFMASK de $DEFDEG degrés dans le sens des aiguilles d'une montre"
  echo "$0 --even"
  echo "    fait pivoter les fichiers pairs avec le masque $DEFEVENMASK de 180 degrés"
  echo "$0 --odd"
  echo "    fait pivoter les fichiers impairs avec le masque $DEFODDMASK de 180 degrés"
  echo "$0 --params \"REGEXP\" (90|180|270)"
  echo "    fait pivoter les fichiers avec le masque REGEXP selon le rapport d'aspect donné dans le sens des aiguilles d'une montre"
  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 "Erreur : le répertoire actuel doit contenir des fichiers avec le masque $MASK"
    echo
    exit 1
  fi
  echo "$i"
  jpegtran -rotate $DEG $i > $i.rotated
  mv $i.rotated $i
done

2.2 JPEG à DjVu bitonal

Lorsque les images sont prêtes, chacune d’elles doit être convertie en une page séparée au format DjVu par un encodeur DjVu, comme cjb2 ou cpaldjvu, puis les pages séparées doivent être regroupées dans un seul document DjVu par djvm. Écrivez le script suivant appelé any2djvu-bw quelque part, par exemple dans ~/bin/. Exécutez le script dans le répertoire contenant les images source pour convertir des pages séparées en noir et blanc.

#!/bin/bash
#
# any2djvu-bw
#

if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
    -o -z `which cjb2` ]; then
  usage
  echo "Erreur : anytopnm, ppmtopgm, pgmtopbm et cjb2 sont nécessaires"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
# décommentez la ligne suivante pour compiler un document DjVu regroupé
#OUTFILE="#0-bw.djvu"

function usage() {
  echo
  echo "usage:"
  echo
  echo "$0 [\"REGEXP\"]"
  echo "    convertit des pages uniques avec le masque par défaut $DEFMASK (ou REGEXP si fourni)"
  echo "    dans le répertoire actuel en documents djvu en noir et blanc à page unique"
# décommentez la ligne suivante pour compiler un document DjVu regroupé
# echo "    et les regroupe en tant que fichier djvu $OUTFILE"
  echo
}

if [ -n "$1" ]; then
  MASK=$1
else
  MASK=$DEFMASK
fi

for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "Erreur : le répertoire actuel doit contenir des fichiers avec le masque $MASK"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# dans netpbm >= 10.23, la ligne ci-dessus peut être remplacée par la suivante :
#   anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
    cjb2 -dpi $DPI $i.pbm $i.djvu
    rm -f $i.pbm
  fi
done

# décommentez la ligne suivante pour compiler un document DjVu regroupé
#djvm -c $OUTFILE $MASK.djvu

Si vous exécutez le script comme

$ ~/bin/any2djvu-bw

il prendra l’action par défaut et essaiera de convertir toutes les images *.jpg dans le répertoire actuel en fichiers DjVu à page unique avec l’extension .jpg.djvu. Vous pouvez changer ce comportement en définissant un masque de fichier (le paramètre optionnel). La valeur de dithering 0.499 a été obtenue expérimentalement et représente un réglage très bon (si ce n’est le meilleur) pour les images bitonales. Vous pouvez également décommenter les lignes indiquées dans any2djvu-bw pour compiler le document DjVu final en noir et blanc regroupé en une seule exécution du script. Si vous le faites et si vous n’avez pas besoin de pages en couleur, vous pouvez sauter la lecture de la sous-section suivante parlant de la conversion d’images en couleur.

2.3 JPEG à DjVu couleur faible

Ensuite, nous devons convertir les images couleur prises des couvertures avant et arrière du livre. Supposons que la couverture avant soit stockée dans 000.jpg, et la couverture arrière soit stockée dans 999.jpg, et chacune d’elles contient pas plus de, disons, 8 tons. L’exécution précédente de any2djvu-bw a laissé deux fichiers DjVu indésirables après cela, à savoir les versions en noir et blanc 000.jpg.djvu et 999.jpg.djvu. Supprimez ces deux fichiers. Ensuite, convertissez 000.jpg et 999.jpg en pages DjVu couleur en exécutant la commande suivante (notez que les guillemets sont nécessaires) :

$ ~/bin/any2djvu-low "+(000|999).jpg" 8

où any2djvu-low est le script donné ci-dessous qui doit être écrit dans ~/bin/ pour exécuter la commande.

#!/bin/bash
#
# any2djvu-low
#

if [ -z `which cpaldjvu` ]; then
  usage
  echo "Erreur : cpaldjvu est nécessaire"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# décommentez la ligne suivante pour compiler un document DjVu regroupé
#OUTFILE="#0-low.djvu"

function usage() {
  echo
  echo "usage:"
  echo
  echo "$0 [\"REGEXP\" [INT]]"
  echo "    convertit des pages uniques avec le masque par défaut $DEFMASK (ou REGEXP si fourni)"
  echo "    dans le répertoire actuel en documents djvu couleur faible à page unique avec le"
  echo "    nombre de couleurs $DEFNCOLORS (par défaut) ou INT (si fourni)"
# décommentez la ligne suivante pour compiler un document DjVu regroupé
# echo "    et les regroupe en tant que fichier 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 "Erreur : le répertoire actuel doit contenir des fichiers avec le masque $MASK"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
  fi
done

# décommentez la ligne suivante pour compiler un document DjVu regroupé
#djvm -c $OUTFILE $MASK.djvu

Les pages DjVu couleur ont été produites par un encodeur couleur faible cpaldjvu plutôt que par un encodeur bitonal cjb2. Occasionnellement, cpaldjvu avec le réglage de 2 couleurs peut produire des fichiers de sortie légèrement plus petits par rapport à ceux de cjb2. Cela peut se produire puisque la couleur noire semble plus claire dans le cas de cpaldjvu. Par conséquent, l’utilisation de cjb2 est préférable pour les images bitonales qui ont généralement l’air plus jolies lorsque la couleur noire est plus lumineuse. De plus, la conversion d’une image JPEG en DjVu bitonal à l’aide de cpaldjvu prend environ 1,5 fois plus de temps que la même chose en utilisant cjb2.

Vous pourriez également vous attendre à ce que cpaldjvu (avec le nombre de couleurs par défaut de 256) produise une sortie presque de la même taille que le fichier JPEG initial (même 16M couleur). Réduire le nombre de couleurs en utilisant l’option -colors n de cpaldjvu dans de nombreux cas résout le problème de manière exponentielle lente, par exemple, réduire n de 256 à 16 peut donner une sortie seulement 4 fois plus petite.

2.4 Liaison de DjVu

L’étape finale consiste à lier toutes les pages DjVu séparées en un document DjVu multi-pages. Le script suivant binddjvu fait cela.

#!/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

Le fichier DjVu multi-pages #0.djvu peut recevoir un nom meilleur et plus significatif :

$ mv #0.djvu lelivre.djvu

Et nous avons terminé avec notre exemple.

2.5 PDF à DjVu

Le format PDF est également utilisé pour numériser des documents, par exemple par jstor.org, et à présent est encore mieux répandu que DjVu seulement pour la raison que de nombreuses personnes ont des programmes pour lire PDF et n’ont rien pour lire DjVu. Il y a plusieurs raisons de remplacer PDF par DjVu, y compris les suivantes :

  1. Sur les documents scannés, la performance de DjVu est strictement meilleure que celle de PDF. C’est pourquoi il est logique de convertir un document PDF scanné au format DjVu.
  2. Il y a un autre type de situation où nous avons de nombreux documents PDF (à page unique) que nous voulons lier ensemble. Par exemple, prenez les pages d’un document PDF téléchargé depuis une bibliothèque internet.
  3. Fusionner des PDF, à page unique ou multi-pages, en un seul DjVu.
  4. Également sur certains scanners, il est possible de numériser directement en fichiers PDF à page unique. Encore une fois, il est pratique de lier des PDF en un DjVu multi-pages.

Le script suivant pdfs2djvu suffit pour chacune des actions ci-dessus. Par défaut, pdfs2djvu prend tous les fichiers *.pdf dans le répertoire actuel dans l’ordre alphabétique et produit un seul fichier DjVu multi-pages bitonal #0.djvu.

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
  echo
  echo "Erreur : pdftoppm, cjb2 et djvm sont nécessaires"
  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 "Erreur : le répertoire actuel doit contenir des fichiers avec le masque $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

Après une exécution, le script pdfs2djvu laisse des pages encodées en DjVu sous forme de fichiers *.pbm.djvu dans le répertoire actuel.

3 Remarques finales

Ce HOWTO a été écrit non pas par un développeur de DjVu mais par un utilisateur. Par conséquent, le HOWTO manque peut-être de certains détails techniques. Si vous souhaitez obtenir plus d’informations techniques sur les commandes, consultez les pages de manuel ou toute autre documentation pertinente. Je suggérerais un très instructif

$ man djvu

à quiconque commence à utiliser djvulibre sous linux.


Auteur : Vladimir Komendantsky

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.