Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    PHP e acquisizione da scanner

    Ciao, lo so ci sono diverse discussioni sull'argomento e ne ho lette molte ma non ho trovata la risposta, o meglio quelle date non mi risolvono il problema.
    Questo è il problema! No non sono guglielmino squotilancia, no vi spiego cosa debbo realizzare: ho un server WAMP che attualmente in un ufficio pubblico mi regge una serie di registri in cui vengono archiviati una serie di dati, ora ho la necessità di inserirci le scansioni di documenti provenienti da scanner (eliminazione delle fotocopie da archiviare in documenti elettronici). Lo scanner risiede sul server e i client si connetto all'archivio con un'interfaccia web.
    Ora il problema è che su una macchina linux potrei fare qualcosa del genere per leggere lo scanner, ovvero leggere da PHP il "file" /dev/scanner0 e prendere il dato presente e trattarlo come un normale file.
    Posso fare qualche cosa del genere in Windows?

  2. #2
    Lui linux non esiste "scanner0" devi utilizzare un software di scansione, come ad esempio SANE, con il backend correttamente configurato

    Su windows devi usare le COM con PHP, nello specifico, tramite le COM devi usare le WIA, ma te lo sconsiglio perché sono instabili

    https://www.google.it/webhp?q=php+com+wia

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Originariamente inviato da daniele_dll
    Lui linux non esiste "scanner0" devi utilizzare un software di scansione, come ad esempio SANE, con il backend correttamente configurato
    come non esiste, scusa lo leggo,

    Su windows devi usare le COM con PHP, nello specifico, tramite le COM devi usare le WIA, ma te lo sconsiglio perché sono instabili

    https://www.google.it/webhp?q=php+com+wia
    e vabbé ma mi tocca usare qualche cosa.
    Il problema è che in NIX lo scanner è letto comunque come un sistema a caratteri mentre in windows pare di no, ieri ho fatte alcune prove e nulla non si legge nulla, ne in memoria, ne su file, ne sullo stdoutput.
    Ora vedo wia.
    A proposito dimenticavo, SANE esise pure per Windows ma io non vorrei usare comendi di sistema da PHP.

  4. #4
    Originariamente inviato da Marcolino's
    come non esiste, scusa lo leggo
    pardon, non ho mai usato scanner sotto linux ma pensavo che sane accedesse direttamente al device USB (come infatti fa) senza usare la path, ma tipo usando libusb o qualcosa (che poi ... in realtà ... è probabile che comunque voglia la path )

    Il problema è che in NIX lo scanner è letto comunque come un sistema a caratteri mentre in windows pare di no, ieri ho fatte alcune prove e nulla non si legge nulla, ne in memoria, ne su file, ne sullo stdoutput.
    Ora vedo wia.
    A proposito dimenticavo, SANE esise pure per Windows ma io non vorrei usare comendi di sistema da PHP.
    Su windows, ripeto, puoi usare le COM e, per essere precisi, anche i componenti .NET ( http://php.net/manual/en/class.dotnet.php ) che fondamentalmente sono trattati come fossero dei componenti COM

    Se hai problemi ad accedere direttamente alla WIA puoi provare a passare dal .NET (tanto di normale è installato sulle macchine windows) e risolvi il problema

    Qui ci sono dei link per usare le WIA tramite C#
    http://stackoverflow.com/questions/8...-vista-to-scan
    http://itsmikebender.com/2009/08/usi...maging-device/
    https://edulorenzo.wordpress.com/201...m-wia-using-c/

    Qui c'è un esempio molto più completo, relativo anche alla configurazione "programmatica" (quindi senza operazioni da parte dell'utente sull'interfaccia standard di windows) dello scanner
    http://www.nakov.com/blog/2009/11/17...ith-wia-and-c/

    PS: considera che non puoi, ovviamente, far vedere "finestre" a video, quindi devi automatizzare la scansione ... anche lo stesso metodo ShowAcquireImage ( http://msdn.microsoft.com/en-us/libr...sktop/ms630772(v=vs.85).aspx ) va richiamanto dicendogli di non visualizzare la UI (CommonUI passato su FALSE)
    PS2: in realtà, essendo le WIA delle librerie a cui si ci interfaccia tramite COM non hai bisogno del .NET, però guardando il codice C# potresti vedere velocemente cosa ti serve chiamare per far funzionare il tutto

  5. #5
    ehm ... diciamo che la cosa mi sembrava simpatica da fare, quindi mi son messo e l'ho fatta

    Ho implementato una basilarissima classe, ma facilmente espandibile, che contiene all'interno 3 metodi:
    - un metodo ListScanner che ti restituisce l'elenco degli scanner con le varie informazioni, senza però icone e/o simili, utile nel momento in cui devi fare la scansione senza UI
    - un metodo per fare la scansione con la ui (si appoggia al metodo successivo)
    - un metodo per fare la scansione senza ui

    Come base per la "conversione" ho usato il link seguente (che implementa anche l'adf cosa che io non ho fatto)
    http://miljenkobarbir.com/using-a-sc...ialogs-in-net/

    Se cerchi su google le classi e/o i metodi utilizzati per le WIA trovi subito i link all'MSDN che è meraviglioso, basta solo prenderci la mano perché c'è veramente di tutto, per tutti i linguaggi microsoft, per tutti i sistemi operativi microsoft ... quindi se ci prendi la mano e non lo maledici eccessivamente all'inizio scoprirai quant'è bello

    NOTE:
    - la gestione errori è minimale
    - non l'ho testato su IIS, ma solo su Apache su Windows
    - lo scanner, attualmente, non viene "configurato" quindi non so dirti cosa ti esce fuori ... però in uno dei link che ti ho postato prima c'era il codice necessario per configurare lo scanner

    PS: ma se ti serve per una gestione documentale, non sarebbe più comodo farla fare direttamente al client?

    codice:
    <?php
    
    class WIA
    {
        const WIADEVICETYPE_UNSPECIFIEDDEVICETYPE   = 0;
        const WIADEVICETYPE_SCANNERDEVICETYPE       = 1;
        const WIADEVICETYPE_CAMERADEVICETYPE        = 2;
        const WIADEVICETYPE_VIDEODEVICETYPE         = 3;
        
        const WIAFORMATID_BMP  =    '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}';
        const WIAFORMATID_PNG  =    '{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}';
        const WIAFORMATID_GIF  =    '{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}';
        const WIAFORMATID_JPEG =    '{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}';
        const WIAFORMATID_TIFF =    '{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}';
        
        function __construct()
        {
            // Si assicura che le librerie siano caricate
            com_load_typelib("WIA.Image");
            com_load_typelib("WIA.Vector");
            com_load_typelib("WIA.Device");
            com_load_typelib("WIA.Item");
            com_load_typelib("WIA.CommonDialog");
            com_load_typelib("WIA.DeviceManager");
        }
        
        function ListDevices()
        {
            $scanners = array();
            
            // Instanzia il device manager
            $deviceManager = new COM("WIA.DeviceManager");
            
            // Cicla i device
            foreach($deviceManager->DeviceInfos as $deviceInfo)
            {
                $scanner                = new stdClass();
                $scanner->Id            = $deviceInfo->DeviceID;
                $scanner->Name          = $deviceInfo->Properties("Name")->Value;
                $scanner->Manufacturer  = $deviceInfo->Properties("Manufacturer")->Value;
                $scanner->Port          = $deviceInfo->Properties("Port")->Value;
                $scanner->Type          = $deviceInfo->Properties("Type")->Value;
                
                $scanners[] = $scanner;
                
                unset($scanner);
            }
            
            return $scanners;
        }
        
        function ScanWithoutUi($DeviceId, $FormatId, $SavePath)
        {
            $selectedDevice = null;
            
            // Instanzia le classi necessarie (common dialog e device manager)
            $commonDialogClass = new COM("WIA.CommonDialog");
            $deviceManager = new COM("WIA.DeviceManager");
            
            // Cicla i device
            foreach($deviceManager->DeviceInfos as $deviceInfo)
            {
                if ($DeviceId == $deviceInfo->DeviceID)
                {
                    // Si collega allo scanner
                    $selectedDevice = $deviceInfo->Connect();
                    break;
                }
            }
            
            if ($selectedDevice == null)
            {
                return false;
            }
            
            // Acquisisce il primo scanner in elenco
            $selectedDeviceItem = $selectedDevice->Items[1];
            
            // Avvia la scansione
            $scannedImage = $commonDialogClass->ShowTransfer($selectedDeviceItem, $FormatId, false);
            
            if ($scannedImage == false)
            {
                return false;
            }
            
            $scannedImage->SaveFile($SavePath);
            
            return true;
            
            // come implementare la scansione con il supporto all'adf (pagine multiple)
            // http://miljenkobarbir.com/using-a-sc...ialogs-in-net/
        }
        
        function ScanWithUi($FormatId, $SavePath)
        {
            // Instanzia la classe
            $commonDialogClass = new COM("WIA.CommonDialog");
            
            // Acquisisce l'elenco dei device
            $device = $commonDialogClass->ShowSelectDevice(self::WIADEVICETYPE_UNSPECIFIEDDEVICETYPE, true, false);
            
            if ($device == false)
            {
                return false;
            }
            
            return $this->ScanWithoutUi($device->DeviceID, $FormatId, $SavePath);
        }
    }
    
    $wia = new WIA();
    
    echo '<pre>';
    var_dump($wia->ListDevices());
    echo '</pre>';
    
    var_dump($wia->ScanWithoutUi("{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\\0000", WIA::WIAFORMATID_JPEG, "C:\scan.jpg"));
    
    ?>

  6. #6
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Allora, intanto sei un grande perché mi ha probabilmente risolto un problema anche se devo comunque vedere se è implementabile su qualsiasi machina, tieni presente che nella PA si trovano macchine nuovissime (quelle di tre anni fa stanno arrivando adesso) e meno nuove (Pentium II con NT4) ho detto tutto
    Comunque il parco sistemi operativi vanno da NT4 a Win7 senza soluzione di continuità, ora il sistema attuale gira su Win XP, apache, PHP 5.4, MySQL come motore di database.
    L'applicazione autocostruita è distribuita su 50 macchine tramite interfaccia web e serve per archiviare dei dati, normalmente si fa un estratto in fotocopia, cioè frontespizio e ultima pagina del dato niserito per tenere traccia del provvedimento, tutto il resto (molto didascalico) è su database.
    L'idea è di poter acquisire il documento da scanner per evitare la copia cartacea, ma avendo un solo scanner, tra l'altro rimediato di straforo.
    Ora per l'acquisizione non è un problema perché delle 50 macchine solo una acquisisce i dati e le altre sono solo di modifica e consulatazione, quindi va bene che lo scanner sia attaccato al server, così si elimina pure il problema di avere un sistema più complesso (scanner su più macchine, programma di invio dati sul client, server che deve acquisire il dato).
    Il problema dei sistemi operativi diversi nasce dal fatto che questi programmi una volta realizzati e fatti funzionare noi li mettiamo nel forumpa in un repository dove chiunque della PA può prenderli e usarli, già è comlicata l'installazione di un WAMP per chi non conosce il sistema, la configurazione di rete eccetera, se poi deve anche scrivere dei programmi per il sistema operativo... lasciamo perdere!
    Certo potrei fornire io il programma adatto, ovvero la dll per ognuno dei sistemi operativi, ma oramai qui si trova solo winxp e qualche win7, poi ci sono le patch al sistema operativo, al .net insomma bisognerebbe trovare la quadra ( ) per ogni caso che si presenti... addio!
    comunque se funziona bene il tuo sistema è già un grosso passo avanti, solo speravo in qualche cosa di più semplice, ma va bene così.

    Denghiu

  7. #7
    Originariamente inviato da Marcolino's
    Comunque il parco sistemi operativi vanno da NT4 a Win7 senza soluzione di continuità, ora il sistema attuale gira su Win XP, apache, PHP 5.4, MySQL come motore di database.
    in linea generale problemi non c'è ne sono, io l'ho sviluppata su Windows 7 e funziona sia con apache avviato come servizio sia manualmente ... ovviamente se avviato come servizio e uso la UI di windows si pianta tutto (ma basta non usarla)

    Il problema dei sistemi operativi diversi nasce dal fatto che questi programmi una ... comunque se funziona bene il tuo sistema è già un grosso passo avanti, solo speravo in qualche cosa di più semplice, ma va bene così.
    in linea generale funziona, il .NET non è stato usato o, meglio, è stato usato solo come codice di riferimento (per vedere i metodi, le costanti, le classi e via dicendo) ma per il funzionamento sono state usate solo le COM

    Detto questo, le funzionalità WIA utilizzate sono quelle base quindi sia che si tratti di Windows XP sia che si tratti di Windows 2008 Server dovrebbe tutto funzionare perfettamente.

    Male male che va, prova a dare un colpo di
    regsrv32 wiaaut.dll

    come amministratore da dentro c:\windows\system32

    anche se comunque essendo una libreria di sistema ed essendoci lo scanner installato sicuramente le WIA sono funzionanti e attive

    l'unico problema è se il server è una macchina precedente a Windows 2000 perché su Windows NT 4 esistono solo le Twain, su Windows 2000 se non erro c'erano già le WIA 1.0

  8. #8
    Ciao Daniele,
    Sai se c'è il modo per utilizzare lo scanner dalle postazioni client?

    Metti il caso che hai lo script su di un hosting, é possibile startare la digitalizzazione e creare il PDF direttamente sul server?

    Ho provato tempo fa questo:
    http://asprise.com/product/jtwain/applet/index.php
    però mi sembra abbastanza instabile quando usi scanner con ADF

  9. #9
    ti sconsiglio di utilizzare JAVA (quindi da dentro il browser) per quest'operazione

    ci sono vari sistemi, dipendono dalla situazione

    RETE LOCALE
    Installare un software sul client che si occupi di fare queste operazioni via rete (che, volendo, può anche essere un apache+php se non si vogliono usare altri linguaggi, personalmente faccio queste cose in C#) in questo modo il server può contattare direttamente la postazione client ($_SERVER['REMOTE_ADDR']) e richiedere la scansione risolve il problema bene

    SU INTERNET
    Tramite internet ci sono 2 modi, tutti e due comunque includono l'installazione di un software

    Il primo modo è tramite un browser web ad hoc, soluzione che preferisco, usando C# + CEF (ovvero Chrominium Embeeded Framework quindi, praticamente, il motore di Google Chrome) così da permettere l'interfacciamento poi tramite Javascript.

    In pratica PHP, quando genera la pagina, scrive il codice javascript necessario così per come richiesto dal client per far partire la scansione (ad esempio Scanner.Scan() ^^) ... Scanner è una classe resa disponibile internamente dal C# al motore di chrominium, ovvero V8.
    A questo punto la parte C# del software prendere il controllo, fa tutto quello che deve fare, ed invia i dati ad una pagina web passandogli i parametri indicati via javascript precedentemente.

    Questa è la soluzione migliore perché da il pieno ed assoluto controllo della situazione

    La seconda opzione è invece basata su un principio simile, ovvero si crea un software che gestisca i vostri "protocolli" di rete, quindi ad esempio come c'è skype:// o tel:// si farà mioprogramma://, a questo punto l'handler riceve la richiesta tramite una pagina web/frame/quant'altro e fa tutte le operazioni necessarie di scansione. ed invia i contenuti ad una pagina web remota

    C'è anche una terza opzione, ovvero far scaricare un file sotto forma di comandi da far eseguire (comandi del software stesso e non di sistema) ma è una soluzione che non ho mai vagliato perché mi sembra scomoda da gestire

  10. #10
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    C'è anche la possibilità di usare javascript per interfacciarsi via com e leggere direttamente la porta a cui è interfacciato lo scanner, quindi inviare i dati tramite ajax direttamente al server e si risolve con normale chiamta post.
    Il problema in ogni caso sarà la lentezza del sistema, ovvero la trasmissione di una grande mole di dati sulla rete intranet/internet, inoltre in ogni caso c'è il problema del feedback, immagino qualche coa del tipo, tu scansioni senza vedere nulla perché non hai un'applicazione che ti fa vedere cosa farai, semlicemente premi il tasto "scansiona" sulla macchina, il javascript prende i dati in ingresso ma non può farti vedere un'immagine in quanto non ha librerie grafiche in grado di costruirla, ma la invia direttamente al server così com'è, lì il php tramite le librerie gd crea l'immagine e te la propone sul browser, mettiamo in una popup, e tu dici sì mi piace salvala, no non mi piace ricominciamo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.