domenica 24 aprile 2016

Reading and decoding qrcode stored in an PDF file from within a .NET

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-rilevare-il-testo-di-una-immagine-qr_1438.aspx

In questo articolo vedremo come rilevare il testo di un imagine QrCode situata in un file Pdf tramite la tecnologia .Net utilizzando il linguaggio di programmazione Visual Basic Net e C#.
Per l’elaborazione dei file Pdf, utilizzeremo la libreria ITextSharp scaricabili qui http://sourceforge.net/projects/itextsharp/ mentre per la gestione del QrCode utilizzeremo la libreria Zxing scaricabile da qui https://zxingnet.codeplex.com/
Si crea un nuovo progetto di tipo “Windows Application” selezionando il linguaggio di proprio interesse.
Nella form inseriamo un pulsante ed una casella di testo, nella quale sarà visualizzato il testo rilevato.
Fatto ciò aggiungiamo i riferimenti alle librerie citate in precedenza.

Stesura del codice

Passiamo in visualizzazione codice, ed aggiungiamo i vari spazio dei nomi per utilizzare le librerie.



VB.Net

Imports iTextSharp

Imports iTextSharp.text.pdf

Imports System.IO

Imports System.Drawing.Imaging

Imports iTextSharp.text.pdf.parser

Imports ZXing

 

 

C#

using iTextSharp;

using iTextSharp.text.pdf;

using System.IO;

using System.Drawing.Imaging;

using iTextSharp.text.pdf.parser;

using ZXing;




Nell’evento click inseriamo il codice che ci permetterà di elaborare il file “PDF”,
qui di seguito il codice di tale evento che richiama una funzione indicando il percorso e nome del file.



VB.Net

Private Sub BtnApri_Click(sender As System.Object, e As System.EventArgs) Handles BtnApri.Click

        EstraiImmagine("E:\testfile\qrcode.pdf")

        TxtTesto.Text = GetTestoQrCode("E:\TestFile\ImmagineQrCode.jpeg")

 

    End Sub

 
C#

private void BtnApri_Click(object sender, EventArgs e)

        {

            EstraiImmagine(@"E:\testfile\qrcode.pdf");

            TxtTesto.Text = GetTestoQrCode("E:\\TestFile\\ImmagineQrCode.jpeg");

        }

 
La funzione “EstraiImmagine” ha lo scopo di elaborare il file “PDF” ed estrae l’immagine qrcode relativa.
Qui di seguito si riporta il frammento completo della funzione per entrambi i linguaggi.


VB.Net

Private Sub EstraiImmagine(percorsoFilePdf As String)

        Try

            Dim FilePdf As PdfReader = New PdfReader(percorsoFilePdf)

            'Leggo la prima pagina

            Dim pagina As PdfDictionary = FilePdf.GetPageN(1)

            'estrapolo gli oggetti

            Dim risorsa As PdfDictionary = CType(PdfReader.GetPdfObject(pagina.Get(PdfName.RESOURCES)), PdfDictionary)

 

            Dim oggetti As PdfDictionary = CType(PdfReader.GetPdfObject(risorsa.Get(PdfName.XOBJECT)), PdfDictionary)

 

            Dim NomeFile As String = "immagine"

            'Ciclo per ogni immagine ed estrapolo tutte le immagini della prima pagina

            Dim contatore As Integer = 1

 

            For Each nome As PdfName In oggetti.Keys

 

                If nome.ToString() = "/NomeImmagineQrCode" Then

 

                    Dim Immagine As PdfObject = oggetti.Get(nome)

                    If Immagine.IsIndirect() Then

 

                        Dim pdfDictionary As PdfDictionary = CType(PdfReader.GetPdfObject(Immagine), PdfDictionary)

 

                        Dim width As String = pdfDictionary.Get(PdfName.WIDTH).ToString()

                        Dim height As String = pdfDictionary.Get(PdfName.HEIGHT).ToString()

                        Dim ImmagineOttenuta As ImageRenderInfo = ImageRenderInfo.CreateForXObject(New Matrix(Single.Parse(width), Single.Parse(height)),

                            CType(Immagine, PRIndirectReference), pdfDictionary)

                        SalvaImmagine(ImmagineOttenuta, "E:\TestFile\ImmagineQrCode.jpeg")

                        contatore += 1

                    End If

                End If

 

            Next

 

 

 

 

 

        Catch ex As Exception

            MessageBox.Show("Errore: " + ex.Message)

        End Try

    End Sub

 

