5/26/2008

Создание документов DJVU в Linux

Задача: имеется отсканированная большая книга, и требуется перевести её в компактный формат для последующего просмотра в том же djview. В общем, нужно создавать документы DjVU в Linux.
Решение: в Linux просто и легко конвертируем насканированные страницы в DJVU.


Почему DJVU?
Потому, что есть множество отсканированных книг, и есть потребность их компактно хранить и работать с ними. Для этой задачи орлы из AT&T Labs разработали специальные алгоритмы сжатия, которые легли в основу формата DJVU.

Такие электронные книги занимают меньше места, чем, скажем, в PDF, PS или других форматах, и быстрее отображаются при просмотре.


Что потребуется для создания DJVU файлов из изображений
Для того, чтобы сконвертировать много изображений в DJVU нужно установить следующие пакеты:
aptitude install djview djvulibre-bin netpbm
При сканировании следует именовать файлы подряд так, чтобы они сортировались в порядке нумерации страниц. То есть вот так:

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

а не так:
0.jpg, 1.jpg, 2.jpg, ..., 12.jpg

потому как 12.jpg появится перед 2.jpg - так что при сканировании нужно об этом подумать.

Файлы изображений помещаются в отдельный каталог, после чего переходим в этот каталог и даём команду:
./any2djvu-bw
Эта команда - вызов скрипта оболочки, текст которого приведён ниже:

#!/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 and cjb2 are needed"
echo
exit 1
fi

shopt -s extglob

# DEFMASK="*.jpg"
DEFMASK="*.png"
DPI=300
# uncomment the following line to compile a bundled DjVu document
OUTFILE="#0-bw.djvu"

function usage() {
echo
echo "usage:"
echo
echo "$0 [\"REGEXP\"]"
echo " converts single pages with the default mask $DEFMASK (or REGEXP if provided)"
echo " in the current directory to single-page black and white djvu documents"
# uncomment the following line to compile a bundled DjVu document
echo " and bundles them as a djvu file $OUTFILE"
echo
}

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

for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Error: current directory must contain files with the mask $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# in netpbm >= 10.23 the above line can be replaced with the following:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done

# uncomment the following line to compile a bundled DjVu document
djvm -c $OUTFILE $MASK.djvu

Красным в скрипте выделена строчка, где определяется, какой формат файлов будет преобразован в DJVU. В данном примере это png.

Итак, в результате работы скрипта появятся промежуточные файлы djvu и файл #0-bw.djvu - это и есть конечный файл, содержащий в себе все страницы. Переименовываем его в то, что более приятно глазу, и готово. После этого можно открыть полученный файл при помощи djview или evince.


Так же перевести документы в формат DJVU можно и другими утилитами.

any2djvu
Это веб-сервис, находящийся тут. Он позволяет перевести отсканированные изображения непосредственно в файл DJVU. Удобно для тех, у кого широкий и дешёвый интернет-канал.

Так же можно воспользоваться кодом, предложенным комментатором с OpenNet:

#!/usr/bin/perl -w

my $i = 0;

