mercoledì 6 novembre 2019

Net - Scansione dei documenti tramite scanner tramite VB.Net e C# - prima parte

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_net-effettuare-la-scansione-dei-documenti-tramite-scanner-prima-parte_1643.aspx


In questo articolo vedremo come utilizzare nelle nostre applicazioni lo scanner per effettuare la scansione di documenti.
Può capitare che nelle nostre applicazioni c’è bisogno di utilizzare lo scanner per salvare in vari formati (png, jpg, tiff, etc) dei file.
In questo articolo, vedremo come in un progetto di tipo “Windows Application” ma applicabile anche in applicazioni web, con opportune modifiche, si possono effettuare le scansioni, tramite l’utilizzo dei riferimenti a “Microsoft Windows Image Acquisition Library”, una libreria utilizzata da Windows per effettuare la scansioni di documenti.
In questa serie di articoli, divise in due parti, vedremo come tramite i linguaggi di programmazione più utilizzati in .Net, come Visual Basic .Net e C#, si effettua una scansione, si salva il file e si visualizza l’anteprima.
Naturalmente viene illustrata una valida panoramica e non temi avanzati, come si potrebbe affrontare l’impostazione della dimensione o le impostazioni del dispositivo hardware su alcune funzionalità che lo scanner può fornire o altri temi, perché diverrebbe tema troppo lungo ma soprattutto materia di creazione di un programma avanzato per la scansione di documenti, l’articolo vuole solo fornire al lettore come poter fornire le basi per effettuare una scansione di documenti, il classico programma di scansione di Windows.

Creazione del progetto

Si apre Visual Studio 2017 o altra versione, e si seleziona tra le categorie “Desktop” e poi tra i modelli presenti “Windows Application”.
Terminata la creazione verrà aperto una Windows Form, che in altri articoli si è parlato e discusso.
Nella forma, aggiungiamo un controllo di tipo “listBox” denominato “ListScanner” che permetterà di visualizzare la lista dei scanner collegati al pc, in particolare il nome dello scanner.
Aggiungere due controlli di tipo “Label” con l’obiettivo di visualizzare la descrizione dei due campi, un controllo di “Textbox” con la proprietà nome impostata a “txtPercorsoNomeFile” un controllo “Button” accanto alla casella di testo in modo che visualizza una finestra di dialogo per il salvataggio del file scansionato denominato “btnSalva”, un controllo di “ComboBox” con la proprietà “Nome” impostata su “cmbFormato” con il compito di visualizzare il tipo di file da salvare ed un controllo pulsante, denominato “BtnScansiona” con il quale si effettuerà la scansione. Infine un controllo “pictureBox” denominato “pictureBox1” che avrà il compito di visualizzare l’anteprima dell’immagine.
Il tutto dev’essere simile a come illustrato in figura 1.


Figura 1 – La form con i vari controlli in fase di utilizzo.

Terminata la creazione della form, non resta che aggiungere il riferimento al componente “COM” WIA (Windows Image Acquisition) che permetterà di gestire lo scanner ed effettuare le scansioni.
In esplora soluzione, sul nome del progetto, facciamo click con il tasto destro del mouse e dal menu che viene visualizzato, selezioniamo la voce “Aggiungi” e dal sotto menu la voce “Riferimento”, verrà aperta una finestra, e selezioniamo la voce di menu “COM” posta sulla sinistra, tra le varie voci cerchiamo quella con la dicitura “Microsoft Windows Image Acquisition Library V2.0” e mettiamo una spunta su tale voce, il tutto come riportato in figura 2.

Figura 2 – La selezione del componente COM.

A questo punto, confermiamo il tutto tramite il pulsante “OK” in modo che viene chiusa la finestra ed aggiunto al progetto il componente.
Inseriamo nella casella combinata, i valori “Jpg”, “Tiff” e “Png” nella proprietà Items.

Stesura del codice

