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.

Nessun commento: