Распознавание пакета отсканированных документов и изображений
Author
NMitin
Date Published

Инструкция только для ОС Linux (выполнялось на MX-23.6_KDE)
Такая необходимость возникает, когда нужно проанализировать с помощью ИИ массу документов, а они в виде картинок или сканов.
Предварительно просмотреть все файлы на предмет перевернутых, они могут не распознаться. Если они важны, то надо перевернуть изображение и сохранить в нормальном виде.
Нужно установить программу распознавания Tesseract OCR и локализацию для текста на русском языке:
1sudo apt install tesseract-ocr tesseract-ocr-rus
Протестировать на одном из документов (рисунок, не pdf)
1tesseract input.jpg output -l rus
Это создаст файл output.txt с распознанным текстом из input.jpg, если все устраивает, идем дальше. Если нет, можно поиграть ключами. Используется утилита convert из пакета ImageMagick, практически у всех пользователей линукс уже установлен, если нет , то надо установить.
1convert input.jpg -contrast-stretch 0.5% clean.jpg2tesseract clean.jpg output -l rus
Если текст мелкий, можно увеличить изображение:
1convert input.jpg -resize 200% resized.jpg2tesseract resized.jpg output -l rus
С изображениями закончили, далее файлы pdf (сканы). Их нужно предварительно конвертировать в картинки. Если не установлена утилита poppler-utils, устанавливаем:
1sudo apt install poppler-utils
в ее составе есть конвертер "pdftoppm -png"
Далее создаем скрипт на bash для пакетной обработки всех файлов, он сначала преобразует pdf в картинки, а затем будут распознаны в текст. Выходной файл создается в формате JSON "fileName": "content".
1#!/usr/bin/env bash2set -euo pipefail34SRC_DIR="/home/you/images"5DST_FILE="/home/you/results.json"6LANG="rus"78mkdir -p "$(dirname "$DST_FILE")"9echo "[" > "$DST_FILE"10first=true1112find "$SRC_DIR" -type f \13 \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \14 -o -iname '*.tif' -o -iname '*.tiff' -o -iname '*.pdf' \) \15 -print0 | while IFS= read -r -d '' file; do1617 base=$(basename "$file")18 name="${base%.*}"19 echo "→ Обрабатываю $base …"2021 # Если PDF — сначала вынимаем страницы в PNG22 if [[ "${file,,}" == *.pdf ]]; then23 tmpd=$(mktemp -d)24 # конвертация всех страниц в tmpd/page-*.png25 pdftoppm -r 300 "$file" "$tmpd/page" -png26 text=""27 for img in "$tmpd"/page-*.png; do28 text+=$(tesseract "$img" stdout -l "$LANG")29 text+=$'\n'30 done31 rm -rf "$tmpd"32 else33 # обычное изображение34 text=$(tesseract "$file" stdout -l "$LANG")35 fi3637 # Экранируем JSON-строку38 text_json=$(jq -Rsa . <<< "$text")3940 # разделитель41 if $first; then first=false; else echo "," >> "$DST_FILE"; fi4243 printf '{"file":"%s","text":%s}' "$base" "$text_json" >> "$DST_FILE"44done4546echo "]" >> "$DST_FILE"47echo "✅ Готово — результат в $DST_FILE"48
Здесь в начале скрипта меняем две переменные на свои:
SRC_DIR="/home/you/images"
DST_FILE="/home/you/results.json"
Делаем скрипт исполняемым и выполняем :
1chmod +x ocr_to_json_recursive.sh2./ocr_to_json_recursive.sh
Скрипт рекурсивно найдёт и JPG/JPEG/PNG/TIFF/PDF.
Для PDF конвертирует страницы в PNG и распознаёт каждую.
Сгенерирует единый results.json с именами и текстом.
У меня машинка довольно мощная, быстро отработал, несколько минут.
Текст в JSON будет в виде символов unicode, как в шапке этого сообщения.
Для LLM (искусственного интеллекта) это не важно, он прочитает без проблем. Если хотите сделать читаемым для человека, то процесс продолжается.
Сначала установим утилиту jq
1sudo apt install jq
Если выполнять в той же папке, где файл для преобразования, то выполнить:
1jq '.' ./results.json > results_readable.json2
иначе подставить правильный путь к файлам.
Все, вот это results_readable.json и есть заветная цель. Можно читать людям и машинам :).