Terminata la fase di impostazione della form e dell’aggiunta del componente scriviamo il codice per effettuare la scansione.
La prima operazione che bisogna fare è quella di aggiungere lo spazio dei nomi per la gestione dello scanner, delle immagini e dei file.
Passiamo in visualizzazione codice, e sopra, in alto sopra ad ogni dichiarazione scriviamo i vari namespace.
Qui di seguito i frammenti di codice per entrambi i linguaggi.



VB.Net

Imports WIA

Imports System.Runtime.InteropServices

Imports System.IO

 

C#

using WIA;

using System.IO;

using System.Runtime.InteropServices;

Fatto ciò passiamo in visualizzazione grafica della form e facciamo doppio click sulla form, in questo modo si passa automaticamente in modalità codice dell’evento “Load” della form.
Questo evento, permetterà di caricare nel controllo “listbox” la lista degli scanner.
Tramite la classe “DeviceManager” faremo un ciclo tra i vari dispositivi collegati escludendo quelli che non sono di tipo “Scanner” tramite la proprietà “ScannerDeviceType” .
Se sono scanner, tramite la proprietà “Name” andiamo a rilevare il nome del dispositivo da visualizzare nell’elenco.
Qui di seguito si riporta il frammento di codice di tali dichiarazione per i linguaggi Visual Basic Net e C#


VB.Net

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim deviceManager = New DeviceManager()

 

        For i As Integer = 1 To deviceManager.DeviceInfos.Count

 

            If deviceManager.DeviceInfos(i).Type <> WiaDeviceType.ScannerDeviceType Then

                Continue For

            End If

 

            listScanner.Items.Add(deviceManager.DeviceInfos(i).Properties("Name").Value.ToString())

        Next

 

        cmbFormato.SelectedIndex = 0

    End Sub

 

C#

 

private void Form1_Load(object sender, EventArgs e)

        {

          

            var deviceManager = new DeviceManager();

          

            for (int i = 1; i <= deviceManager.DeviceInfos.Count; i++)

            {

              

                if (deviceManager.DeviceInfos[i].Type != WiaDeviceType.ScannerDeviceType)

                {

                    continue;

                }

 

               

                listScanner.Items.Add(deviceManager.DeviceInfos[i].Properties["Name"].get_Value().ToString());

                

            }

        

 

            cmbFormato.SelectedIndex = 0;

        }



Conclusioni

Termina la prima parte di questi due articoli riguardante la gestione dello scanner, abbiamo impostato la nostra form per utilizzare le fasi più comuni, predisponendo graficamente i controlli che permettono la scansione, elenco degli scanner e l’anteprima, oltre naturalmente ad aver fatto riferimento al componente COM che andremo ad utilizzare.
Nella seconda ed ultima parte, vedremo come effettuare la scansione, salvare il file sul nostro pc e visualizzarlo in anteprima.

lunedì 4 novembre 2019

Edito online per le immagini

Dal seguente sito https://pixlr.com/x/ in lingua inglese, è possibile apportare le modifiche alle proprie immagini applicando determinati effetti.
Il sito, offre un editor online per la modifica delle immagini e non richiede ne registrazioni e ne email.

domenica 3 novembre 2019

Creazione una unità USB avviabile in modo facile con Rufus

[rufus screenshot]

Rufus,  è un programma in lingua italiana gratuito che non richiede nessuna installazione, che permette di creare unità usb per l'avvio e l'installazione del sistema operativo.
Nell'ultima versione permette anche di scaricare il sistema operativo Windows 8.1 e Windows 10.
Il programma è scaricabile dal seguente sito https://rufus.ie/ in italiano.



sabato 2 novembre 2019

Donwload gratuito del gioco Costume Quest



Nuovi giochi dalla piattaforma Epicagames, questa volta la possibilità di scaricare fino al 7 novembre 2019, il gioco Costume Quest in lingua inglese per piattaforma Windows.
Per maggiori informazioni e download visitate il seguente sito https://www.epicgames.com/store/it/product/costume-quest/home

Meteo interattivo con dettaglio delle previsioni