C#

private void EstraiImmagine(string percorsoFilePdf)

        {

 

            try

            {

 

 

                PdfReader FilePdf = new PdfReader(percorsoFilePdf);

                //Leggo la prima pagina

                PdfDictionary pagina = FilePdf.GetPageN(1);

                //estrapolo gli oggetti

                PdfDictionary risorsa = (PdfDictionary)PdfReader.GetPdfObject(pagina.Get(PdfName.RESOURCES));

                PdfDictionary oggetti = (PdfDictionary)PdfReader.GetPdfObject(risorsa.Get(PdfName.XOBJECT));

                

                //Ciclo per ogni immagine ed estrapolo tutte le immagini della prima pagina

                int contatore = 1;

                foreach (PdfName nome in oggetti.Keys)

                {

                    if (nome.ToString() == "/NomeImmagineQrCode")

                    {

                        PdfObject Immagine = oggetti.Get(nome);

                        if (Immagine.IsIndirect())

                        {

                            PdfDictionary pdfDictionary = (PdfDictionary)PdfReader.GetPdfObject(Immagine);

                            string width = pdfDictionary.Get(PdfName.WIDTH).ToString();

                            string height = pdfDictionary.Get(PdfName.HEIGHT).ToString();

                            ImageRenderInfo ImmagineOttenuta = ImageRenderInfo.CreateForXObject(new Matrix(float.Parse(width), float.Parse(height)),

                                (PRIndirectReference)Immagine, pdfDictionary);

                            SalvaImmagine(ImmagineOttenuta, "E:\\TestFile\\ImmagineQrCode.jpeg");

                            contatore += 1;

                        }

                    }

 

                }

 

 

 

 

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

 

 

        }

 



Tramite le classi PdfDictionary, andiamo a gestire il file PDF in particolare la risorsa immagine al suo interno, se tale oggetto ha un certo nome “NomeImmagineQrCode”
Verrà elaborato il file, ed estratta l’immagine.
La funzione “SalvaImmagine” salva l’immagine QrCode nel pc.
Si riporta il frammento di codice di tale funzione.



VB.Net

Sub SalvaImmagine(renderInfo As ImageRenderInfo, NomeFileDaSalvare As String)

 

        Dim immagineDaPdf As PdfImageObject = renderInfo.GetImage()

        Using immagineDaSalvare As Image = immagineDaPdf.GetDrawingImage()

 

            If immagineDaSalvare IsNot Nothing Then

                Using ms As New MemoryStream()

                    immagineDaSalvare.Save(ms, ImageFormat.Jpeg)

                    Dim Bitmap As Bitmap = New Bitmap(immagineDaSalvare)

                    Bitmap.Save(NomeFileDaSalvare)

                End Using

 

            End If

        End Using

 

 

    End Sub

 

 

C#

private void SalvaImmagine(ImageRenderInfo renderInfo, string NomeFileDaSalvare)

        {

            PdfImageObject immagineDaPdf = renderInfo.GetImage();

            using (Image immagineDaSalvare = immagineDaPdf.GetDrawingImage())

            {

                if (immagineDaSalvare != null)

                {

                    using (MemoryStream ms = new MemoryStream())

                    {

                        immagineDaSalvare.Save(ms, ImageFormat.Jpeg);

                        Bitmap bitMap = new Bitmap(immagineDaSalvare);

                        bitMap.Save(NomeFileDaSalvare);

 

                    }

                }

 

 

 

            }

 

        }

 

Siamo giunti alla stesura dell’ultima funzione, quella riguardante la possibilità di estrapolare il testo dall’immagine “QrCode”.
Tramite la libreria Zxing, utilizzando il metodo “Decode” possiamo estrapolare il testo di tale immagine.
Qui di seguito si riporta il frammento di codice di tale funzione.



VB.Net

Function GetTestoQrCode(PercorsoFile As String) As String

 

        Dim TestoRilevato As String = ""

        Dim RilevaBarcodeReader As IBarcodeReader = New BarcodeReader()

 

        Dim BitMapBarcode = CType(Bitmap.FromFile(PercorsoFile), Bitmap)

        Dim risultato = RilevaBarcodeReader.Decode(BitMapBarcode)

        If risultato IsNot Nothing Then

            TestoRilevato = risultato.Text

 

        End If

        Return TestoRilevato

 

    End Function

 

 

C#

 

   private string GetTestoQrCode(string PercorsoFile)

        {

            string TestoRilevato = "";

            IBarcodeReader RilevaBarcodeReader = new BarcodeReader();

            var BitMapBarcode = (Bitmap)Bitmap.FromFile(PercorsoFile);

            var risultato = RilevaBarcodeReader.Decode(BitMapBarcode);

            if (risultato != null)

            {

                TestoRilevato = risultato.Text;

            }

            return TestoRilevato;

        }

 

    }

 





