DjVu создание · 9 min read · Feb 07, 2026
Создание документов DjVu Linux HOWTO
версия 0.2 (12 июля 2006)
1 Аннотация
Этот документ объясняет некоторые из способов использования реализации djvulibre формата DjVu для создания качественных документов DjVu в Linux. Формат DjVu имеет сжатие растровых документов и гипертекстовую структуру. Он используется многими веб-сайтами по всему миру для хранения и распространения цифровых документов, включая отсканированные документы и изображения высокого разрешения. Одним из преимуществ файлов DjVu является то, что они заметно малы, часто меньше, чем PDF или JPEG файлы с тем же содержимым. Это делает DjVu полезным инструментом для оцифровки книг и журналов, особенно научных.
Ниже рассматривается случай, когда документ DjVu создается из нескольких отдельных файлов JPEG, каждый из которых содержит одну страницу. Здесь формат JPEG не является ограничением, и примеры могут охватывать произвольные форматы изображений. Также обсуждается конвертация из PDF в DjVu. Использование программного обеспечения для сканирования не объясняется: обратитесь к соответствующей документации.
Требования. Необходимы пакеты djvulibre, jpeg и netpbm. Пакеты sane и xpdf настоятельно рекомендуются.
2 Создание DjVu
2.1 Сканирование книги
Предположим следующую ситуацию для этого раздела. У нас есть книга, которую нужно отсканировать и сохранить в цифровом формате. Для простоты предположим, что все содержимое книги черно-белое (текст, формулы, диаграммы и т.д.), за исключением обложки книги, которая напечатана в цвете. Что мы обычно можем сделать, так это сканировать ее страницу за страницей и сохранять страницы отдельно в каком-либо формате изображения, например, JPEG или PDF. Лично я считаю, что JPEG — лучший выбор. Но если вы считаете, что сжатый TIFF более подходит для ваших целей, этот HOWTO также может быть вам полезен. Однако в этом случае примеры скриптов должны быть немного изменены. На данный момент давайте остановимся на JPEG.
В нашей ситуации с книгой мы сканируем переднюю обложку книги (и заднюю обложку тоже, если на ней есть заметный текст или изображения) в цветные JPEG файлы. Затем мы сканируем остальное в черно-белые JPEG. Это должно обеспечить оптимальную производительность. При сохранении отсканированных изображений обратите внимание на имена файлов. Для целей конвертации в DjVu все изображения должны быть упорядочены в алфавитном порядке с учетом порядка страниц. Например,
000.jpg, 001.jpg, 002.jpg, …, 012.jpg
является правильной нумерацией; а
0.jpg, 1.jpg, 2.jpg, …, 12.jpg
является неправильной, потому что 12.jpg появится перед 2.jpg. Как только вся книга отсканирована, поместите все файлы изображений в отдельный каталог.
В зависимости от устройства сканера, программного обеспечения и метода сканирования вам может понадобиться повернуть все или только некоторые из JPEG изображений, обычно следуя некоторому простому шаблону. Скрипт jpegsrotate ниже может быть весьма полезен в таком случае. Например, запустите его с параметром –even, чтобы перевернуть четные страницы вверх ногами в текущем каталоге. Программа jpegtran, используемая в скрипте, может поворачивать JPEG только на 90, 180 или 270 градусов по часовой стрелке.
#!/bin/bash
#
# jpegsrotate
#
if [ -z `which jpegtran` ]; then
usage
echo "Ошибка: требуется jpegtran"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270
function usage() {
echo
echo "использование:"
echo "$0"
echo " поворачивает файлы с маской $DEFMASK на $DEFDEG градусов по часовой стрелке"
echo "$0 --even"
echo " поворачивает четные файлы с маской $DEFEVENMASK на 180 градусов"
echo "$0 --odd"
echo " поворачивает нечетные файлы с маской $DEFODDMASK на 180 градусов"
echo "$0 --params \"REGEXP\" (90|180|270)"
echo " поворачивает файлы с маской REGEXP на заданное соотношение сторон по часовой стрелке"
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 "Ошибка: текущий каталог должен содержать файлы с маской $MASK"
echo
exit 1
fi
echo "$i"
jpegtran -rotate $DEG $i > $i.rotated
mv $i.rotated $i
done2.2 JPEG в двоичный DjVu
Когда изображения готовы, каждое из них необходимо конвертировать в отдельную страницу в формате DjVu с помощью кодировщика DjVu, такого как cjb2 или cpaldjvu, а затем отдельные страницы должны быть объединены в один документ DjVu с помощью djvm. Напишите следующий скрипт, названный any2djvu-bw, где-нибудь, например, в ~/bin/. Запустите скрипт в каталоге, содержащем исходные изображения, чтобы конвертировать отдельные черно-белые страницы.
#!/bin/bash
#
# any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Ошибка: необходимы anytopnm, ppmtopgm, pgmtopbm и cjb2"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
#OUTFILE="#0-bw.djvu"
function usage() {
echo
echo "использование:"
echo
echo "$0 [\"REGEXP\"]"
echo " конвертирует отдельные страницы с маской по умолчанию $DEFMASK (или REGEXP, если указано)"
echo " в текущем каталоге в отдельные черно-белые документы djvu"
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
# echo " и объединяет их в файл djvu $OUTFILE"
echo
}
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Ошибка: текущий каталог должен содержать файлы с маской $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# в netpbm >= 10.23 вышеуказанную строку можно заменить следующей:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
#djvm -c $OUTFILE $MASK.djvuЕсли вы запустите скрипт как
$ ~/bin/any2djvu-bwон выполнит действие по умолчанию и попытается конвертировать все изображения *.jpg в текущем каталоге в отдельные файлы DjVu с расширением .jpg.djvu. Вы можете изменить это поведение, определив маску файла (опциональный параметр). Значение дотирования 0.499 было получено экспериментально и представляет собой очень хорошую (если не лучшую) настройку для двоичных изображений. Вы также можете раскомментировать указанные строки в any2djvu-bw, чтобы скомпилировать окончательный объединенный черно-белый документ DjVu за один запуск скрипта. Если вы это сделали и если вам не нужны цветные страницы, вы можете пропустить чтение следующего подраздела, рассказывающего о конвертации цветных изображений.
2.3 JPEG в низкокачественный цветной DjVu
Далее нам нужно конвертировать цветные изображения, взятые с передней и задней обложек книги. Предположим, что передняя обложка хранится в 000.jpg, а задняя обложка хранится в 999.jpg, и каждая из них содержит не более, скажем, 8 тонов. Предыдущий запуск any2djvu-bw оставил после себя два нежелательных файла DjVu, а именно черно-белые версии 000.jpg.djvu и 999.jpg.djvu. Удалите эти два файла. Затем конвертируйте как 000.jpg, так и 999.jpg в цветные страницы DjVu, выполнив следующую команду (обратите внимание, что кавычки необходимы):
$ ~/bin/any2djvu-low "+(000|999).jpg" 8где any2djvu-low — это скрипт, приведенный ниже, который должен быть записан в ~/bin/, чтобы выполнить команду.
#!/bin/bash
#
# any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
usage
echo "Ошибка: требуется cpaldjvu"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
#OUTFILE="#0-low.djvu"
function usage() {
echo
echo "использование:"
echo
echo "$0 [\"REGEXP\" [INT]]"
echo " конвертирует отдельные страницы с маской по умолчанию $DEFMASK (или REGEXP, если указано)"
echo " в текущем каталоге в отдельные низкокачественные цветные документы djvu с"
echo " количеством цветов $DEFNCOLORS (по умолчанию) или INT (если указано)"
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
# echo " и объединяет их в файл 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 "Ошибка: текущий каталог должен содержать файлы с маской $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
fi
done
# раскомментируйте следующую строку, чтобы скомпилировать объединенный документ DjVu
#djvm -c $OUTFILE $MASK.djvuЦветные страницы DjVu были созданы с помощью низкокачественного кодировщика cpaldjvu, а не с помощью двоичного кодировщика cjb2. Иногда cpaldjvu с настройкой на 2 цвета может производить немного меньшие выходные файлы по сравнению с cjb2. Это может произойти, поскольку черный цвет оказывается светлее в случае cpaldjvu. Поэтому использование cjb2 предпочтительно для двоичных изображений, которые обычно выглядят лучше, чем ярче черный цвет. Кроме того, конвертация изображения JPEG в двоичный DjVu с использованием cpaldjvu занимает примерно в 1,5 раза больше времени, чем то же самое с использованием cjb2.
Вы также можете ожидать, что cpaldjvu (с количеством цветов по умолчанию 256) будет производить выходные файлы почти такого же размера, как исходный (даже 16M цветной) JPEG файл. Уменьшение количества цветов с помощью опции -colors n cpaldjvu во многих случаях решает проблему экспоненциально медленно, например, уменьшение n с 256 до 16 может дать выход всего в 4 раза меньший.
2.4 Объединение DjVu
Последний шаг — объединить все отдельные страницы DjVu в многопользовательский документ DjVu. Следующий скрипт binddjvu выполняет эту задачу.
#!/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Многостраничный файл DjVu #0.djvu можно дать какое-то лучшее, значимое имя:
$ mv #0.djvu thebook.djvuИ на этом мы закончили наш пример.
2.5 PDF в DjVu
Формат PDF также используется для оцифровки документов, например, на jstor.org, и в настоящее время все еще более широко распространен, чем DjVu, только по той причине, что многие люди имеют программы для чтения PDF и не имеют ничего для чтения DjVu. Есть несколько причин заменить PDF на DjVu, включая следующие:
- На отсканированных документах производительность DjVu строго лучше, чем у PDF. Вот почему имеет смысл конвертировать отсканированный PDF документ в формат DjVu.
- Существует еще один вид ситуации, когда у нас есть много (одностраничных) PDF документов, которые мы хотим объединить. Например, возьмите страницы PDF документа, загруженного из интернет-библиотеки.
- Объединение PDF, одностраничных или многопользовательских, в один DjVu.
- Также на некоторых сканерах возможно сканировать напрямую в одностраничные PDF файлы. Тогда снова удобно объединять PDF в многопользовательский DjVu.
Следующий скрипт pdfs2djvu достаточно для каждой из вышеуказанных действий. По умолчанию pdfs2djvu берет все файлы *.pdf в текущем каталоге в алфавитном порядке и производит один многопользовательский двоичный файл DjVu #0.djvu.
#!/bin/bash
#
# pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Ошибка: необходимы pdftoppm, cjb2 и djvm"
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 "Ошибка: текущий каталог должен содержать файлы с маской $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После выполнения скрипта pdfs2djvu оставляет страницы, закодированные в DjVu, в виде файлов *.pbm.djvu в текущем каталоге.
3 Заключительные замечания
Этот HOWTO был написан не разработчиком DjVu, а его пользователем. Поэтому HOWTO возможно не хватает некоторых технических деталей. Если вы хотите получить больше технической информации о командах, смотрите manpages или любую другую соответствующую документацию. Я бы предложил очень поучительное
$ man djvuвсем, кто начинает использовать djvulibre на linux.
Автор: Владимир Командецкий
Get new posts in your inbox
No spam. Unsubscribe anytime.