Oggi segnalo un sito con il quale si possono consultare le previsioni meteo con una certa interazione ma soprattutto grafica accattivante.
Tramite il pulsante posto nella parte in basso a sinistra, è possibile vedere le previsioni per le prossime 24 ore.
Il sito è visitabile al seguente link https://www.ventusky.com/?p=41.9;12.4;5&l=temperature-2m

venerdì 1 novembre 2019

Programma gratuito per il disegno dei circuiti elettronici - cad



Oggi segnalo un programma molto origine e raro da trovare.
Dal seguente sito http://www.kicad-pcb.org/ potete scaricare un programma gratuito e multi piattaforma per il disegno dei circuiti elettronici.
E' possibile scaricare anche il sorgente del programma.
Per il download e maggiori informazioni, visitate il sito indicato.

giovedì 31 ottobre 2019

Portale di programmazione ed offerte di lavoro sul mondo della tecnologia.

Il sito Iprogrammatori, online dal 2001 è un punto di riferimento nazionale in ambito di tecnologia, in particolare con notizie ed articoli sul mondo della programmazione e tecnologia, ed offerte di lavoro in tale settore.
Nel sito è possibile consultare le offerte di tutta Italia, in ambito tecnologico, come programmatori, sistemisti, analisti e tanti altri ruoli, inoltre è possibile inserire il proprio CV.
Come ogni buon portale, anche iprogrammatori al suo interno si trova un forum per confrontarsi e fare domande.
Per maggiori informazioni ed altro visitate il seguente sito https://www.iprogrammatori.it/

mercoledì 30 ottobre 2019

.Net servizio WCF che invia e riceve array byte - Parte 2

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_creare-un-servizio-wcf-che-invia-e-ricev_1637.aspx

Riprendiamo l'articolo precedente https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_net-wcf-creare-un-servizio-che-invia-e-r_1636.aspx per la gestione dei file tramite i servizi di Windows Communication Foundation, in particolare in questa seconda ed ultima parte come inviare il file dalla pagina web al servizio, ossia da un progetto di tipo Asp.Net ad un servizio WCF.
Senza ricreare un nuovo progetto, apriamo il precedente progetto, e dopo aver selezionato il progetto del servizio, andiamo nel file del servizio.
Ora dobbiamo scrivere il codice per inviare il file, dalla pagina web al servizio. In questo modo vediamo come rendere la nostra applicazione bidirezionale.
Ritorniamo sul progetto del servizio e nel file Service1 dobbiamo scrivere il metodo per la ricezione del flusso dati di un file.
Il metodo avrà due parametri, uno di tipo stringa per assegnare il nome del file e l’altro l’array di byte per creare il file
Qui di seguito si riporta la dichiarazione per entrambi i linguaggi.


VB.Net

