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

Внимание: Это -- устаревший способ. В результате получается невысокое качество: приемлемо, но глаз не радует. Сканирование в tiff даёт намного лучшие результаты, чем в pdf.

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

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

См. также эту страничку.

Для сканирования рукописного одноцветного текста в Linux удобно использовать сканер с автоматической подачей бумаги (есть у нас такой на работе, подключён к Windows-компьютеру), сохраняя результаты сканирования в многостраничном pdf-файле. Этот файл получается довольно большим (порядка 300 кбайт на страничку рукописного текста), поэтому желательно его перекодировать в формат djvu, что приводит к его похудению более чем в 10 раз. Нежелательно для записей использовать разлинованную бумагу (напр., в клеточку), т.к. потом приходится бороться за то, чтобы рисунок бумаги не был закодирован в djvu вместе с написанным текстом. Лучше всего для записей использовать чистый белый лист — такой, на котором принтеры и ксероксы печатают.

Итак, для начала — разбираем нужный файл на странички (file.pdf мы получили со сканера):
pdftoppm -gray file.pdf tmp
Получили множество одностраничных файлов tmp*.pgm. Наш сканер не понимает, что цвет бумаги — белый. Он считает его светлосерым. Кроме того, и цвет ручки он считает не чёрным, а тёмносерым. Значит, необходимо отбеливание:
mkdir new
for i in *.pgm ; do convert $i -white-threshold 60000 -black-threshold 50000 -monochrome new/$i ; done

— для чётких (высококонтрастных) записей ручкой. Смысл этой команды: всё, что темнее некоторого уровня, превращаем в чёрный, всё, что светлее некоторого уровня, превращаем в белый. У меня с такими параметрами пропадает и рисунок разлиновки (если сканируемые записи были сделаны на разлинованной бумаге).

Для (нечётких) карандашных записей следует "смягчить" параметры команды convert:
for i in *.pgm ; do convert $i -white-threshold 71000 -black-threshold 60000 -monochrome new/$i ; done
— в этом случае рисунок разлиновки у меня кодируется в djvu. Мораль: если уж любите писать карандашом, пишите на неразлинованной белой бумаге!

Заключительный этап: перекодируем каждую страничку в djvu и из множества одностраничных djvu-файлов делаем один многостраничный:
cd new
for i in *.pgm ; do cjb2 -lossy $i $(basename $i .pgm).djvu ; done
djvm -c ../file.djvu *.djvu

Результат: file.djvu занимает по 5-22 кбайт на страничку.

Для эстетов: всё-таки лучше записи от руки выглядят в векторном формате (эффект перьевой ручки).
Возьмём для примера одностраничный file.djvu (полученный путём вышеописанных манипуляций) и перекодируем его в векторный file.pdf:
ddjvu -format=ppm -page=1 -size=1756x1343 file.djvu file.pbm
convert file.pbm -monochrome file-1.pbm
potrace --opttolerance 1 --unit .5 -b pdf file.pbm

Да, file.pdf получился в 3 раза больше file.djvu, но распечатайте и сравните...

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

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

Может понадобиться отбеливание и вырезание тёмной центральной части:

mkdir new
pdftoppm  -gray kniga.pdf tmp ; \
for i in *.pgm ; do mkbitmap -s 1 $i -o new/$i ; done
rm *.pgm
mv new/* .
for i in *.pgm ; \
do convert $i -white-threshold 60000 -black-threshold 50000 -monochrome -fill white \
-draw 'rectangle 840,0 940,1302' \
-draw 'rectangle 0,0 60,1302' \
new/$i ; done
— мы рисуем два белых прямоугольника в середине книжки и слева — там, где неприятные чёрные полосы. Что именно делает mkbitmap, я не знаю. Но без этой программы рисунки в серых тонах закодировались бы в виде безобразных чёрных клякс.

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

—получили по .djvu - файлу на каждую страничку. А теперь их надо объединить с помощью djvm, точно так же, как и в случае рукописей — см. выше.

Команда convert предоставляет безграничные возможности для творчества. Например, я тут попробовал обрезать у одной книжки поля, чтобы потом можно было увеличить текст, растягивая его на страницу формата A4. Этого эффекта я достиг с помощью

for i in *.pgm ; \
do convert $i  -crop 1550x1150+60+100 -white-threshold 60000 -black-threshold 50000 -monochrome -fill white \
-draw 'rectangle 740,0 800,1302'  -trim -transparent white  new/$i ; done

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


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