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-bwwird 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" 8wobei 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.djvuUnd 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:
- 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.
- 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.
- Zusammenführen von PDFs, einseitig oder mehrseitig, in ein einziges DjVu.
- 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 djvuvorschlagen.
Autor: Vladimir Komendantsky
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.