Public Function CreaFile(NomeFile As String, StreamFile As Byte()) As Boolean Implements IService1.CreaFile

 

        Try

            File.WriteAllBytes("D:\" + NomeFile, StreamFile)

        Catch ex As Exception

            Return False

        End Try

 

    End Function

C#

  public bool CreaFile(string NomeFile, byte[] StreamFile)

        {

 

            try

            {

 

                File.WriteAllBytes("D:\\" + NomeFile, StreamFile);

                return true;

 

            }

            catch (Exception ex)

            {

                 return false;

            }

       

       

       

        }


Andiamo nel file di interfaccia, ed impostiamo il nuovo metodo.
Qui di seguito si riporta tale dichiarazione.


VB.Net

<OperationContract()>

    Function CreaFile(NomeFile As String, StreamFile As Byte()) As Boolean

C#

[OperationContract]

        bool CreaFile(string NomeFile, byte[] StreamFile);

 

Ora ritorniamo nel progetto web, e scriviamo il codice per inviare il file al servizio con il metodo creato.
La prima operazione da fare è quella di aggiornare il servizio web, in modo che viene visto il nuovo metodo creato.
Nella nostra pagina web, facciamo click sul pulsante con la dicitura “Invia” con il quale andremo ad eseguire il metodo appena creato.
Qui di seguito si riporta il codice per l’evento click di tale pulsante.


VB.Net

Protected Sub BtnInvia_Click(sender As Object, e As EventArgs) Handles BtnInvia.Click

        Try

            Dim StreamFile As Byte() = File.ReadAllBytes("D:\\MioFile.jpg")

            Dim ServizioDati As New WsDati.Service1Client

            

            ServizioDati.CreaFile("NuovissimoFile.Jpg", StreamFile)

 

 

 

        Catch ex As Exception

            Response.Write("Errore: " + ex.Message)

            'Errore: Il server ha restituito una risposta non prevista: (400) Bad Request.

        End Try

       

    End Sub

 

C#

protected void BtnInvia_Click(object sender, EventArgs e)

        {

            try

            {

 

        

                byte[] StreamFile = File.ReadAllBytes("D:\\MioFile.jpg");

                WSDati.Service1Client ServizioDati = new WSDati.Service1Client();

                ServizioDati.CreaFile("NuovissimoFile.Jpg", StreamFile);

 

            }

            catch (Exception ex)

            {

                //Il server ha restituito una risposta non prevista: (400) Bad Request.

                Response.Write("Errore: " + ex.Message);

            }

        }


Non appena facciamo la prova verrà generato il seguente errore “Errore: Il server ha restituito una risposta non prevista: (400) Bad Request.” questo perché dobbiamo modificare il file di configurazione per l’invio dei file.
Questo è dovuto alla mancanza dei parametri impostati nel file di configurazione del servizio, in particolare nel file “WebConfig”.
Il file di configurazione avrà questi parametri:

<system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior>

          <!-- Per evitare la diffusione di informazioni sui metadati, impostare i valori seguenti su false prima della distribuzione -->

          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

          <!-- Per ricevere i dettagli sull'eccezione per scopi di debug in caso di guasti, impostare il valore riportato sotto su true. Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sull'eccezione -->

          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <protocolMapping>

        <add binding="basicHttpsBinding" scheme="https" />

    </protocolMapping>   

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

  </system.serviceModel>

  <system.webServer>

    <modules runAllManagedModulesForAllRequests="true"/>

    <!--

        Per sfogliare la directory radice dell'applicazione Web durante il debug, impostare il valore riportato sotto su true.

        Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sulla cartella dell'applicazione Web.

      -->

    <directoryBrowse enabled="true"/>

  </system.webServer>

 Per risolvere questo problema andranno aggiunti i seguenti parametri tra </behaviors> e <protocolMapping> in modo che si possono trasmettere flussi di dati maggiore.




 
<bindings>
      <basicHttpBinding>
        <binding name="wccServiceBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed" sendTimeout="00:50:00" receiveTimeout="00:50:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
 
        </binding>
        <binding name="ADHOC_WSSoap11Binding"  messageEncoding="Mtom"/>
      </basicHttpBinding>
      <customBinding>
        <binding name="ADHOC_WSSoap12Binding">
          <mtomMessageEncoding messageVersion="Soap12" />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    <services>
      <service name="WcfServizioVB.Service1">
        <endpoint behaviorConfiguration="" binding="basicHttpBinding" bindingConfiguration="wccServiceBinding" contract="WcfServizioVB.IService1" />
      </service>
    </services>
 E nella parte tra <directoryBrowse enabled="true"/> e </system.webServer> inserire il seguente codice,
  <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647">
          <headerLimits>
            <add header="Stream" sizeLimit="2147483647" />
          </headerLimits>
        </requestLimits>
      </requestFiltering>
    </security>

Ora se testiamo il nostro codice  vedremo che l’applicazione funziona correttamente senza generare errore.
Nella parte server, verrà creato il file sul computer.

Conclusioni
L’articolo ha fornito al lettore una tecnica per l’utilizzo dei servizi WCF per l’invio e la ricezione dei file.
Implementazione che solo tramite l’inserimento di alcuni parametri nel file di configurazione, permette tale gestione. La gestione dei file con i servizi web non è semplice, ma con le giuste ed opportune modifiche si riescono a superare le difficoltà di questo scenario.