Главная Файлы Форум Галерея Гостевая книга Обратная связь Карта сайта Поиск
 

 

Моё место работы

СитиСервис
  • Заправка и ремонт лазерных картриджей
  • Ремонт любых принтеров и копиров
  • Оригинальные и совместимые картриджи
  • Доставка бесплатно (от 2-х картриджей)
  • Накопительная система расчётов для корпоративных клиентов
Телефон
+7 (4722) 373-983
8-980-326-01-23
Адрес E-mail
mybelpost@gmail.com

Привет, Гость

Войти
Идентификация
Я забыл свой пароль
Регистрация

Разделы -> Статьи -> Linux - разное -> Сканирование из конс...

Сканируем из консоли Linux

Почему из консоли? Ведь есть XSANE!
-Потому, что в консоли можно организовать конвейер!

Мой скрипт обновлён 16.01.2016
Статья обновлена 05.10.2017 - в конце статьи опубликовал bash-скрипт сканирования документов на проходной от Александра.

Приступим.

Считаем, что сканер уже установлен...

Устанавливаем необходимые приложения (если сканер установлен, то эти приложения тоже должны стоять):

apt-get install sane sane-utils

Устанавливаем совершенно ненужное приложение beep (я его буду использовать для озвучки)

apt-get install beep

Далее ставим imagemagick (пригодится для манипуляций с графическими файлами)

apt-get install imagemagick

Собственно, это всё, что необходимо!

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

#! /bin/bash
# Данный сценарий предназначен для упрощённого сканирования.
# Скрипт нужно разместить в любом доступном для пользователя каталоге и сделать его исполнимым
# После этой процедуры можно добавлять кнопку запуска на панель GNOME или MATE если в этом есть необходимость.
# Скрипт "заточен" под сканер EPSON PREFECTION V10/100, т.е конвейер ищет epkowa
# Для использования скрипта с вашим сканером необходимо в строке
# device=$(scanimage -L | awk '{print $2}' | grep epkowa | sed "s/[\`']//g");
# заменить epkowa на вашу модель
# Чтобы узнать модель вашего сканера, дайте в консоли команду scanimage -L | awk '{print $2}'
#
# Разрешение в скрипте вписано исходя из возможностей сканера
# Узнать разрешение можно командой scanimage -d ваш_сканер --help
# соответственно, необходимо исправить скрипт в строке выбора зарешений


# Проверка наличия изпользуемых в скрипте приложений
if [[ ! -f $(which scanimage) ]] || [[ ! -f $(which convert) ]]; then

    zenity --error --title="Скрипт сканирования" --text="Не установлено приложение sane или imagemagick\n\nПопробуйте установить из репозитория\nнеобходимые приложения и повторите попытку\!" --timeout="5" &
    exit 0;

fi

zenity --info --title="Скрипт сканирования" --text="Ищу сканер\!" --width 250 & pid=$!

device=$(scanimage -L | awk '{print $2}' | grep epkowa | sed "s/[\`']//g");

# Убиваем zenity по PID
kill -9 $pid

if [[ $device != "" ]]; then

# Выбор разрешения (dpi)
    dpi=$(zenity --title "Скрипт сканирования" --text "Выбери разрешение изображения (dpi)\n" --height 230 --list --radiolist --column "Выбор" --column "dpi" True 300 False 600 False 800 False 1200);

    if [[ "$dpi" = "" ]]; then
        exit 0;
    fi

    if [ ! -d $HOME/scan_images ]; then
        mkdir $HOME/scan_images ;
    fi

# Циклическое сканирование
    iter=0;
    while [ $iter == 0 ]; do
        file_time=$(date +%d-%m-%Y_%H-%M-%S) ;

        scanimage --mode Color --resolution $dpi --device-name=$device > $HOME/scan_images/$file_time.pnm ;

        zenity --question --title="Скрипт сканирования" --text="Продолжить сканирование?" --width 320;
        iter=$?;

    done

# Выводим сообщение об этапе выполнения задания, чтобы не скучно было
    zenity --info --title="Скрипт сканирования" --text="Поиск и конвертирование отсканированных файлов\!" --width 320 & pid=$!

