DjVu Dokumente · 9 min read · Feb 07, 2026

Erstellen von DjVu-Dokumenten Linux HOWTO

Version 0.2 (12. Juli 2006)

1  Zusammenfassung

Dieses Dokument erklärt einige der Anwendungen der djvulibre-Implementierung von DjVu zur Erstellung qualitativ hochwertiger DjVu-Dokumente unter Linux. Das DjVu-Format bietet eine Bitmap-Dokumentenkompression und eine Hypertextstruktur. Es wird von zahlreichen Websites auf der ganzen Welt verwendet, um digitale Dokumente, einschließlich gescannter Dokumente und hochauflösender Bilder, zu speichern und zu verteilen. Einer der Vorteile von DjVu-Dateien ist, dass sie bemerkenswert klein sind, oft kleiner als PDF- oder JPEG-Dateien mit demselben Inhalt. Dies macht DjVu zu einem hilfreichen Werkzeug zur Digitalisierung von Büchern und Zeitschriften, insbesondere wissenschaftlichen.

Im Folgenden wird der Fall betrachtet, wenn ein DjVu-Dokument aus einer Anzahl separater JPEG-Dateien erstellt wird, die jeweils eine einzelne Seite enthalten. Hier ist das JPEG-Format keine Einschränkung, und die Beispiele können beliebige Bildformate abdecken. Auch die Konvertierung von PDF zu DjVu wird behandelt. Die Verwendung von Scanner-Software wird nicht erklärt: siehe die entsprechende Dokumentation.

Anforderungen. Die Pakete djvulibre, jpeg und netpbm sind erforderlich. Die Pakete sane und xpdf werden dringend empfohlen.

2  Erstellen von DjVu

2.1  Scannen eines Buches

Angenommen, die folgende Situation für diesen Abschnitt. Wir haben ein Buch, das gescannt und in einem digitalen Format gespeichert werden muss. Zur Vereinfachung nehmen wir an, dass der gesamte Inhalt des Buches schwarz-weiß (Text, Formeln, Diagramme usw.) ist, mit Ausnahme des Buchcovers, das in Farbe gedruckt ist. Was wir normalerweise tun können, ist, es Seite für Seite zu scannen und die Seiten separat in einem Bildformat wie JPEG oder PDF zu speichern. Persönlich glaube ich, dass JPEG die beste Wahl ist. Aber wenn Sie beispielsweise komprimierte TIFF-Dateien für Ihre Zwecke geeigneter finden, könnte dieses HOWTO auch für Sie hilfreich sein. In diesem Fall sollten die Beispielskripte jedoch leicht angepasst werden. Für den Moment bleiben wir bei JPEG.

In unserer Situation mit dem Buch scannen wir das Buchcover (und das Rückcover, wenn es auffälligen Text oder Bilder enthält) in Farb-JPEG-Dateien. Dann scannen wir den Rest in schwarz-weiß JPEGs. Dies sollte die optimale Leistung bieten. Achten Sie beim Speichern der gescannten Bilder auf die Dateinamen. Für die Zwecke der Konvertierung zu DjVu müssen alle Bilder alphabetisch in der Reihenfolge der Seiten angeordnet sein. Zum Beispiel,

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

ist eine richtige Nummerierung; und

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

ist eine falsche, da 12.jpg vor 2.jpg erscheinen wird. Sobald das gesamte Buch gescannt ist, legen Sie alle Bilddateien in ein separates Verzeichnis.

Je nach Scannergerät, Software und Methode des Scannens müssen Sie möglicherweise alle oder nur einige der JPEG-Bilder drehen, normalerweise nach einem einfachen Muster. Das Skript jpegsrotate unten kann in einem solchen Fall sehr nützlich sein. Führen Sie es beispielsweise mit dem Parameter –even aus, um gerade Seiten im aktuellen Verzeichnis auf den Kopf zu stellen. Das im Skript verwendete Programm jpegtran kann JPEGs nur um 90, 180 oder 270 Grad im Uhrzeigersinn drehen.

#!/bin/bash
#
# jpegsrotate
#

if [ -z `which jpegtran` ]; then
  usage
  echo "Fehler: jpegtran wird benötigt"
  echo
  exit 1
fi

shopt -s extglob

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

