Формулировка проблемы: текущая возможность сканирования реализована через java-апплет, который на данный момент блокируется в большинстве популярных браузерах.
Используются: Проекты -> Детали проекта; Хранилище; Потоки работ -> Приложения, Прочие.
Решение: Реализовать возможность сканирования через пользовательский агент Synergy (только для ОС Windows).
Добавить в агент возможность обрабатывания post-запросов на URL
"/scan" с параметром TYPE
, имеющим
следующие значения:
запускает окно сканирования в пользовательском агенте Synergy;
запрашивает статус сканирования;
получает информацию о формате, в котором необходимо получить файлы, а также сами файлы;
и параметром url
, имеющим значение URL, из
которого был вызван агент в формате: "%адрес%/Synergy/".
Например:
http://192.168.2.203:8389/scan?TYPE=SCAN&url=http://192.168.3.117:8080/Synergy/
На запросы с типами SCAN
и
STATE
агент возвращает JSON с полем
state
, которое сообщает о статусе сканирования и
имеет следующие варианты значений:
READY
- агент готов начать сканирование;
SCANNING
- агент находится в режиме
сканирования;
CANCELED
- сканирование отменено, если
пользователь закрыл окно сканирования либо нажав на кнопку
"Закрыть", либо воспользовавшись системными
возможностями закрытия окна (ALT+F4, кнопка закрытия -
"крестик");
SAVED
- пользователь закончил сканирование и
сохранил результат работы в нужном ему формате, нажав кнопку
"Сохранить" и "ОК" в появившемся диалоговом
окне сохранения.
На запрос с типом INFO
агент возвращает JSON со
следующими полями:
state
- значение поля:
SAVED
;
name
- название в строковом формате;
mime
- формат сохраняемых файлов. Один из
следующих вариантов:
application/pdf
image/jpeg
image/png
files
- массив ссылок на файлы, сохраненных
на сервере Synergy;
Примеры запросов и ответов на них:
Пример запроса
POST /scan HTTP/1.1 Host: localhost:8389 Cache-Control: no-cache Content-Type: application/x-www-form-urlencoded TYPE=INFO url=http://192.168.3.117:8080/Synergy/
Пример ответа агента на запрос типа STATE
:
{ "state": "SCANNING" }
Пример ответа агента на запрос типа INFO
, в
котором файл передается в pdf формате:
{ "state": "SAVED", "name": "Документ", "mime": "application/pdf" "files": [ "/var/tmp/synergy/ai/c71864b5-f9f9-4361-8c9b-eeab4d1eef4a/pdf.pdf" ] }
Также в пользовательский агент необходимо добавить окно "Сканирование документа", реализация которого повторяет реализацию сканирования для апплета (но без кнопки "Показать стандартный диалог сканирования").
Основной поток событий:
Отправить запрос пользовательскому агенту с типом
SCAN
в случае, если
выбран пункт меню "Сканировать" в деталях проекта при добавлении файла и в открывшемся диалоговом окне нажата кнопка "Сканировать";
выбран пункт меню "Сканировать" в потоках работ при добавлении файла в разделы приложения и прочие и в открывшемся диалоговом окне нажата кнопка "Сканировать";
выбран пункт меню "Сканировать документ" в хранилище при создании файла;
нажата кнопка "Сканировать" при регистрации документа в хранилище.
Получить ответ со статусом SCANNING
(возможно
выполнение альтернативных потоков событий №1, №2).
Откроется окно "Сканирование документа" в пользовательском агенте Synergy, в котором пользователь может сканировать документы.
При этом система Synergy периодически (1 раз в 3 секунды)
отправляет запрос пользовательскому агенту с типом
STATE
(возможно выполнение альтернативных
потоков событий №3 и №4), ожидая завершения сканирования (смены
статуса в получаемом ответе со SCANNING
на
SAVED
).
На запрос с типом STATE
от системы
пользовательский агент ответит JSON со статусом
SAVED
после того, как пользователь сохранит
сканированные документы в необходимом формате в пользовательском
агенте. При этом агент будет ожидать запроса со статусом
INFO
.
Система отправляет запрос со статусом INFO
, в
ответ на который получает ссылки на файлы, которые необходимо
сохранить. Файлы (или файл) добавляются в необходимую директорию
в заданном формате. При этом пользователю выводится сообщение
(на голубом фоне): Документы добавлены
.
Правила именования файлов при сохранении сканированных документов:
При сохранении результатов сканирования необходимо для названий файлов проводить валидацию, т.е. проверять нет ли совпадающих файлов в директории, в которую будут вставляться файлы. При этом возможны 2 случая при сохранении файлов: сохранение в формате pdf и сохранение в виде изображений (jpeg, png).
При сохранении одного файла (pdf, jpeg или png) если в
директории назначения уже существует файл с таким же названием
что и был передан в параметре name
и с
одинаковым расширением, необходимо одновременно вывести
пользователю сообщение на красном фоне "Объект уже
существует" и диалоговое окно "Дайте название
файлу" с текстовым полем и кнопками "Принять" и
"Отмена" (диалоговое окно и правила валидации такие
же, как и в случае переименования файлов в деталях проекта),
которое будет позволять сохранить файл с другим названием.
"Отмена" - отсканированный файл не добавится.
При этом, в случае, когда конфликт совпадения имен возникает в мастере регистрации, необходимо оставить прежнюю реализацию, а именно выводить пользователю сообщение на красном фоне "Элемент с таким названием уже существует" без возможности переименования файла на лету.
Для нескольких файлов, сохраняемых в виде изображений (png или jpeg), необходимо присваивать названия в следующем формате:
%название_из_параметра_name% %номер_изображения%
т.е. для нескольких файлов с названием "Документ" сохранять файлы с названиями: "Документ 1", "Документ 2" и т.д.
Если при этом, совпадает одно из названий с номером (т.е. для нашего примера в текущей директории уже существует "Документ 2"), необходимо одновременно вывести пользователю сообщение (на красном фоне) "Объект уже существует" и диалоговое окно "Дайте название файлу" с текстовым полем и кнопками "Принять" и "Отмена", которое будет позволять сохранить файлы в следующем формате:
%название_из_диалога% %номер_изображения%
"Отмена" - данный отсканированный файл, у которого отменили переименование, не добавится. Проверка на совпадения названий продолжится.
Альтернативные потоки событий:
Альтернативный поток событий №1: В случае, если
система Synergy, отправив запрос с типом SCAN
, не
получает ответа (сервер пользовательского агента не отвечает в
течении 30 секунд), необходимо вывести диалоговое окно
"Внимание" с кнопками "ОК", "Обновить"
и текстом:
Для данного приложения ARTA Synergy не установлен, либо не запущен
пользовательский агент Synergy. Установите или запустите
агент и повторите попытку.
Для того, чтобы установить агент Synergy, скачайте
его для ОС, установленной на Вашем компьютере:
Windows
Debian/Ubuntu
где Windows
- ссылка на скачивание инсталлятора
для Windows, Debian/Ubuntu
- ссылка на скачивание
инсталлятора для Debian/Ubuntu.
При нажатии на кнопку "Обновить", система заново посылает
запрос с типом SCAN
пользовательскому агенту и в
случаях:
получения успешного ответа, закрывает диалоговое окно и открывает окно сканирования;
не получения ответа (сервер пользовательского агента не отвечает в течении 30 секунд), оставляет диалоговое окно открытым.
Альтернативный поток событий №2: В случае, если
на запрос от системы с типом SCAN
, система
получает ответ со статусом SCANNING
или
SAVED
, необходимо вывести пользователю
предупреждение на красном фоне со следующим текстом:
Сканирование уже выполняется. Закончите его или отмените.
Не посылать других запросов агенту (завершить процесс).
Альтернативный поток событий №3: В случае, если
на запрос от системы с типом STATE
, система
получает ответ со статусом CANCELLED
необходимо
вывести пользователю сообщение на голубом фоне со следующим текстом:
Сканирование отменено.
Не посылать других запросов агенту (завершить процесс).
Альтернативный поток событий №4: В случае, если
на запрос от системы с типом STATE
, система не
получает ответа - сервер пользовательского агента не отвечает в
течении 30 секунд, необходимо вывести пользователю сообщение на
красном фоне со следующим текстом:
Сканирование невозможно так как агент Synergy не отвечает. Запустите
агент и повторите попытку.
Альтернативный поток событий №5: В случае, если в процессе сохранения нажимается кнопка закрытия, необходимо вывести пользователю сообщение на красном фоне со следующим текстом:
Сканирование уже выполняется.