Conclusioni

In questo articolo abbiamo visto come realizzare un semplice applicativo di tipo “Windows Application” che estrapola da un file di tipo “Pdf” l’immagine relativa al “QrCode” e visualizza il testo di tale codice.
Tramite la parola “Download” è possibile scaricare l’esempio di questo articolo.

sabato 23 aprile 2016

Recensione Modem Router Netgear Ac750 D6000

In questa recensione, analizzeremo un ottimo modem per la navigazione internet adatta a qualsiasi attività, come può essere l’utilizzo tramite video gioco, per vedere video in streaming oppure come normale uso per la navigazione internet.
Il modem AC750 D6000 della Netgear http://www.netgear.it/home/products/networking/dsl-modems-routers/D6000.aspx offre prestazioni ottimali di navigazione e semplicità nell’utilizzo ed installazione, aspetti non comuni in molti modem, visto che non sono alla portata di tutti. Con questo modem, sarà semplice la relativa configurazione ed installazione, anche per coloro che non hanno dimestichezza con le tecnologie.
Entriamo nel dettaglio di questo prodotto.
La scatola (figura 1) fornisce in maniera chiara le varie funzionalità e potenzialità offerti da questo dispositivo, elencando i dati tecnici ed i vari aspetti di utilizzo.



Figura 1 – La scatola


Come in tutti i prodotti Netgear, la scatola offre diversi componenti (figura 2) oltre al modem, troviamo l’alimentatore, un cavo di rete, che ci permette di collegarlo al computer, un cavo per il telefono, da metterlo nel filtro (sempre incluso nella confezione) ed una presa americana.






Figura 2 – I componenti
Nella parte posteriore (figura 3 ) del modem, troviamo le varie porte o meglio attacchi per utilizzare il nostro dispositivo. Il dispositivo è dotato di una doppia antenna rendendolo di fatto una periferica con una buona ricezione del segnale. Altro interessante aspetto tecnico di questo dispositivo è  quello offerto dalla porta USB.


Figura 3 – La parte posteriore del modem.

In figura 4 troviamo il dettaglio che descriviamo qui di seguito.
Partendo da sinistra, troviamo l’attacco per la presa elettrica, a seguire una porta USB che permette il salvataggio dei dati, quindi fare di volta in volta un backup dei dati, le porte per collegare altri pc, una porta per l’ADSL da collegare al filtro (sempre incluso nella confezione), il pulsante reset, che permette di ripristinare lo stato iniziale del dispositivo, ed infine un pulsante per tenere acceso o spento il Wifi.



Figura 4 – Il dettaglio della parte posteriore


Come mostrato in figura 5, al primo utilizzo il modem avrà tre cavi, quello di alimentazione, uno di rete per collegare il modem al computer che permetterà di impostare le varie opzioni per la navigazione internet ed infine il cavo del telefono da collegare al filtro.


















Figura 5 – I vari collegamenti.

Installazione e configurazione.

Come in tutti i modem, al primo utilizzo va configurato, qui di seguito riportiamo la procedura di installazione e configurazione per un provider Infostrada con un computer dotato di Windows 10.

