Олег Шалаев  > Мой Debian-опыт

Кодированием в djvu я предпочитаю заниматься на рабочем компьютере т.к. это -- довольно-таки "тяжеловесная" операция и выполнять её рекомендуется на более мощной машине, чем мой домашний старичок. (То есть в принципе он может, но в несколько раз медленнее.)

Сканирование в формат djvu

Для сканирования одноцветного текста удобно использовать сканер с автоматической подачей бумаги (есть у нас такой на работе, подключён к Windows-компьютеру), сохраняя результаты сканирования в многостраничном tiff-файле. Опции сканирования: 300 dpi, 256 оттенков серого; 97-страничный tiff-файл занимает 807 мегабайт.

Рукописный текст

... (см. старую версию этой странички)

Печатный текст

Конечно, наилучшее средство обработки отсканированного печатного текста — его распознавание (оцифровка). Для сканирования художественной литературы есть очень хорошая программа FineReader. Ах, если бы она распознавала формулы — я бы точно упросил шефа её купить (но не дороже, чем за 500CHF).
На сегодня мне неизвестны программы, которые могут распознавать формулы. Таким образом, оцифровка научно-технической литературы — долгий трудоёмкий процесс. Гораздо быстрее — отсканировать в tiff и закодировать в djvu.

Итак, дано: многостраничный файл scan.tif, который мы хотим переделать в djvu. Выполняем в терминале следующие команды:

mkdir new
tiffsplit scan.tif tmp
for i in tmp*.tif ; do  convert $i -rotate -90 new/$(basename $i .tif).pgm ; done
rm tmp*.tif
for i in new/*.pgm ; do mkbitmap -s 1 $i -o $(basename $i) ; done && rm new/*.pgm
Что именно делает mkbitmap, я не знаю. Но без этой программы рисунки в серых тонах закодировались бы в виде безобразных чёрных клякс. Кроме того, mkbitmap заменяет отбеливание (см. старую версию этой странички)
for i in *.pgm ; do convert $i  -fill white \
-draw 'rectangle 0,0 3443,100' \
-draw 'rectangle 0,0 100,2550' \
-draw 'rectangle 1600,0 1700,2550' \
-draw 'rectangle 3200,0 3436,2550' \
-monochrome tmp.pbm && \
cropZone=$(convert tmp.pbm -virtual-pixel edge -blur 0x10 -fuzz 5% -trim -format '%wx%h%O' info:) && \
convert tmp.pbm -crop $cropZone new/$(basename $i .pgm).pbm ; done ; rm tmp.pbm
— рисуем четыре белых прямоугольника в середине книжки и по краям — там, где неприятные чёрные полосы. Затем хитрожопо (индивидуально для каждой странички-картинки) получаем правильные параметры для обрезания полей, и передаём эти параметры команде crop.

Теперь стоит посмотреть с помощью gqview содержимое каталога new/. Главное — выяснить, не слишком ли много мы обрезали. (Если много и не там, следует изменить координаты rectangle в предыдущей команде.) Обнаруженные на некоторых страницах пятна (без этого не обходится) можно удалить вручную, например, с помощью gimp. Затем кодируем наши картинки в djvu:
cd new; for i in *.pbm ; do cjb2 -lossy -clean $i $(basename $i .pbm).djvu ; done

—получили по .djvu - файлу на каждую страничку. Их можно объединить с помощью djvm:
djvm -c ../file.djvu *.djvu

Итог: 20-50 кбайт/стр., хорошее качество, радует глаз, а умная обрезка позволяет при распечатывании растягивать область текста почти до 100% формата A4, что приводит к увеличению текста, а значит, к меньшей усталости глаз. Недостаток метода — cjb2 не умеет делать
Multi-page compression. Matching characters on several pages would improve the compression ratios for multi-page documents. (цитата из man cjb2).
Если кто знает, подскажите, пожалуйста, метод объединения одностраничных "словарей" (dictionaries) в многостраничном djvu-файле.

Много информации о djvu можно получить здесь.

Примечание: я использую tiffsplit scan.tif tmp, а теоретически мог бы сразу же запускать convert scan.tif %02d.pgm для преобразования многостраничного tiff-файла. Преимущество tiffsplit — в том, что он не задыхается даже под тяжестью гигабайтного tiff-файла (на компьютере с 2Гб ОЗУ). Что же касается convert, так он уже очень активно начинает скрипеть винчестером при размере tiff-файла в 150 мегабайт.

А ещё надо разобраться с пакетом unpaper, который автоматически поворачивает текст.


  Всё вышеизложенное я засунул в эти скрипты:
одностороннее сканирование на сканере ScanSnap S510
двустороннее сканирование на сканере ScanSnap S510
кодируем отсканированное (формат letter) в djvu на 8ми процессорах
кодируем отсканированное (формат A4) в djvu на 8ми процессорах
-- этим скриптам требуются служебные файлы: ryba.sh и ryba-A4.sh


Олег Шалаев
Last modified: Mon Dec 6 18:13:09 CST 2010