function usage() {
  echo
  echo "Verwendung:"
  echo "$0"
  echo "    dreht Dateien mit der Maske $DEFMASK um $DEFDEG Grad im Uhrzeigersinn"
  echo "$0 --even"
  echo "    dreht gerade Dateien mit der Maske $DEFEVENMASK um 180 Grad"
  echo "$0 --odd"
  echo "    dreht ungerade Dateien mit der Maske $DEFODDMASK um 180 Grad"
  echo "$0 --params \"REGEXP\" (90|180|270)"
  echo "    dreht Dateien mit der Maske REGEXP um das angegebene Verhältnis im Uhrzeigersinn"
  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 "Fehler: Das aktuelle Verzeichnis muss Dateien mit der Maske $MASK enthalten"
    echo
    exit 1
  fi
  echo "$i"
  jpegtran -rotate $DEG $i > $i.rotated
  mv $i.rotated $i
done

2.2  JPEG zu bitonalem DjVu

Wenn die Bilder bereit sind, muss jedes von ihnen in eine separate Seite im DjVu-Format von einem DjVu-Encoder wie cjb2 oder cpaldjvu konvertiert werden, und dann müssen die separaten Seiten in einem einzigen DjVu-Dokument von djvm gebündelt werden. Schreiben Sie das folgende Skript namens any2djvu-bw irgendwo, z.B. in ~/bin/. Führen Sie das Skript im Verzeichnis aus, das die Quellbilder enthält, um separate schwarz-weiße Seiten zu konvertieren.

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

if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
    -o -z `which cjb2` ]; then
  usage
  echo "Fehler: anytopnm, ppmtopgm, pgmtopbm und cjb2 werden benötigt"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
#OUTFILE="#0-bw.djvu"

function usage() {
  echo
  echo "Verwendung:"
  echo
  echo "$0 [\"REGEXP\"]"
  echo "    konvertiert einzelne Seiten mit der Standardmaske $DEFMASK (oder REGEXP, wenn angegeben)"
  echo "    im aktuellen Verzeichnis in einzelne schwarz-weiße DjVu-Dokumente"
# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
# echo "    und bündelt sie als DjVu-Datei $OUTFILE"
  echo
}

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

for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "Fehler: Das aktuelle Verzeichnis muss Dateien mit der Maske $MASK enthalten"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# In netpbm >= 10.23 kann die obige Zeile durch die folgende ersetzt werden:
#   anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
    cjb2 -dpi $DPI $i.pbm $i.djvu
    rm -f $i.pbm
  fi
done

# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
#djvm -c $OUTFILE $MASK.djvu

Wenn Sie das Skript ausführen als

$ ~/bin/any2djvu-bw

wird die Standardaktion ausgeführt und versucht, alle Bilder *.jpg im aktuellen Verzeichnis in Einzelblatt-DjVu-Dateien mit der Erweiterung .jpg.djvu zu konvertieren. Sie können dieses Verhalten ändern, indem Sie eine Dateimaske definieren (den optionalen Parameter). Der Dithering-Wert 0.499 wurde experimentell ermittelt und stellt eine sehr gute (wenn nicht die beste) Einstellung für bitonale Bilder dar. Sie können auch die angegebenen Zeilen in any2djvu-bw auskommentieren, um das endgültige gebündelte schwarz-weiße DjVu-Dokument in einem einzigen Durchlauf des Skripts zu erstellen. Wenn Sie dies getan haben und keine Farbseiten benötigen, können Sie das Lesen des nächsten Unterabschnitts zur Konvertierung von Farbbildern überspringen.

2.3  JPEG zu niedrigfarbigem DjVu

Als nächstes müssen wir die Farbbilder von den Vorder- und Rückcovern des Buches konvertieren. Angenommen, das Vordercover ist in 000.jpg gespeichert, und das Rückcover ist in 999.jpg gespeichert, und jedes von ihnen enthält nicht mehr als, sagen wir, 8 Töne. Der vorherige Durchlauf von any2djvu-bw hinterließ zwei unerwünschte DjVu-Dateien, nämlich die schwarz-weißen Versionen 000.jpg.djvu und 999.jpg.djvu. Löschen Sie diese beiden Dateien. Konvertieren Sie dann sowohl 000.jpg als auch 999.jpg in FarbdjVu-Seiten, indem Sie den folgenden Befehl ausführen (beachten Sie, dass die Anführungszeichen notwendig sind):

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

wobei any2djvu-low das unten angegebene Skript ist, das in ~/bin/ geschrieben werden muss, um den Befehl auszuführen.

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

if [ -z `which cpaldjvu` ]; then
  usage
  echo "Fehler: cpaldjvu wird benötigt"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
#OUTFILE="#0-low.djvu"