Dopo aver collegato il modem al filtro, e quest’ultimo alla presa del telefono (figura 6) , dobbiamo collegare il modem al computer, tramite il cavo di rete (colore giallo), infine una volta posizionati tutti i cavi lo colleghiamo alla presa elettrica, tramite l’alimentazione messa a disposizione.


Figura 6 – il filtro per gestire la linea telefonica e ADSL


Attendiamo qualche minuto, fino a quando le varie luce del modem non sono tutte accese (figura 7 ) tranne la penultima, quella con l’immagine della porta USB, che resterà spenta.


Figura 7 – Le Luci del dispositivo.

Attendiamo qualche minuto e nel nostro computer  verrà aperto il browser con una finestra che ci guiderà passo per passo alla configurazione.
Nel caso che non viene aperta automaticamente la finestra del browser, facciamo click sul browser Internet Explorer.
La prima finestra (figura 8) ci chiede se vogliamo utilizzare l’applicazione Genie come assistenza di aiuto oppure no.


Figura 8 – La prima pagina di configurazione.

Selezionando la voce “Yes” abbiamo la possibilità configurarlo in maniera automatica, tramite il software presente nel modem, nel caso che selezioniamo “No” dobbiamo impostare noi i vari parametri, quest’ultima scelta va utilizzata da chi ha dimestichezza in tale ambito.
Nel mio caso, la scelta è stata sulla voce “Yes”.
Dopo aver fatto “Click” sul pulsante “Next” , il sistema ci chiede la nazione in cui stiamo configurando il modem ed il provider.

Figura 9 – La scelta del provider e della nazione.

Come si vede in figura 9, l’opzione “Yes” è selezionato, in questo modo i parametri verranno configurati secondo le indicazioni che gli abbiamo fornito.
Nella pagina  successiva (figura 10) il sistema indicherà all’utente tramite schermata le impostazioni che sta configurando in maniera automatica.

Figura 10 – La configurazione automatica

Per alcuni Provider, per esempio “Wind” può richiedere i dati di accesso relative alle impostazioni PPPoE (figura 11) .

Figura 11 – I dati di login relativi al parametro PPPoE

Il consiglio che possiamo dare è quello che prima di iniziare la configurazione di farsi dare dal proprio provider, i vari parametri, non tutti però necessitano di login per il parametro “PPPoE”.
Per Wind, i parametri sono, benvenuto come login, ed ospite come password, il tutto come riportato in figura 12.

Figura 12 – I dati di accesso per il parametro PPPoE



A questo punto facciamo click sul pulsante “Next”,  verrà visualizzata una pagina che ci indica il caricamento delle impostazioni (figura 13, 14,15).

Figura 13 – La pagina di attesa della configurazione

 
Figura 14 – La pagina di attesa della configurazione


Figura 15 - La pagina di attesa della configurazione

Al termine della configurazione, verrà visualizzata una pagina con le informazioni della rete, il nome della rete e la password, il tutto come mostrato in figura 16.


Figura 16 – le indicazioni della rete

Ricordiamo che tali dati sono presenti anche nella parte inferiore del modem.
Scriviamo i dati che sono riportati in tale videata, da questo momento è possibile navigare in internet.
Se  si continua tramite il pulsante “Next” nella finestra successiva, ci chiede (figura 17) se vogliamo scaricare ed installare le app per la gestione della rete e per il backup dei file.


 
Figura 17 – Le app messe a disposizione

Se facciamo click sul pulsante “Next” verranno scaricate (figura 18).


Figura 18 – Il download delle app

Facciamo click sul pulsante “Next”, verrà chiesto se vogliamo aggiornare il firmware, che ricordiamo è un software molto importante che permette la gestione hardware del dispositivo.
Nella figura 19 vengono indicati le varie versioni.


Figura 19 – La pagina di aggiornamento de firmware

Consigliamo di aggiornare tale dispositivo, facendo click sul pulsante “Yes”.
A questo punto inizierà l’aggiornamento (figura 20 ).



Figura 20 – La finestra di aggiornamento.

