.Net Rilevare il testo di una immagine QrCode in un file PDF VB.Net C#

In questo articolo viene illustrata una tecnica di come rilevare il testo presente in un'immagine "QrCode" situata in un file "Pdf", il tutto tramite le librerie ITextSharp e Zxing.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

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.