# Конвертирование всех pnm из каталога $HOME/scan_images/ в jpg
    find $HOME/scan_images/ -maxdepth 1 -name "*.pnm" | while read ifile; do convert $ifile ${ifile%%.pnm}.jpg; done

# Удаляем все pnm в кателоге $HOME/scan_images
    rm $HOME/scan_images/*.pnm ;

# Убиваем сообщение zenity по PID для вывода следующего сообщения
    kill -9 $pid

# Сообщаем о том, где будут лежать отсканированные файлы
    zenity --info --title="Скрипт сканирования" --text="Все файлы сохранены в\n\n$HOME/scan_images" --width 320 --timeout="5" &

else

# Если сканер не обнаружен
    zenity --error --title="Скрипт сканирования" --text="Сканер не подключен\!" --width 280 --timeout="5" &

# Ни и для шику пищим системным биппером (необходимо установленное приложение beep)
    if [[ -f $(which beep) ]]; then
        beep -f 440,00 -l 100 ;
        beep -f 391,99 -l 100 ;
        beep -f 261,63 -l 100 ;
        beep -f 1 -l 1000 ;
    fi
fi
exit 0 ;

Что он делает?

Сначала проверяет наличие используемых приложений
За тем, проверяет наличие сканера.
Если он не подключен, то выводит соответствующее сообщение и благополучно завершает свою работу.
Если сканер подключен, то выводится запрос на ввод DPI (по умолчанию устанавливается 300dpi - оптимально для распознавания в Debian-6 c cuneiform-1.1.0). После этого создаётся каталог "scan_images" в домашней директории текущего пользователя (если его ещё нет).
Далее запускается программа scanimage - сканирует и сохраняет полученный файл в созданный каталог.
Файл сохраняется в формате pnm, что не совсем удобно для дальнейшего использования, поэтому
заставляем приложение convert преобразовать pnm в jpg. И сохраняем полученное изображение в тот же каталог,
но с именем, которое соответствует текущим дате и времени. Затем "подчищаем хвосты" - удаляем ненужный
файл pnm. Ну и последнее - это выводим сообщение о завершении работы и озвучиваем финал.

Как пользоваться скриптом?

Сохраняем скрипт в любом доступном месте с любым именем.
Делаем его исполнимым.
Запускаем из консоли или создаём кнопку запуска сценария.
Вот собственно и всё!

PS: Забыл важную вещь!
Дать права на выполнение скрипта можно из консоли скомандовав вот так:

chmod 755 /путь/к_скрипту

Теперь можно сканировать с минимальным нажатием кнопок!

Скрипт для сканера EPSON PERFECTION V10 можно скачать здесь. При небольшой доработке его можно использовать и для других сканеров.


Что делать если после сканирования имеем пустой каталог ~/scan_images



В Debian-7.3 Wheezy замечена некорректная работа утилиты convert (версию imagemagick сейчас сказать не могу - работаю в Debian-6).
Проверьте из косоли дав команду:

convert /путь_к_файлу.pnm /путь_к_выходному.jpg

если выдаст ошибки очень похожие на эти:

convert.im6: unable to read image data `tmp.pnm' @ error/pnm.c/ReadPNMImage/907.
convert.im6: missing an image filename `tmp.png' @ error/convert.c/ConvertImageCommand/3016.

 то нужно в скрипте заменить строку

convert  ~/scan_images/tmp.pnm ~/scan_images/$file_time.jpg ;

на

pnmtojpeg ~/scan_images/tmp.pnm ~/scan_images/$file_time.jpg ;

Так будет работать - проверил!


Bash-скрипт для сканирования документов от Александра (см. в комментариях)


Короткое описание от ватора:

Перед запуском скрипта обязательно проверить выполнение нижеперечисленных требований !!!
Первый запуск - в консоли - для выявления возможных ошибок !!!

1.Требуются следующие установленные пакеты с зависимостями:
  libnotify-bin
  zenity
  xsane, sane
  ImageMagick
  tesseract-ocr, tesseract-ocr-rus
  notify-osd

2. Подготовка скрипта к работе (задаем параметры и настройки):
  - Парамерт сканера "brand=": Набираем в консоли "scanimage -L" и выбираем имя нужного "device" (модель или драйвер).
  - Параметры сканера (разрешение, цветность, яркость, контрастность) может что-то не поддерживается, можно командой
    "scanimage -d epkowa --help" и подставить в параметры "dpi=", "mode=", "br=", "co".
  - Параметр "area=" определяет область сканирования (размеры документа) - подбирается эмпирически.
  - Параметры обрезки для распознавания (North,West,South,East) - подбираются эмпирически.
  - Параметр "viewer=". Набираем в консоли "xdg-mime query default image/jpeg" и получаем имя программы-просмотрщика.
  - Параметр "scans_dir=". Задаем путь к каталогу для отсканированных изображений.
  Команда "notify-send..." выдаёт собственное всплывающее уведомление из панели задач

3. Параметры и настройки:
  Параметры сканера (Паспорт, Права, на Пропуск)


#!/bin/bash

# Перед запуском скрипта обязательно проверить выполнение нижеперечисленных требований !!!
# Первый запуск - в консоли - для выявления возможных ошибок !!!

# 1.Требуются следующие установленные пакеты с зависимостями:
#   libnotify-bin
#   zenity
#   xsane, sane
#   ImageMagick
#   tesseract-ocr, tesseract-ocr-rus
#   notify-osd

# 2. Подготовка скрипта к работе (задаем параметры и настройки):
#   - Парамерт сканера "brand=": Набираем в консоли "scanimage -L" и выбираем имя нужного "device" (модель или драйвер).
#   - Параметры сканера (разрешение, цветность, яркость, контрастность) может что-то не поддерживается, можно командой 
#     "scanimage -d epkowa --help" и подставить в параметры "dpi=", "mode=", "br=", "co".
#   - Параметр "area=" определяет область сканирования (размеры документа) - подбирается эмпирически.
#   - Параметры обрезки для распознавания (North,West,South,East) - подбираются эмпирически.
#   - Параметр "viewer=". Набираем в консоли "xdg-mime query default image/jpeg" и получаем имя программы-просмотрщика.
#   - Параметр "scans_dir=". Задаем путь к каталогу для отсканированных изображений.
#   Команда "notify-send..." выдаёт собственное всплывающее уведомление из панели задач

# 3. Параметры и настройки:
  # Параметры сканера (Паспорт, Права, на Пропуск)
  #-----------------------------------------------------------------------------------------------------------------  
  #                                         Паспорт         Права стар.     Права нов.      Паспорт(на пропуск)
  #-----------------------------------------------------------------------------------------------------------------
  brand="epkowa"        # марка сканера     epkowa          epkowa          epkowa          epkowa  
  dpi="300"             # разрешение        300             300             300             300    
  mode="Gray"           # цветность         Gray            Gray            Gray            Color  
  br="30"               # яркость           10              30              30              0  
  co="60"               # контрастность     70              60              60              0
  area="-x 175 -y 130"  # область сканир.   -x 175 -y 130   -x 55 -y 85     -x 55 -y 85     -x 175 -y 130  
  #-----------------------------------------------------------------------------------------------------------------
  
  # Обрезка для распознавания фамилии, в пикселях (для dpi="300"!!!)
  #-----------------------------------------------------------------------------------------------------------------
  North="1160"          # сверху            1160            195             160             1190
  West="610"            # слева             610             535             350             610
  South="790"           # снизу             790             420             455             790
  East="280"            # справа            280             250             245             280
  #-----------------------------------------------------------------------------------------------------------------
  
  # Приложение-просмотрщик jpeg
  #-------------------------------------------------------------------
  viewer="gwenview"
    
  # Каталог для отсканированных изображений, строку всегда заканчивать символом /
  #-------------------------------------------------------------------
  scans_dir="$HOME/Scans/"
  #-------------------------------------------------------------------
  #-------------------------------------------------------------------

# 4.Создание каталога для отсканированных изображений если его нет 
if ! [ -d $scans_dir ]; then
        mkdir "$scans_dir"
        chmod 777 "$scans_dir"
        echo "Создаю $scans_dir"
fi


var_y=$(date +%Y)
var_m=$(date +%m)
var_d=$(date +%d)

file_time=$(date +%Y.%m.%d_%H.%M.%S)

 
# 5.Проверка наличия изпользуемых в скрипте приложений
if [[ ! -f $(which scanimage) ]] || [[ ! -f $(which convert) ]]; then
    echo "Нет sane или imagemagick"
    notify-send -c info -i "$scans_dir"xsane-no.png "Нет sane или imagemagick" ;
    exit 0;
fi
 

# 6.1.Если файл ".scaner" с предварительно определённым араметром "device" не найден
if ! [ -f "$scans_dir"'.scaner' ]; then


    # Ищем сканер
    echo "Поиск сканера..."
    notify-send -c info -i $HOME/Scans/xsane-64x64.png "Поиск сканера..." ;
    scaners=$(scanimage -L | grep device | grep $brand)
    
    # Убираем из названия всё, кроме первых двух слов
    device=$(echo $scaners | awk '{print $2}' | sed "s/[\`']//g" )
    echo "Найден сканер " $device
        
    # Пересоздаем файл ".scaner" с правильным параметром "device", если значение "device" не пустое
        if [[ $device != "" ]]; then
        echo "$device" > "$scans_dir".scaner
        fi
fi


# 6.2.Если файл ".scaner" найден, берем параметр "device" из него
if [ -f "$scans_dir"'.scaner' ]; then
    echo "Сканер определён заранее содержимым файла " "$scans_dir"'.scaner'
    device=$(cat "$scans_dir"'.scaner')
    echo "Сканер" $device   
fi
 
  
# 7.Если значение device не пустое, начинаем сканирование
if [[ $device != "" ]]; then
  
  echo "Сканирование..."
 
  # 7.1.Сканирование
    notify-send -c info -i "$scans_dir"xsane-64x64.png "Сканер" "Начинаю сканирование!" ;        
        scanimage --mode $mode --brightness $br --contrast $co $area --resolution $dpi --device-name=$device > /tmp/$file_time.pnm ;
    echo "Сканирование завершено"
    
        
    # Проверка удачного сканирования (полученный файл .pnm ненулевого размера)
    if ! [ -s /tmp/$file_time'.pnm' ]; then
      echo "Ошибка сканера"
      
          # Если полученный файл имеет нулевой размер, - переопределяем сканер
          echo "Переопределяю сканер"
          notify-send -c info -i "$scans_dir"xsane-64x64.png "Поиск сканера..." ;
          scaners=$(scanimage -L | grep device | grep $brand)
          
          # Убираем из названия всё, кроме первых двух слов
          device=$(echo $scaners | awk '{print $2}' | sed "s/[\`']//g" )
          echo "Найден сканер " $device
            
            # Пересоздаем файл ".scaner" с правильным параметром "device", если значение device не пустое
            if [[ $device != "" ]]; then
            echo "$device" > "$scans_dir".scaner
                
            else
        
            echo "Сканер не подключен"
            notify-send -c info -i "$scans_dir"xsane-no.png "Сканер не подключен" ;
     exit 0;        
            fi
        
        # Снова запускаем сканирование
        notify-send -c info -i "$scans_dir"xsane-64x64.png "Сканер" "Начинаю сканирование!" ;
        echo "Сканирование..."      
        scanimage --mode $mode --brightness $br --contrast $co $area --resolution $dpi --device-name=$device > /tmp/$file_time.pnm ;
        
        echo "Сканирование завершено"
    fi
    
        
  # 7.2.Конвертирование pnm в jpg в каталоге /tmp/ с поворотом на 270 град (паспорт поперёк для уменьшения впемени сканирования)
    echo "Конвертация в jpeg..."

    convert -rotate 270 /tmp/$file_time'.pnm' /tmp/$file_time'.jpeg'
    echo "Конвертация в закончена"
    
  # 7,3 Распознавание фамилии для вставки в диалоговое окно, как начальный текст
    # Для паспорта - скан поворачиваем, обрезаем всё вокруг фамилии, сохраняем в .tif
    convert -rotate 270 -gravity NorthWest -chop "$West"x"$North" -gravity SouthEast -chop "$East"x"$South" /tmp/$file_time'.pnm' /tmp/$file_time'.tif'
    # обработка изображения для распознавания (высветление)
    convert /tmp/$file_time'.tif' \( +clone -blur 0x20 \) -compose Divide_Src -composite /tmp/$file_time'1''.tif'
    # обработка изображения для распознавания (шумоподавление с радиусом 3)
    #convert  /tmp/$file_time'1''.tif' -noise 3 /tmp/$file_time'2''.tif'
    # распознаём
    tesseract /tmp/$file_time'1''.tif' /tmp/text -l rus
    # присваиваем переменной "a" значение распознанного текста для дальнейшей подстановки в окно zenity
    a=$(cat /tmp/text.txt)
    
        
            ### Открытие отсканированного изображения системным просмотрщиком и задерживаем дальнейшее выполнение на 1с
                xdg-open /tmp/$file_time'.jpeg'
                sleep 1
          
        
    # Вносим информацию о посетителях в названия jpeg-файлов и текстовый  csv-файл:
        
        # Открытие диалогового окна для внесения Фамилии (распознаный вариант подставлен "$a")
        # Для этого организуем цикл - возврат в начало если поле ввода не заполнено.
        
        # вводим переменные: n-вывод команды zenity, n1-"n"(без последних 2х символов), n2-последний символ "n"
        # (вывод команды zenity (для step1 и аналогично для step2,step3):
        #                   текст(в поле ввода)             нет текста          нажата отмена
        #-------------------------------------------------------------------------------------
        #                   n1=     текст-пробел-0          пусто-пробел-0      пусто
        #                   n1=     текст                   пусто               пусто
        #                   n2=     0                       0                   пробел
        #-------------------------------------------------------------------------------------
        # функция "step1"- задание n значения окна zenity и для организации цикла while (нач.значение n2="0")
        n2="0"
        step1()
        {               
        n=$(if zenity --entry --title="Информация о посетителе" --text="Фамилия, Имя, Отчество посетителя:" \
                        --width=400 --height=100 \
                        --entry-text="$a"
            then echo $?             
            fi)
            
            n1=${n%??}   # без последних двух символов (значение "n"- текст-пробел-0) 
            n2=$(echo "cut last 1 "$n"" | rev | cut -c -1 | rev) # последний символ (0 или пусто-при отмене)
         }
         # Организуем цикл по условиям n1-пустое, n2=0 (возврат к zenity - если не введен текст, выход - если нажата "отмена")
         while [[ $n1 = "" && $n2 = "0" ]]
         do
         step1
         done
         
         # Если текст введен, идём дальше, если нажата отмена - удаляем временные файлы и завершаем скрипт
         if [ "$n2" = "0" ]
         then echo "непусто"
         else
         echo "Удаление временных файлов .pnm, .tif, .txt, .jpeg и выход"
            rm /tmp/$file_time'.pnm';
            rm /tmp/*'.pnm';
            # Удаляем .tif и .txt файлы из /tmp
            rm /tmp/$file_time'.tif';
            rm /tmp/$file_time'1''.tif';
            #rm /tmp/$file_time'2''.tif';
            rm /tmp/text.txt;
            rm /tmp/$file_time'.jpeg';
            ### Закрытие отсканированного изображения, открытого системным просмотрщиком
              # Определяем какой программой система тркрывает "image/jpeg", отбрасываем расширение и убиваем процесс
                #def=$(d=$(xdg-mime query default image/jpeg); echo ${d%.*})      
                #killall "$def"                                 # не работает в Debian9 (определяется "org.kde.gwenview.desktop")
                killall $viewer                                 # поэтому убиваем процесс по заранее определенному имени "viewer"
            notify-send -c info -i "$scans_dir"xsane-64x64.png "Отмена сканирования!" ;
            exit ;       
         fi      
        
        # получаем значение "name", отбросив из значения "n" всё кроме первого слова (наша фамилия)
        name=${n%??} #(echo $n | awk '{print $1}' | sed "s/[\`']//g")       
        echo $name
            
            
        # Открытие диалогового окна для выбора корпуса b= (Ж, К, Скл)
        # вводим переменные: b-вывод команды zenity, b1-"b"(без последнего символа), b2-последний символ "b"
        # функция "step2"- задание b значения окна zenity и для организации цикла while (нач.значение b2="0")
        b2="0"
        step2()
        {
        b=$(if zenity --list --title="Информация о посетителе" \
            --text="Выберите корпус:" \
            --column="Корпус"  --column="Название" --hide-header --width=300 --height=150 \
              К-  "Красный корпус" \
              Ж- "Желтый корпус" \
              Скл "Склад"       
           
            then echo $?
            fi)

        b1=${b%?}   # без последнего символа (значение "b"- текст-пробел-0) (работает только без одного -???) 
        b2=$(echo "cut last 1 "$b"" | rev | cut -c -1 | rev) # последний символ (0 или пусто-при отмене)
        b3=${b%??}  # без последних 2-х символов (значение "b"- текст-пробел-0) - для получения "build"
        }
        # Организуем цикл по условиям b1-пустое, b2=0 (возврат к zenity - если не введен текст, выход - если нажата "отмена")
        while [[ $b1 = "" && $b2 = "0" ]]
        do
        step2
        done
        
        # Если текст введен, идём дальше, если нажата отмена - удаляем временные файлы и завершаем скрипт
        if [ "$b2" = "0" ]
        then echo "непусто"
        else
        echo "Удаление временных файлов .pnm, .tif, .txt, .jpeg и выход"
        rm /tmp/$file_time'.pnm';
            rm /tmp/*'.pnm';
            # Удаляем .tif и .txt файлы из /tmp
            rm /tmp/$file_time'.tif';
            rm /tmp/$file_time'1''.tif';
            #rm /tmp/$file_time'2''.tif';
            rm /tmp/text.txt;
            rm /tmp/$file_time'.jpeg';
            ### Закрытие отсканированного изображения, открытого системным просмотрщиком
              # Определяем какой программой система тркрывает "image/jpeg", отбрасываем расширение и убиваем процесс
                #def=$(d=$(xdg-mime query default image/jpeg); echo ${d%.*})      
                #killall "$def"                                 # не работает в Debian9 (определяется "org.kde.gwenview.desktop")
                killall $viewer                                 # поэтому убиваем процесс по заранее определенному имени "viewer"
            notify-send -c info -i "$scans_dir"xsane-64x64.png "Отмена сканирования!" ;
            exit ;       
        fi
        
        # получаем значение "build", (корпус) отбросив из значения "b3"("b"без последних двух символов) всё, 
        # справа от регулярного выражения "|" (т.к. при нажатии enter, n=Ж|Ж, а при нажатии мышкой n=Ж)
        build=${b3%|*}      
        echo $build
        
                
        # Открытие диалогового окна для внесения №№-офиса
        # вводим переменные: of-вывод команды zenity, of1-"of"(без последних 2х символов), of2-последний символ "of"
        # функция "step3"- задание of значения окна zenity и для организации цикла while (нач.значение of2="0")
        of2="0"
        step3()
        {
        of=$(if zenity --entry --title="Информация о посетителе" --text="Номер офиса" \
                        --width=200 --height=100 \
                        --entry-text=""     
           
            then echo $?
            fi)

        of1=${of%??}   # без последних двух символов (значение "of"- текст-пробел-0)
        of2=$(echo "cut last 1 "$of"" | rev | cut -c -1 | rev) # последний символ (0 или пусто-при отмене)
        }
        # Организуем цикл по условиям of1-пустое, of2=0 (возврат к zenity - если не введен текст, выход - если нажата "отмена")
        while [[ $of1 = "" && $of2 = "0" ]]
        do
        step3
        done
        
        # Если текст введен, идём дальше, если нажата отмена - удаляем временные файлы и завершаем скрипт
        if [ "$of2" = "0" ]
        then echo "непусто"
        else
        echo "Удаление временных файлов .pnm, .tif, .txt, .jpeg и выход"
        rm /tmp/$file_time'.pnm';
            rm /tmp/*'.pnm';
            # Удаляем .tif и .txt файлы из /tmp
            rm /tmp/$file_time'.tif';
            rm /tmp/$file_time'1''.tif';
            #rm /tmp/$file_time'2''.tif';
            rm /tmp/text.txt;
            rm /tmp/$file_time'.jpeg';
            ### Закрытие отсканированного изображения, открытого системным просмотрщиком
              # Определяем какой программой система тркрывает "image/jpeg", отбрасываем расширение и убиваем процесс
                #def=$(d=$(xdg-mime query default image/jpeg); echo ${d%.*})      
                #killall "$def"                                 # не работает в Debian9 (определяется "org.kde.gwenview.desktop")
                killall $viewer                                 # поэтому убиваем процесс по заранее определенному имени "viewer"
            notify-send -c info -i "$scans_dir"xsane-64x64.png "Отмена сканирования!" ;
            exit ;       
        fi
        
        # получаем значение "office", отбросив из значения "of" всё кроме первого слова (№-офиса)
        office=$(echo $of | awk '{print $1}' | sed "s/[\`']//g")        
        echo $office
                
                
        
            ### Закрытие отсканированного изображения, открытого системным просмотрщиком
              # Определяем какой программой система тркрывает "image/jpeg", отбрасываем расширение и убиваем процесс
                #def=$(d=$(xdg-mime query default image/jpeg); echo ${d%.*})      
                #killall "$def"                                 # не работает в Debian9 (определяется "org.kde.gwenview.desktop")
                killall $viewer                                 # поэтому убиваем процесс по заранее определенному имени "viewer"
            
            
                    
        # Формируем имя файла из времени, имени, здания и №-офиса
        file_name="$file_time","$build""$office","$name"
        echo $file_name
                    
        # Создаём в папке назначения текстовый файл Посетители.csv и вписываем построчно информацию о посетителях
        echo "$file_name" >> "$scans_dir"$var_y'/'Посетители.csv
        # Переименовываем jpeg-вайл -вносим данные о посетителе
        mv /tmp/"$file_time"'.jpeg' /tmp/"$file_name"'.jpeg'
    
    # Удаление временных файлов
    # Удаляем pnm в каталоге /tmp, заодно и все образовавшиеся pnm-файлы
    echo "Удаление временных файлов .pnm, .tif, .txt"
        rm /tmp/$file_time'.pnm';
        rm /tmp/*'.pnm';
        # Удаляем .tif и .txt файлы из /tmp
        rm /tmp/$file_time'.tif';
        rm /tmp/$file_time'1''.tif';
        #rm /tmp/$file_time'2''.tif';
        rm /tmp/text.txt;
 
    echo "Перемещение файлов"

  # 7.4.Создание подкаталогов если их нет и перемещение туда jpeg-файлов из /tmp
    # До года. То, что с месяцем и числом - закомментировано
    if ! [ -d "$scans_dir"$var_y ]; then
        mkdir "$scans_dir"$var_y
        chmod 777 "$scans_dir"$var_y
    fi
#   if ! [ -d "$scans_dir"$var_y$'/'$var_m ]; then
#       mkdir "$scans_dir"$var_y$'/'$var_m
#       chmod 777 "$scans_dir"$var_y$'/'$var_m
#   fi
#   if ! [ -d "$scans_dir"$var_y$'/'$var_m'/'$var_d ]; then
#       mkdir "$scans_dir"$var_y$'/'$var_m'/'$var_d
#       chmod 777 "$scans_dir"$var_y$'/'$var_m'/'$var_d
#   fi
    
#   cp /tmp/$file_time'.jpeg' "$scans_dir"$var_y'/'$var_m'/'$var_d'/'
    cp /tmp/"$file_name"'.jpeg' "$scans_dir"$var_y'/'
#   chmod 777 "$scans_dir"$var_y'/'$var_m'/'$var_d'/'$file_time'.jpeg'
    chmod 777 "$scans_dir"$var_y'/'"$file_name"'.jpeg'
    rm -f /tmp/$file_time'.jpeg'
    rm -f /tmp/"$file_name"'.jpeg'
#   notify-send -c info -i "$scans_dir"xsane-64x64.png "Завершено, помещено в" "$scans_dir"$var_y'/'$var_m'/'$var_d'/' ;
    notify-send -c info -i "$scans_dir"xsane-64x64.png "Завершено, помещено в" "$scans_dir"$var_y'/' ;
    
else

 
  # 7.5.Если сканер не обнаружен
    echo "Сканер не подключен"
    notify-send -c info -i "$scans_dir"xsane-no.png "Сканер не подключен" ;
 
  # 7.6.Ну и для шику пищим системным биппером (необходимо установленное приложение beep)
    if [[ -f $(which beep) ]]; then
        beep -f 440,00 -l 100 ;
        beep -f 391,99 -l 100 ;
        beep -f 261,63 -l 100 ;
        beep -f 1 -l 1000 ;
    fi
fi

# 8 Удаление файлов и записей в "Посетители.csv" двухмесячной давности 
    var_ym2=$(date -d "-2 month" +%Y.%m)  # Задаём значение "год.месяц" минус 2 месяца от текущей даты      
    find $scans_dir$var_y/* -type f -name "$var_ym2.*" -delete      # Удаляем файлы по маске "$var_ym2.*"
    sed -i -e "/$var_ym2/d" $scans_dir$var_y'/'Посетители.csv       # Удаляем строки в файле Посетители.csv по маске "$var_ym2.*"

#echo "Завершено, файлы находятся в каталоге " "$scans_dir"$var_y'/'$var_m'/'$var_d'/'
# сокращено до "$scans_dir"$var_y'/'
echo "Завершено, файлы находятся в каталоге " "$scans_dir"$var_y'/'
exit 0 ;

Данный сценарий опубликован как есть - однако, из-за текстового редактора применяемого в этой CMS в вышеприведённом листинге могут быть ошибки!
А потому, этот же bash-скрипт можно скачать в архиве здесь!



Опубликовано: foxadmin, Автор/источник: Сакрюкин К.В. 30 Январь 2012 21:00:38

Комментировать

Вы не залогинены! Регистрация

Комментарии

Страницы: 
[02:16:21 06.10.2017] Опубликовано Константин
foxadmin
Доброго здоровья, Александр!
Я сейчас увлёкся БПЛА (коптерами в частности) - устал от печатающих машинок!
Собрал гексакоптер, сезон отлетал, угрохал аккумулятор и теперь появилось время (пока жду из поднебесной новый) для изучения AVR возможно и ARM контроллеров.
(На ARM собран мой полётный контроллер).
Изучаю методы их программирования, конечно же питоном и OpenCV в них и не пахнет, однако есть такая штука как бортовой компьютер работающий в паре с полётным контроллером! И вот уже этот бортовой комп может и Python, и OpenCV для анализа потокового видео и облёта препятствий или чего-то ещё, т.к. там можно полноценную Linux поднять (кстати в полётнике на ARM работает NuttX - юникс-подобная система реального времени).
Но пока что до библиотек обработки изображений я не дошёл.

Ваш bash-скрипт публикую листингом в статье и ниже даю ссылочку на его скачивание в виде "как есть"!
[01:00:14 04.07.2017] Опубликовано Константин
foxadmin
Доброго здоровья, Александр!
Извините, что отвечаю не сразу - сейчас редко бываю на своём сайте в силу некоторых причин.
Однако, Ваш скрипт под Ваши задачи я с удовольствием опубликую здесь.
Перешлите на whitepost с подробным описанием и я его закину в раздел bash-скриптов, а ссылку с описанием дам в этой статье.
[20:29:06 23.06.2017] Опубликовано Александр
No avatar
Мне очень помогла Ваша статья. Задача была сделать пропускной пункт со сканированием паспортов, водительских удостоверений или других документов посетителей и ведением простейшей базы данных. Я допилил скрипт под задачу. Теперь сканер находится и запоминается, что сокращает время сканирования, а если меняется имя сканера - автоматически корректируется, распознаётся фамилия и подставляется в окно zenity а также удаляются сканы двухмесячной давности, чтобы хоть как-то соблюсти закон о персональных данных. Планирую ввести распечатку бланка (чека на подпись) для получения согласия с обработкой персональных данных. В блоке, где задаются параметры, описаны варианты для сканирования паспорта РФ, прав новых и старых. Скрипт отправлю на электронный адрес. Если заинтересует, разместите на сайте - вдруг кому пригодится, а то коммерческие решения весьма дороги. У меня уже функционирует на КПП неделю, выявляю недостатки.
Страницы: 

Афоризмы, мысли

"Компьютер упрощает жизнь только в тех случаях, в которых без него можно легко обойтись!"

/*****./

Счётчик

Сейчас на сайте - 1 (0 зарег.)
Всего хитов9065 
Сегодня хитов9065 
Сегодня хостов1357 

Откуда гости наши?

 
Powered by ReloadCMS 1.5.0.
© 2004-2012 ReloadCMS Team
RSS AggregationPHP powered
Генерация страницы: 0.56
  Яндекс.Метрика
    Сакрюкин К.В.   Яндекс цитирования    
 
Здесь всё можно копировать и цитировать, но рабочая ссылка на мой сайт обязательна!