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");
}
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:
Posta un commento