A questo punto vedremo nei nostri computer, nella finestra delle reti wifi (figura 21)  la rete appena installata, denominata “NETGEAR32”.


Figura 21 – L’Elenco delle reti disponibili

La connessione tramite rete.

Il router dispone di un pulsante che permette lo spegnimento del WIFI, utile per chi vuole utilizzare una connessione di tipo “ethernet” ossia tramite cavo.
Se l’appartamento (oppure ufficio) dispone dell’impianto “Linea Dati” prese nel quale si possono collegare i cavi di rete, è possibile utilizzare il modem, anche senza l’ausilio del Wifi.
Dopo aver disattivato il Wifi, tramite il pulsante situato nella parte posteriore, colleghiamo i cavi di rete (nel nostro caso sono due per collegare le due stanze) tra il modem (figura 22) e la presa al muro.


Figura 22 – Il collegamento nella parte posteriore del modem.

I cavi di rete andranno collegati alla presa al muro, qualora l’appartamento o l’ufficio dispone di una linea dati, nella figura 23 vengono collegati i due cavi del modem, per portare la connessione internet in due stanze.


Figura 23 – Il collegamento alla linea dati.

In questo modo abbiamo in tutte le stanze la connessione internet.
Colleghiamo il cavo di rete al nostro computer (figura 24) ed il cavo alla presa dati (figura 25).


Figura 24 – collegamento tra computer e cavo di rete.



Figura 25 – Collegamento alla linea dati.

Nelle connessioni di rete, vedremo la connessione ad internet, con l’icona relativa alla connessione via cavo (figura 26) denominata “Rete”.




Figura 26 – Connessione tramite rete


Conclusioni
Ottimo dispositivo, affidabile con buone prestazioni. Tramite il segnale Wifi potente, rende questo modem utilizzabile anche in quelle case grandi o con pareti spesse che limitano il segnale nella maggior parte dei modem in commercio.
La possibilità di avere uno strumento che guida l’utente passo dopo passo alla configurazione per il primo accesso ad internet è prezioso, inoltre questo strumento è così semplice da facilitare a qualunque persona, anche quelli che si trovano per la prima volta ad installare un modem o che utilizzano da poco il computer.
L’aspetto negativo di tale dispositivo è la mancanza di un pulsante di spegnimento ed accensione del modem,  inoltre la mancanza della lingua italiana per la configurazione della internet, non facilita l’utilizzo per chi non ha dimestichezza con la lingua inglese, anche se in questa recensione/tutorial, abbiamo spiegato passo dopo passo le varie pagine messe a disposizione da questo programma, in modo da facilitare tale utilizzo.

martedì 19 aprile 2016

Indirizzo email temporaneo

Se state cercando un sito per creare un indirizzo di posta elettronica temporaneo, il seguente sito http://10minutemail.com/10MinuteMail/index.html offre la possibilità di avere per circa 10 minuti, un indnirizzo di posta elettronica.

In questo modo potete utilizzarlo per alcune operazioni, in cui non volete divulgare il vostro indirizzo email.

Il sito è in lingua inglese.

martedì 12 aprile 2016

Oracle group by con count che restituisce 0 se non trova valori

L'esempio di query qui di seguito, illustra una tecnica di come utilizzare le parole chiavi di SQL per raggruppare dei campi e rilevare tramite il count il numero degli elementi per quel campo, nel caso che non trova valori visualizza 0.

Qui di seguito la query


SELECT s.descrizione ,  count(B.ID) Quantita,  sum(B.importo) Totali

FROM TabellaS s LEFT JOIN (SELECT P.ID, importo FROM TabellaP P INNER JOIN TabellaT T ON P.IDT = T.IDT WHERE Data BETWEEN TO_DATE ('11/01/2013', 'dd/mm/yyyy')
AND TO_DATE ('11/022013', 'dd/mm/yyyy') ) B ON s.IDS = B.IDS

WHERE s.IDS IN (15,22,23,13,24,16,14)

GROUP BY s.descrizione 

ORDER BY s.descrizione



Ringrazio l'amico Luca, per la disponibilità e soprattutto per il supporto :-D