In questo articolo vedremo come effettuare la scansione dei documenti, o meglio la gestione dello scanner per poter gestire le varie scansioni dei documenti, tramite il linguaggio di programmazione C# ed il componente gratuito Naps2, che permette la gestione dello scanner ed OCR.
La versione del framework che useremo è il .Net 8, con l’ambiente di sviluppo Visual Studio 2022, in ambito di Windows Application.
Realizzeremo una semplice applicazione di tipo “Windows Forms”, con un pulsante ed un controllo per la visualizzazione dell’immagine della scansione effettuata, il tutto come mostrato in figura 1.
Figura 1 – La form con i vari controlli.
Creazione del progetto
Si crea un nuovo progetto in Visual Studio 2022 Community o versione successiva, selezionando tra i vari modelli quello “App Windows Forms”, dopo averlo selezionare fare click sul pulsante “Avanti” , impostare un nome e percorso del progetto di proprio interesse, e nella finestra successiva, selezionare l’ultima versione del framework, nel momento in cui stiamo scrivendo l’articolo la versione è la .Net 8. Fare click sul pulsante “Crea”.
A questo punto verrà creato un progetto di tipo Windows Forms, con una form, inserire un controllo di tipo “button”, impostando la proprietà “Name” con il valore “BtnScanner”, e la proprietà “Text” con il valore “Scansione” . Questo pulsante permetterà di effettuare la scansione del documento nello scanner. Aggiungere alla form, un controllo di tipo “PictureBox” impostando la proprietà “Name” con il valore “pctImmagine”, la form sarà come quella riportata in figura 1.
Terminata la parte della predisposizione dei controlli, dobbiamo aggiungere tramite Nuget, la libreria “Naps2”, che tramite le varie classi ci permetterà di effettuare la scansione dei documenti, aggiungere il riferimento a Linq.Async per le operazioni asincrone di “Ling”, il tutto come riportato in figura 2.
Figura 2 – I riferimenti a Naps2 e Linq Async
Stesura del codice
Terminata la creazione del progetto e dopo aver aggiunto le librerie per la gestione dello scanner, non resta che scrivere il codice per effettuare la scansione.
Passiamo in visualizzazione codice, ed in alto sopra ad ogni dichiarazione dobbiamo inserire lo spazio dei nomi per l’utilizzo delle varie classi.
In alto inseriamo gli spazio dei nomi delle librerie.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
using NAPS2.Images;
using NAPS2.Pdf;
using NAPS2.Scan;
using NAPS2.Images.Gdi;
Continuando a rimanere in modalità codice, nella parte che riguarda la classe form, si crea una funzione di tipo “Asincona” la quale sarà richiamata dal pulsante.
Questa funzione effettuerà la scansione impostando il primo scanner disponibile e salva nel percorso dove viene eseguito l’applicativo, un file immagine riguardante la scansione.
La scansione è asincrona in modo che attende la fine della scansione per concludere le varie operazioni.
Tramite la classe scanController viene eseguita la scansione con il metodo “Scan”, passando alcune impostazioni.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
private async Task ScansioneAsync ()
{
try
{
//Creo l'oggetto per la scansione
using var scanningContext = new ScanningContext( new GdiImageContext());
var controllerScan = new ScanController(scanningContext);
//Rilevo i dispositivi di tipo scanner disponibili
var dispositivi = await controllerScan.GetDeviceList();
//Configuro le varie impostazioni con il dispositivo scanner disponibile
var opzioni = new ScanOptions
{
Device = dispositivi.First(),
PaperSource = PaperSource.Auto,
PageSize = PageSize.A4,
Dpi = 300
};
//Salvo la scansione in un file immagine
await foreach (var image in controllerScan.Scan(opzioni))
{
image.Save( "Scansione.jpg");
}
//Visualizzo a video l'immagine
pctImmagine.Image = Image.FromFile(Environment.CurrentDirectory + "\\Scansione.jpg");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Torniamo in visualizzazione grafica, e facciamo doppio click sul pulsante, in modo da passare in visualizzazione codice nell’evento click del controllo.
In questo evento verrà richiamata la funzione appena creata.
Di seguito si riporta il frammento di codice nel linguaggio C#.
C#
private async void BtnScanner_Click(object sender, EventArgs e)
{
await ScansioneAsync();
}
Nel caso che invece si vuole salvare il file in formato pdf e non immagine, utilizzare il metodo “Export” della classe “PdfExporter” che permette di salvare in formato pdf.
Di seguito si riporta la funzione per salvare la scansione in un file formato “Pdf” nella stessa cartella dove viene eseguito l’applicativo .
C#
private async Task ScansioneAsync ()
{
try
{
//Creo l'oggetto per la scansione
using var scanningContext = new ScanningContext( new GdiImageContext());
var controllerScan = new ScanController(scanningContext);
//Rilevo i dispositivi di tipo scanner disponibili
var dispositivi = await controllerScan.GetDeviceList();
//Configuro le varie impostazioni con il dispositivo scanner disponibile
var opzioni = new ScanOptions
{
Device = dispositivi.First(),
PaperSource = PaperSource.Auto,
PageSize = PageSize.A4,
Dpi = 300
};
//Salvo la scansione in un file pdf
var pagina = await controllerScan.Scan(opzioni).ToListAsync();
var filePdf = new PdfExporter(scanningContext);
await filePdf.Export("Scansione.pdf", pagina);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Conclusioni
L’articolo ha voluto fornire al lettore l’utilizzo base della libreria “Naps2” che fornisce interessanti classi e funzionalità per la gestione dello scanner.
Sempre più lo scanner diviene elemento essenziale nei progetti gestionali, in particolare nella gestione documentale. La libreria offre funzionalità anche per utilizzi avanzati e per diversi sistemi operativi, non solo Windows.
Questa libreria semplifica la scrittura di codice dell’utilizzo dello scanner, e fornisce al programmatore funzionalità avanzate ed al tempo stesso facilità la stesura del codice.
Nel sito del progetto, visibile qui https://www.naps2.com/ è possibile scaricare un applicativo per effettuare la scansione ed operazioni OCR nel rilevare il testo nelle immagini.