Сканер в Linux обычно работает сразу после подключения, но получить из бумажного документа аккуратный PDF с текстовым слоем — отдельная задача. Здесь участвуют три части: SANE находит устройство и снимает изображение, Tesseract распознаёт текст, OCRmyPDF собирает результат и приводит его к архивному виду. Разберём связку на реальном рабочем процессе.
Кто за что отвечает
- sane-backends — набор драйверов для USB- и сетевых сканеров.
- sane-airscan — драйвер eSCL и WSD, работает с большинством сетевых МФУ без проприетарного софта.
- scanimage — консольный клиент SANE, снимает изображения и умеет пакетный режим.
- tesseract — движок распознавания и языковые пакеты.
- ocrmypdf — обёртка, которая добавляет текстовый слой, выравнивает и чистит страницы.
- img2pdf — собирает PDF из картинок без пережатия.
Для сетевого МФУ, выпущенного после примерно 2015 года, чаще всего достаточно sane-airscan: протокол eSCL поддерживают большинство моделей Brother, Canon, Epson и HP, а также часть Kyocera. Для старых USB-моделей нужен конкретный бэкенд — genesys, pixma, epkowa; какой именно, подскажет sane-find-scanner и список поддерживаемых устройств.
Проверка обнаружения
Начните с диагностики: если устройство не видно, никакие параметры OCR не помогут. Сетевой сканер должен быть в той же подсети, а брандмауэр — не блокировать обнаружение.
scanimage -L
sudo sane-find-scanner
airscan-discover
lsusb | grep -i -E "scanner|canon|epson|hp"
Пустой вывод scanimage -L при работающем lsusb почти всегда означает права доступа. Добавьте пользователя в группы scanner и plugdev и перезайдите в сеанс — членство в группе не применяется к уже открытой сессии.
sudo usermod -aG scanner "$USER"
sudo usermod -aG plugdev "$USER"
groups | grep -E "scanner|plugdev"
Тестовый снимок
Прежде чем строить конвейер, снимите одну страницу и посмотрите на результат. --test проверяет связь с устройством, -A выводит список доступных опций: источники, режимы, разрешения.
scanimage --test
scanimage --format=png --resolution=300 --mode=Gray -o test.png
scanimage -A | head -40
identify test.png
В списке опций ищите --source: значения вроде Flatbed, ADF, ADF Duplex означают планшет, автоподатчик и двусторонний автоподатчик. Если нужного источника нет, драйвер его не поддерживает — проверьте модель в документации SANE.
Пакетный скан с автоподатчика
Для многостраничного документа используйте пакетный режим: scanimage сам пронумерует файлы. Разрешение 300 dpi и градации серого — оптимум для текста; цветной режим нужен только для печатей, схем и фотографий.
scanimage --source "ADF Duplex" --mode Gray --resolution 300 \
--format=png -x 210 -y 297 \
--batch=scan-%03d.png --batch-start=1
img2pdf scan-*.png -o raw.pdf
pdfinfo raw.pdf | grep Pages
Флаг --batch-prompt ждёт нажатия Enter перед каждой страницей — это для планшетного сканера, когда листы кладут вручную. С автоподатчиком он только мешает. Если сканер захватил лист косо, пересканируйте страницу: выравнивание на этапе OCR исправляет небольшой перекос, но не залом.
Двусторонний автоподатчик часто добавляет пустые обороты у документов, напечатанных на одной стороне. Их лучше убрать до сборки PDF: распознавание пустого листа тратит время, а в архиве появляются страницы без содержания. Среднюю яркость изображения легко оценить через ImageMagick из одноимённого пакета: почти белый лист даёт значение около единицы.
for f in scan-*.png; do
printf "%s %s\n" "$f" "$(magick "$f" -colorspace Gray -format "%[fx:mean]" info:)"
done
Порог зависит от сканера и фона: для чистого белого листа подходит 0,97–0,99. Проверьте несколько значений глазами, прежде чем удалять файлы, и оставляйте исходники до финальной проверки — автоматика иногда принимает за пустую страницу бледную печать.
Распознавание текста
OCRmyPDF добавляет невидимый текстовый слой поверх изображения, поэтому внешний вид страницы не меняется. Проверьте, что установлен русский языковой пакет: без него распознавание молча выдаст пустой результат.
sudo apt install tesseract-ocr tesseract-ocr-rus ocrmypdf
tesseract --list-langs
ocrmypdf -l rus+eng --deskew --clean --rotate-pages \
--output-type pdfa-2 --jobs 4 raw.pdf out.pdf
Разберём флаги. --deskew выравнивает перекос, --clean убирает шум и точки, --rotate-pages определяет ориентацию, --output-type pdfa-2 даёт формат для долгого хранения, --jobs задаёт число параллельных процессов. Для частично распознанного документа пригодится --skip-text, для испорченного слоя — --redo-ocr, для отдельного текстового файла — --sidecar.
Проверка качества
Не отправляйте документ в архив, не заглянув в текстовый слой. Быстрая проверка занимает секунды и выявляет пустые или перекошенные страницы.
pdftotext -f 1 -l 1 out.pdf - | head -30
pdfinfo out.pdf | grep -E "Pages|Page size|File size"
pdffonts out.pdf
tesseract page.png - -l rus --psm 6 | head -20
Пустой вывод pdftotext означает, что слой не создан: проверьте язык, права на файл и не защищён ли исходник. «Мусорный» текст обычно говорит о шуме, сильном перекосе или неправильном режиме сегментации — попробуйте --psm 6 для страницы как единого блока или --psm 4 для колонок. pdffonts показывает, что в документе появился шрифт текстового слоя.
Организация архива
Когда страниц много, ручное переименование становится источником ошибок. Простой скрипт раскладывает результаты по годам, сохраняет текстовую версию рядом и считает контрольную сумму.
#!/usr/bin/env bash
set -euo pipefail
src="$1"
base="$(basename "${src%.*}")"
out="$HOME/scans/$(date +%Y)"
mkdir -p "$out"
ocrmypdf -l rus+eng --deskew --clean --rotate-pages \
--sidecar "$out/$base.txt" --output-type pdfa-2 "$src" "$out/$base.pdf"
sha256sum "$out/$base.pdf" >> "$out/checksums.sha256"
Для поиска по архиву достаточно pdfgrep или полнотекстового индекса. Если документов станут тысячи, имеет смысл передать каталог в Paperless-ngx — но это отдельный уровень, а не замена описанному конвейеру.
Чек-лист
- Сканер виден в scanimage -L, пользователь в группах scanner и plugdev.
- Источник (Flatbed или ADF) выбран явно, разрешение 300 dpi.
- Пакетный скан пронумерован, страницы не перепутаны.
- Установлен языковой пакет tesseract-ocr-rus.
- Выполнены —deskew, —clean и —rotate-pages.
- Текстовый слой проверен через pdftotext, файл сохранён как PDF/A.
- Исходные изображения сохранены отдельно от результата.
Итог
Связка SANE и OCR превращает сканер в источник нормальных документов, а не картинок. Ключевые решения просты: sane-airscan для сетевого МФУ, 300 dpi в сером режиме, пакетный скан с автоподатчика, OCRmyPDF с выравниванием и PDF/A на выходе. Проверка текстового слоя через pdftotext должна стать привычкой — она ловит почти все ошибки до того, как документ уйдёт в архив.