vak: (Default)
[personal profile] vak
Опишу здесь "щадящий" метод сканирования книг и документов, не требующий расшивания и даже механического контакта со страницами.

Пару месяцев назад мне в руки попали пара документов исторической ценности: описание архитектуры советской ЭВМ СВС-1. Папки довольно толстые и негибкие: прижать их к стеклу традиционного сканера нереально. Расшивать папки было бы варварством: всё-таки музейный экспонат. Я обзвонил фирмы, предлагающий коммерческий сервис по сканированию, но остались сомнения как в качестве результата, так и в сохранности документов. Решил городить свой огород.

Приобрёл сканер, не требующий физического контакта с объектом: CZUR ET16 Plus. Фактически это умная 16-мегапиксельная фотокамера с подсветкой и лазерной наводкой на резкость. Притом софт работает на Маке, что для меня критично. Особенность: подключать к компьютеру надо родным USB-кабелем, иначе будут глюки.



Шаг 1: сканируем, причём для экономии сразу в чёрно-белом режиме. Титульную страницу можно в цвете. Каждая страница в максимальном разрешении образует отдельный файл типа image01234.jpg размером один-два мегабайта. Если непосредственно запихнуть их в PDF, документ в 172 страницы займёт 240 мегабайт. Это слишком расточительно, будем мудрить.

Шаг 2: преобразуем страницы в формат PNG, попутно уменьшая разрешение в два раза. Используем для этого редактор GIMP в пакетном режиме. Создаём файл ~/.gimp-2.8/scripts/batch-to-png.scm со следующим содержимым:
(define (batch-to-png infile outfile ratio)
    (let* (
            (image (car (gimp-file-load RUN-NONINTERACTIVE infile infile)))
            (drawable (car (gimp-image-get-active-layer image)))
            (cur-width  (car (gimp-image-width image)))
            (cur-height (car (gimp-image-height image)))
            (width      (* ratio cur-width))
            (height     (* ratio cur-height))
        )
        (gimp-image-scale image width height)
        (gimp-convert-indexed image NO-DITHER WEB-PALETTE 256 0 0 "")
        (file-png-save 1 image drawable outfile outfile 1 9 1 1 1 1 1)
        (gimp-image-delete image)
    )
)
После этого выполняем скрипт:
for infile in image*.jpg
do
    outfile=`basename $infile .jpg`.png
    gimp -i -b '(batch-to-png "'$infile'" "'$outfile'" 0.5)' -b '(gimp-quit 0)'
done
Получаем набор файлов image*.png размером примерно в 14 раз меньше исходного. Уже хороший выигрыш.

Можно бы ещё сэкономить, если умудриться убрать с изображения лишний шум. Я пытался задействовать фильтр Гаусса:
        (plug-in-sel-gauss RUN-NONINTERACTIVE image drawable 5.0 178)
Не могу сказать, что доволен результатом. Хорошо бы подобрать другой фильтр, способный отфильтровать ненужные точки и штрихи, но не нарушающий качество букв текста.

Шаг 3: Преобразуем страницы в PDF.
for infile in image*.png
do
    outfile=`basename $infile .png`.pdf
    convert $infile $outfile
done
Шаг 4: Объединяем файлы страниц в единый PDF.
pdftk image*.pdf output document.pdf
Результат вы можете видеть здесь: СВС-система-команд.pdf (23 мегабайта)

Для сравнения, вот версия с гауссом на втором шаге, но без уменьшения разрешения: view (40 мегабайт)

Date: 2019-02-21 07:50 (UTC)
From: [personal profile] as_me
Для обработки текстовых сканов есть неплохая свободная программа scantailor. Прежде чем использовать, лучше посмотреть обучающее видео.