my @cmds = qw[ djvm -c output.djvu ];
foreach ( <*.*> ) {
if (/(.*)\.jpg$/ ){
print "$_\n";
# system("c44", '-crcbfull', $1.'.jpg', $1.'.djvu');
system("cpaldjvu", $1.'.jpg', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
elsif (/(.*)\.tif$/ ) {
print "$_\n";
# установить 300 dpi в tiff'e
#system("tiffset", '-s 296 2', $1.'tiff');
#system("tiffset", '-s 282 300.0', $1.'tiff');
#system("tiffset", '-s 283 300.0', $1.'tiff');
# или
# system("cjb2", '-dpi', '300', '-losslevel', '100', $1.'.tiff', $1.'.djvu');
system("cjb2", $1.'.tif', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
}
print "$i files renamed\n";
system(@cmds);
print "\n$cmds[2] created";





Конвертируем PDF-документ в DJVU
Сконвертированные документы DJVU из PDF, как правило, имеют меньший размер и гораздо быстрее просматриваются, что особенно актуально для портативных устройств.

Для того, чтобы сконвертировать файл PDF в DjVu, требуется в текущем каталоге выполнить:
./pdfs2djvu
Это тоже скрипт на баше, код которого такой:

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Error: pdftoppm, cjb2 and djvm are needed"
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: current directory must contain files with the mask $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

Выполнение скрипта приведёт к тому, что все файлы PDF в текущей директории будут сконвертированы в DJVU. Аналогом является программа от Гугл под названием dpf2djvu.

Единственное условие: скрипт не переваривает кириллические названия с пробелами. Так что желательно временно переименовать файл так, чтобы он содержал только латинские символы и желательно без пробелов.

Ещё можно попробовать программу
gscan2pdf, которая позволяет сканировать изображения в форматы PDF и DJVU. Так же вам может пригодиться программа unpaper для «очистки» сканов. Это существенно улучшает их пригодность для последующего компьютерного использования.

Ссылки

Пост является волным пересказом этой замечательной статьи, тексты скриптов оттуда же. Так же можно прочесть вот это и это. Интересная подборка материалов на русском есть тут.

44 комментария:

  1. Поправь, пожалуйста - PDF в DJVU. А то сразу бросается в глаз. ;-)

    ОтветитьУдалить
  2. Для конвертации PDF в DJVU еще можно использовать веб-сервис http://any2djvu.djvuzone.org/

    ОтветитьУдалить
  3. Мне удобнее всё в pdf (как в контейнер), а потом pdf2djvu http://code.google.com/p/pdf2djvu

    ОтветитьУдалить
  4. А эти пакеты в каких Дебовских дистрибах содержатся? Начиная с первого, или только в Этче?

    ОтветитьУдалить
  5. Имеется ещё утилита djvudigital.

    ОтветитьУдалить
  6. 2 Tanya пишет...
    Поправь, пожалуйста - PDF в DJVU.
    То есть DjVu в DJVU? Правильно понял? Тогда поправил :-)

    2 div пишет...
    Для конвертации PDF в DJVU еще можно использовать веб-сервис http://any2djvu.djvuzone.org/
    Не у всех есть такой широкий канал. Но спасибо, добавлю в пост.

    2 yamadharma пишет...
    pdf2djvu http://code.google.com/p/pdf2djvu
    Не знал. Спасибо.

    2 strangeman пишет...
    А эти пакеты в каких Дебовских дистрибах содержатся?
    По крайней мере в Этче есть, а про первые дистрибутивы Дебиан не знаю :-)

    2 Shender пишет...
    Имеется ещё утилита djvudigital.
    Посмотрю. Спасибо.

    Огромное спасибо комментаторам за перечисленные утилиты. Обязательно на них гляну. Если есть что ещё - пишите, не стесняйтесь.

    ОтветитьУдалить
  7. >> Выполнение скрипта приведёт к тому, что все файлы PDF в текущей директории будут сконвертированы в PDF.

    ОтветитьУдалить
  8. 2 Deepwalker пишет...
    Спасибо большое. Вот чёрт, сколько раз пост вычитывал - а всё равно грабли попадаются... Чтоб я без комментаторов делал!? :-)

    ОтветитьУдалить
  9. Для сканирования и последующего сохранения в djvu, pdf или какой-либо графический формат использую программу gscan2pdf. Очень удобная вещь!
    сайт программы http://gscan2pdf.sourceforge.net/

    ОтветитьУдалить
  10. Есть одна фича в PDF. Я могу выделить в KPDF область и получить в буфер текст. Потом из буфера вставить в программу (если код), в письмо, в любой документ.
    Можно ли такое из DJVU? Если нет, то надо поддчеркнуть, что выиграв в размере файла, можно потерять в другом.
    А есть ли инструменты для поджатия PDF? Не для архиваирования, а для уменьшения размера.

    ОтветитьУдалить
  11. А у меня из цветных картинок получились черно-белые. Можно это исправить. Спасибо

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить
  13. а подкрутить качество никак нельзя при сжатии?

    ОтветитьУдалить
  14. Что мне не нравится в djvu, так это отсутсвие просмотра нескольких страниц одновременно.
    Или есть где-то?

    ОтветитьУдалить
  15. 1) Насчет текста в djvu. Если добавить в djvu текстовый слой, т.е. попросту рапознанный текст, то его можно копировать и вставлять куда надо. Есть соответствующая утилита, которая вставляет в djvu распознанный текст прямо из пакетов Finereader, но к сожалению она виндовая.
    2) Справедливости ради, нужно сказать, что опенсорсный кодер djvulibre хуже по эффективности, чем виндовый от LizardTech.

    Хорошая подборка материалов по djvu есть здесь: http://www.djvu-inf.narod.ru/

    ОтветитьУдалить
  16. 2 Анонимный
    >http://www.djvu-inf.narod.ru/
    Здесь нет ничего про *nix-программы.

    ОтветитьУдалить
  17. мне кажется что тут много лишнего
    вот собрать djvu из картинок (закоментированы различные оптимизации):
    ---
    #!/usr/bin/perl -w

    my $i = 0;

    my @cmds = qw[ djvm -c output.djvu ];
    #my @fls = <*.tif>;
    foreach ( <*.*> ) {
    if (/(.*)\.jpg$/ ){
    print "$_\n";
    # system("c44", '-crcbfull', $1.'.jpg', $1.'.djvu');
    system("cpaldjvu", $1.'.jpg', $1.'.djvu');
    $i++;
    push @cmds, $1.'.djvu';
    }
    elsif (/(.*)\.tif$/ ) {
    print "$_\n";
    # установить 300 dpi в tiff'e
    #system("tiffset", '-s 296 2', $1.'tiff');
    #system("tiffset", '-s 282 300.0', $1.'tiff');
    #system("tiffset", '-s 283 300.0', $1.'tiff');
    # или
    # system("cjb2", '-dpi', '300', '-losslevel', '100', $1.'.tiff', $1.'.djvu');
    system("cjb2", $1.'.tif', $1.'.djvu');
    $i++;
    push @cmds, $1.'.djvu';
    }
    }
    print "$i files renamed\n";
    system(@cmds);
    print "\n$cmds[2] created";
    ---
    и разбор на tiff'ы
    ---
    #!/usr/bin/perl -w

    mkdir 'pics';
    my @cmd = qw[ djvmcvt -i input.djvu pics index.djvu ];
    system (@cmd);

    foreach ( < pics/*.djvu > ) {
    m/(.*)\.djvu$/;
    if ( $1 ne 'index' ) {
    system("ddjvu", '-format=tif', $_, $1.'.tiff');
    unlink $_;
    }
    }
    ---
    аналогично разбирается на jpeg'и
    делать pdf2djvu не вижу смысла.
    Для нормального pdf это только ухудшит качество и увеличит размер.

    ОтветитьУдалить
  18. Спасибо большое за статью, пригодится.
    В отношении 2.jpg 12.jpg - всё несложно переименовывается при помощи rename в 002.jpg и 012.jpg (на тот случай, если кто-то уже насканировал таким образом).

    ОтветитьУдалить
  19. Большое спасибо уважаемым комментаторам за ценные замечания - обязательно добавлю их в пост!

    Если есть что-то ещё, что можно сделать с djvu-документами - пишите.

    ОтветитьУдалить
  20. Для конвертирования pdf -> djvu я использую скрипт на питоне (ниже) который чуть подточил (чтоб не было проблем с именами файлов с пробелами).

    Оригинальный скрипт, который был когда-то нагуглен:

    #!/usr/bin/python

    #########################################################################
    # PDF2DJVU version 0.12 -- Converts a PDF file to a DJVU file.
    #
    # Copyright 2005, 2006 Jonathan Hanke
    # Original Author: Jonathan Hanke
    # Last updated by Jonathan Hanke on March 4, 2006
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful, but
    # WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    # General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    # 02110-1301, USA
    #########################################################################
    # Version History:
    #
    # Version 0.12 -- Padded the page number strings to give correct page orderings
    # Version 0.11 -- Ported from Bash to Python
    # Version 0.10 -- Original Bash script
    #
    #########################################################################
    # To Do:
    # - Add a flag to reinstate the page rotation feature
    #
    #########################################################################

    import os, sys, time, tempfile, string

    ## Print the current version
    print "Using pdf2dj v0.12 -- Written by Jonathan Hanke, last modified 3/4/2006"


    ## Get an argument list from the command line
    arg_list = sys.argv[1:]


    ## Filter for only ".pdf" suffixes
    pdf_args = [ name for name in arg_list if name.endswith(".pdf") ]
    print " There are", len(pdf_args), " PDF files to convert."


    ###############
    ## FILE LOOP ##
    ###############
    for pdf_filename in pdf_args:

    ## Make the temporary directory
    tmp_dir = tempfile.mkdtemp("", pdf_filename + "__", "/tmp")

    ## (Partially) protect the filename(s) for Bash
    bashpdf_filename = pdf_filename.replace("(", "\(").replace(")", "\)") # Protect parentheses
    bashpdf_filename = bashpdf_filename.replace("'", "\'").replace('"', '\"') # Protect single and double quotes
    #bashtmp_dir = tmp_dir
    bashtmp_dir = tmp_dir.replace("(", "\(").replace(")", "\)") # Protect parentheses
    bashtmp_dir = bashtmp_dir.replace("'", "\'").replace('"', '\"') # Protect single and double quotes

    ## Find the number of pages in the pdf file
    pages_text = os.popen("pdfinfo " + bashpdf_filename + " | grep 'Pages:'").readline()
    num_of_pages = int(pages_text.lstrip("Pages:").strip())
    print "There are", num_of_pages, "pages in the PDF file", pdf_filename


    ###############
    ## PAGE LOOP ##
    ###############
    for num in range(1, num_of_pages + 1):
    num_str = string.zfill(num, 8) # Allows up to 10 million (correctly ordered) pages

    if os.path.exists(tmp_dir + "/" + num_str + ".djvu"):
    print " Found page ", num, " -- ", time.asctime()

    else:
    print " Generating page ", num, " -- ", time.asctime()

    # Extract the current page
    extracted_pagename = bashtmp_dir + "/newpage_" + num_str
    GS_Basic = "gs -q -r300 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=ppmraw"
    GS_Custom = "-dFirstPage=" + str(num) + " -dLastPage=" + str(num) + " -sOutputFile=" + extracted_pagename + " -- " + bashpdf_filename
    os.system(GS_Basic + " " + GS_Custom)


    # ######################################
    # ## ADD THIS FUNCTIONALITY AS A FLAG ##
    # ######################################
    #
    # # Rotate CCW by the number of degrees in the second argument!
    # if [ $# = 1 ]; then
    # ## echo " No extra operations!"
    # sleep 0 #Dummy command
    # else
    # ## echo " Rotating clockwise by $2 degrees!"
    # convert -rotate $2 $tmp_dir/newpage_$num $tmp_dir/newpage_$num-rot$2.ppm
    # rm -f $tmp_dir/newpage_$num # Needed to ensure that we only convert the rotated image!
    # fi



    # Convert the page djvu format, then remove it
    converted_pagename = bashtmp_dir + "/" + num_str + ".djvu"
    os.system("cpaldjvu -dpi 300 " + extracted_pagename + " " + converted_pagename)
    os.system("rm -f " + extracted_pagename)


    # Assemble each multi-page djvu document
    djvu_filename = bashpdf_filename.rstrip(".pdf") + ".djvu" # This is the filename with .pdf replaced by .djvu
    os.system("djvm -c " + djvu_filename + " " + bashtmp_dir + "/*.djvu")


    # Remove the temporary directory
    os.system("rm -rf " + bashtmp_dir)

    ОтветитьУдалить
  21. Тем кто предпочитает GUI, советую маленькую программу под оффтопик, которая отлично работает под wine http://djvu-soft0001.nxt.ru/djvu_small_v0_3_1.rar

    ОтветитьУдалить
  22. А если я хочу из OOo вывести текст с картинками в DjVu, то только через PDF?

    ОтветитьУдалить
  23. 2 ranma-rus
    А если я хочу из OOo вывести текст с картинками в DjVu, то только через PDF?
    насколько я знаю, да.. ну можно еще через постскрипт.

    ОтветитьУдалить
  24. Большое спасибо, очень помогло, ценная информация.

    Единственное:
    В ленни при попытке выполнить

    aptitude install djview djvulibre-bin netpbm

    aptitude начала ругаться, пришлось через apt-get ставить.

    ОтветитьУдалить
  25. Полутона в резульатате иногда не нужны. Например если это только текстовый документ.
    тогда вместо pamditherbw(pgmtopbm) можно использовать pamthreshold.

    Качество полученого документа - лучше.

    ОтветитьУдалить
  26. виндовый бесплатный djvu solo 3.1 работает под wine

    ОтветитьУдалить
  27. Спасибо за статью. Думаю, как-нибудь пригодится. Поставь, пожалуйста, ещё ссылку на unpaper, программу для «очистки» сканов. Это существенно улучшает их пригодность для последующего компьютерного использования.

    ОтветитьУдалить
  28. > потому как 12.jpg появится перед 2.jpg

    ls -v *.jpg выдаст в правильном порядке :)

    $ touch a{1,2,12,20}
    $ ls -v a*
    a1 a2 a12 a20
    $ ls a*
    a1 a12 a2 a20


    Соответственно, если уже есть неправильно пронумерованные файлы есть, то можно сделать for f in `ls -v *` (потенциальная проблема с пробелами в именах).

    Можно, конечно, и переименовать: for f in a* ; do mv ${f} a$(printf "%03d\n" ${f/a/}) ; done

    ОтветитьУдалить
  29. Хочу поделиться своим опытом:
    http://theorie5.physik.unibas.ch
    /shalaev/my.linux/djvu.html
    Преимущество: внешние поля автоматически обрезаются, в результате при последующем распечатывании на бумаге остаётся меньше неиспользованного места, так что текст становится крупнее и меньше устают глаза.

    ОтветитьУдалить
  30. Спасибо всем отписавшимся выше - буду редактировать пост, используя ваши комментарии.

    2 jetxee комментирует...
    Поставь, пожалуйста, ещё ссылку на unpaper
    Поставил. Кстати, полезная программа, я про неё не знал. Спасибо!

    2 Анонимный комментирует...
    Хочу поделиться своим опытом
    Большое спасибо! При следующей правке непременно включу часть текстов в пост!

    ОтветитьУдалить
  31. Спасибо, полезная страничка. Мне приходится нередко конвертировать отсканированные книги tiff --> djvu. Опытным путем пришел к следующему:

    1. Весьма эффективно писать маленькие скрипты, исходя из конкретно поставленной задачи, используя при этом базовые утилиты из DjVuLibre (см. man djvu). Качество при этом получается лучше, чем при использовании более общей утилиты pdf2djvu. Например, если конверируется набор черно-белых файлов 0001.tiff, 0002.tiff, ..., состоящих из отсканированных с разрешением 300 dpi изображений, то хорош примитивный скрипт типа:

    #!/bin/bash
    for i in *.tiff; do
    convert -format pbm $i "$i.pbm"
    cjb2 -dpi 300 -clean "$i.pbm" "$i.djvu"
    rm -f "$i.pbm"
    done

    Если изображения серые, то:

    #!/bin/bash
    for i in *.tif; do
    convert $i -format pgm "$i.pgm"
    c44 -dpi 300 "$i.pgm" "$i.djvu"
    rm -f "$i.pgm"
    done

    И так далее. Идея, думаю, понятна.

    2. Спасибо за информацию об unpaper. Буду смотреть. Пока что из всего, что видел, самая эффективная для удаления черных полей и разбиения страниц программа - SkanKromsator (начальный обзор и загрузка програмы - см., напр.: http://www.bible-mda.ru/soft/scankromsator/1-sergeev_v-scankromsator-start-guide.html) - написанная для MS Windows, свободно распространяемая, она без проблем работает через Wine. Одна из немногих виндовз-программ, которые приходится запускать через эмулятор. Но очень хочется получить что-нибудь на GNU/Linux и под GPL.

    ОтветитьУдалить
  32. > Сконвертированные документы DJVU из PDF, как правило, имеют меньший размер и гораздо быстрее просматриваются, что особенно актуально для портативных устройств.

    Если вы имеете ввиду PocketPC, то дела обстоят несколько иначе, дело в том, что многие программы при работе с PDF имеют режим "сжатия" текста в экран (примерно как Opera Mini), то есть текст можно читать просто листая верх-вниз. А вот в DJVU такого сделать нельзя. Из-за специфики формата, строчка обрывается на краю экрана и чтобы ее дочитать приходится идти вправо, а как дочитаю строчку, то влево, чтобы увидеть следующую, а это очень раздражает. Разницы в скорости при открытии PDF и DJVU особой нет. По крайней мере у меня

    ОтветитьУдалить
  33. поправьте
    Аналогом является программа от Гугл под названием dpf2djvu.

    ОтветитьУдалить
  34. спасибо за упоминание программы gscan2pdf. Мне надо было сконвертировать 200 штук jpeg в один документ djvu. Пять секунд и готово, я жутко доволен. Конечно эстетам нужны решения покруче - а мне и этого вполне хватило.

    ОтветитьУдалить
  35. По поводу множественного переименования файлов - пользуйтесь прекрасной программкой mmv.
    Вот в этом блоге хорошо описано: http://tuxedo-live.blogspot.com/2007/07/mmv.html

    ОтветитьУдалить
  36. > Так же можно воспользоваться кодом, предложенным комментатором с OpenNet..

    Воспользовался. Работает. Вот только из 200 метров jpeg`ов получился 416 мегабайтный(!) DJVU.

    Есил же ваш скрипт использовать, для книжки с изображениями, не только еткст - ужас на выходе (в конкретном случае).

    Думаю попробовать gscan2pdf, может меньше получиться...

    В любом случае спасибо за статью.

    ОтветитьУдалить
  37. Размер получающегося DjVu очень сильно зависит от используемого алгоритма и его параметров.

    Двухцветный чёрно-белый DjVuBitonal (cjb2) сжимает хорошо, но он двухцветный. То есть без градаций серого. Cjb2, кстати, по умолчанию сжимает без потерь (можно ещё сильнее — с потерями).

    Понимающий фото и градации серого DjVuPhoto (c44) сжимает хуже, зато он цветной. В новых версиях c44 настройки по умолчанию заточены на получение максимально качественной картинки, а не минимального размера файла, поэтому для получения маленьких файлов нужно играться с параметрами сжатия. По-умолчанию c44 сжимает слабо.

    На практике проще использовать cjb2, чем подбирать параметры c44. Однако для cjb2 нужно растеризовать исходник в бо́льшем разрешении (минимум 600 dpi для текста), потому что никакого сглаживания в PBM быть не может и все градации серого можно только сымитировать дизерингом.

    Вот мой скрипт для конвертации PDF в DjVu с обрезанием полей. В нём можно задавать желаемое разрешение и алгоритм сжатия опцией командной строки. Я им файлы для электронной читалки обрабатываю.

    ОтветитьУдалить
  38. По скрипту pdfs2djvu имеются следующие замечания:
    1) Переменная DPI не используется
    2) В конце надо добавить rm *.pbm.djvu , чтобы временные файлы удалить

    ОтветитьУдалить
  39. По скрипту any2djvu-bw я как-то в лоб написал в конце
    rm -f *[!#0-bw].djvu
    Хотя в идеале нужно оставить самый жирный файл из существующих но это же придумать надо. А тут имя всё равно не критично и так работает без find / xargs /du и т.д.

    ОтветитьУдалить
  40. В цепочке anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
    получается сбой.
    pgmtopbm -value 0.499 (и с другими value результат тот же) почему-то преобразует вполне нормальный pgm в чистую страничку pbm. Кто-нибудь может подсказать в чем может быть дело?

    ОтветитьУдалить
  41. В цепочке anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
    получается сбой.
    pgmtopbm -value 0.499 (и с другими value результат тот же) почему-то преобразует вполне нормальный pgm (смотрела просмотрщиками и gimp'ом - буквы вполне читаемы) в чистую страничку pbm. Кто-нибудь может подсказать в чем может быть дело?
    А если в pbm не преобразовывать, а сразу pgm отправить на cjb2 (пробовала с разными dpi и losslevel'ами), то качество текста получается неприемлемо плохое.

    ОтветитьУдалить
  42. Для улучшения сканов есть scan tailor. Он правда уже не особо развивается, но вполне юзабелен.

    ОтветитьУдалить
  43. Действительно, в цепочке
    anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
    где-то происходит ошибка - страница получается девственно чистой.
    Юзаю Gentoo, весь софт самых новых версий.
    Для себя эту проблему я решил так - заменил строку на
    convert $i $i.pbm
    convert - это утилита из пакета ImageMagic
    Автор, поправь!

    ОтветитьУдалить