function usage() {
  echo
  echo "Verwendung:"
  echo
  echo "$0 [\"REGEXP\" [INT]]"
  echo "    konvertiert einzelne Seiten mit der Standardmaske $DEFMASK (oder REGEXP, wenn angegeben)"
  echo "    im aktuellen Verzeichnis in einzelne niedrigfarbige DjVu-Dokumente mit der"
  echo "    Anzahl der Farben $DEFNCOLORS (Standard) oder INT (wenn angegeben)"
# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
# echo "    und bündelt sie als DjVu-Datei $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 "Fehler: Das aktuelle Verzeichnis muss Dateien mit der Maske $MASK enthalten"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
  fi
done

# Kommentieren Sie die folgende Zeile aus, um ein gebündeltes DjVu-Dokument zu erstellen
#djvm -c $OUTFILE $MASK.djvu

Farb-DjVu-Seiten wurden von einem niedrigfarbigen Encoder cpaldjvu und nicht von einem bitonalen Encoder cjb2 erzeugt. Gelegentlich kann cpaldjvu mit der 2-Farben-Einstellung geringfügig kleinere Ausgabedateien im Vergleich zu cjb2 erzeugen. Dies kann passieren, da die schwarze Farbe im Fall von cpaldjvu heller erscheint. Daher ist die Verwendung von cjb2 für bitonale Bilder vorzuziehen, die normalerweise schöner aussehen, je heller die schwarze Farbe ist. Darüber hinaus dauert die Konvertierung eines JPEG-Bildes in ein bitonales DjVu mit cpaldjvu ungefähr 1,5-mal länger als dasselbe mit cjb2.

Sie könnten auch erwarten, dass cpaldjvu (mit der Standardanzahl von 256 Farben) eine Ausgabe produziert, die in der Größe fast identisch mit der ursprünglichen (sogar 16M-Farben) JPEG-Datei ist. Die Reduzierung der Anzahl der Farben mit der Option -colors n von cpaldjvu löst in vielen Fällen das Problem exponentiell langsam, zum Beispiel kann die Reduzierung von n von 256 auf 16 eine Ausgabe von nur 4-mal kleiner ergeben.

2.4  Binden von DjVu

Der letzte Schritt besteht darin, alle separaten DjVu-Seiten in ein mehrseitiges DjVu-Dokument zu binden. Das folgende Skript binddjvu erledigt dies.

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

Die mehrseitige DjVu-Datei #0.djvu kann einen besseren, aussagekräftigeren Namen erhalten:

$ mv #0.djvu dasbuch.djvu

Und wir sind mit unserem Beispiel fertig.

2.5  PDF zu DjVu

Das PDF-Format wird ebenfalls zur Digitalisierung von Dokumenten verwendet, z.B. von jstor.org, und ist derzeit immer noch besser verbreitet als DjVu, nur aus dem Grund, dass viele Menschen Programme zum Lesen von PDF haben und nichts zum Lesen von DjVu. Es gibt mehrere Gründe, PDF durch DjVu zu ersetzen, einschließlich der folgenden:

  1. Bei gescannten Dokumenten ist die Leistung von DjVu eindeutig besser als die von PDF. Deshalb macht es Sinn, ein gescanntes PDF-Dokument in das DjVu-Format zu konvertieren.
  2. Es gibt eine andere Art von Situation, wenn wir viele (einzelne) PDF-Dokumente haben, die wir zusammenbinden möchten. Zum Beispiel, nehmen Sie Seiten eines PDF-Dokuments, das aus einer Internetbibliothek heruntergeladen wurde.
  3. Zusammenführen von PDFs, einseitig oder mehrseitig, in ein einziges DjVu.
  4. Auch auf einigen Scannern ist es möglich, direkt in einseitige PDF-Dateien zu scannen. Dann ist es wieder praktisch, PDFs in ein mehrseitiges DjVu zu binden.

Das folgende Skript pdfs2djvu reicht für jede der oben genannten Aktionen aus. Standardmäßig nimmt pdfs2djvu alle *.pdf-Dateien im aktuellen Verzeichnis in alphabetischer Reihenfolge und erzeugt eine einzige mehrseitige bitonale DjVu-Datei #0.djvu.

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
  echo
  echo "Fehler: pdftoppm, cjb2 und djvm werden benötigt"
  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 "Fehler: Das aktuelle Verzeichnis muss Dateien mit der Maske $MASK enthalten"
    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

Nach dem Ausführen hinterlässt das Skript pdfs2djvu DjVu-kodierte Seiten als Dateien *.pbm.djvu im aktuellen Verzeichnis.

3  Abschließende Bemerkungen

Dieses HOWTO wurde nicht von einem Entwickler von DjVu, sondern von einem Benutzer geschrieben. Daher fehlen dem HOWTO möglicherweise einige technische Details. Wenn Sie weitere technische Informationen zu den Befehlen wünschen, siehe manpages oder andere relevante Dokumentationen. Ich würde jedem, der beginnt, djvulibre unter Linux zu verwenden, einen sehr lehrreichen

$ man djvu

vorschlagen.


Autor: Vladimir Komendantsky

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.