piątek, 20 stycznia 2017

Zdalne skanowanie (obsługa skanera z przeglądarki)

Mam w domu stary skaner. Bardzo stary, jest to Mustek 1200 UB plus. Nie powala parametrami, ale dość często z niego korzystam. Jakoś nie mogę się przekonać do robienia zdjęć dokumentom, które muszę później wydrukować lub gdzieś wysłać. Jest jednak dość problematyczny - brakuje do niego sterowników dla wszystkich 64 bitowych wersji Windows. Doskonale za to radzą z nim sobie wszelkie dystrybucje linux.
W związku z tym, że nie tylko ja z niego korzystam i dostęp do niego jest ograniczony bo większość sprzętu w domu bazuje na Windows 64 bit. Potrzebowałem znaleźć rozwiązanie pozwalające na łatwe skanowanie dokumentów z dowolnej platformy, w tym z telefonów i tabletów.
W związku z tym, że jako "serwer" w domu cały czas chodzi mikro komputer Kiano Slimstick wystarczyło tylko sprawić by ten serwer udostępnił usługę umożliwiającą wyzwolenie skanowania. Po przeszukaniu internetu znalazłem potrzebne narzędzia.
  1. CmdTwain - oprogramowanie pozwalające na zeskanowanie dokumentu z wiersza poleceń. Dla systemu Windows ciężko było znaleźć coś bezpłatnego i lepiej działającego. W dystrybucjach linux wystarczy, że doinstalujemy pakiet scanimage.
  2. Chciałem także aby usługa pozwalała na wydrukowanie zeskanowanego dokumentu na jedną z drukarek i tu z pomocą przychodzi IrfanView, mający opcję drukowania z wiersza poleceń. Odpowiednikiem na linux'a jest standardowy pakiet lpr.
CmdTwain instalujemy i sprawdzamy czy poprawnie współpracuje z naszym skanerem.
Teraz wystaczy żeby to połączyć i udostępnić w postaci usługi. W moim przypadku jest to spring boot'owa aplikacja udostępniająca kilka serwisów obsługujących wyzwalanie poleceń w systemie operacyjnym. Wszystko jest wyeksponowane w postaci strony html z kilkoma przyciskami i podglądem ostatnio skanowanego dokumentu. W związku z tym, na stacji do której podpięty jest skaner instalujemy oprogramowanie Java (wystaczy JRE).
Struktura projektu jaki stworzyłem jest prosta:
pl.cli.rest.CliRestApplication to deklaracja aplikacji Spring Boot:

@SpringBootApplication
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class CliRestApplication {
    public static void main(String[] args) {
       SpringApplication.run(CliRestApplication.class, args);
    }
}
pl.cli.rest.CliController to definicja endpointów - wszystkie obsługują żądania GET:
@ResponseBody
@RequestMapping(path = "/scan", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] scan() throws Exception {        
}
@ResponseBody
@RequestMapping(path = "/print", method = RequestMethod.GET)
public ResponseEntity<String> printLast(@RequestParam(value = "printer", required = false) String printer) {
}
@ResponseBody
@RequestMapping(value = "/getImage", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] getImage(@RequestParam(value = "fileName", required = false) String fileName) throws IOException {
}
webapp - statyczna część aplikacji - prosta strona html + angular'owy kontroler. Wywołania serwisów realizowane są za pomocą biblioteki Restangular a widok wspiera css z w3schools.
Ostatecznie po uruchomieniu serwisu mam możliwość skanowania i drukowania dokumentów po wejściu stronę pod odpowiednim adresem. Nie ma więc znaczenia czy chcę wyzwolić skanowanie z komputera czy telefonu, wystarczy że urządzenie mam podłączone do sieci Wifi. Zasada działania jest banalna: po wejściu na stronę ładowany jest ostatnio skanowany obraz. Funkcjonalność przycisków jest dość oczywista, dwa przyciski do obsługi drukarki mają obsłużony 5 sekundowy timeout, żeby nie wykonywać przypadkowych dodatkowych klików. Kliknięcie na miniaturze obrazka powoduje jego prezentację w nowej karcie przeglądarki. Uruchomienie zbudowanej paczki możemy wykonać: C:\Windows\System32\cmd.exe /c java -jar D:\skany\cli-rest-0.0.1-SNAPSHOT.war
Ja mam po prostu zdefiniowane zadanie Windows uruchamiające mój serwis podczas logowania użytkownika, tak więc startuje razem z systemem operacyjnym.
  
Część statyczna projektu (zawartość katalogu webapp) może działać niezależnie od części serwisów (w pliku index.html wystarczy zmienić bazowy adres URL naszego serwera).
Na ten moment ścieżki, polecenia itp są w kodzie źródłowym, kiedyś może znajdzie się chwila, na wyjęcie tego do konfiguracji poza aplikacją.
Cały projekt można pobrać tutaj, dostosować do swoich potrzeb i wykorzystać. Żeby zbudować projekt potrzebujemy SDK Java i Maven'a.
Podziel się:

1 komentarz: