Cómo realizar OCR en Android en .NET MAUI

This article was translated from English: Does it need improvement?
Translated
View the article in English

por Chaknith Bin

.NET MAUI (Interfaz de usuario multiplataforma) es una evolución del marco Xamarin.Forms, diseñado para crear aplicaciones multiplataforma para Android, iOS, macOS y Windows utilizando .NET. .NET MAUI pretende simplificar el proceso de creación de interfaces de usuario nativas que puedan ejecutarse en múltiples plataformas.

El paquete IronOcr.Android ofrece compatibilidad con OCR en Android!!

Paquete IronOCR para Android

El paquete IronOcr.Android habilita las funciones de OCR en dispositivos Android a través de proyectos multiplataforma .NET. El paquete IronOCR no es necesario.

PM > Install-Package IronOcr.Android
Biblioteca NuGet de C# para PDF

Instalar con NuGet

Install-Package IronOcr.Android

Crear un proyecto .NET MAUI

Abra Visual Studio y haga clic en "Crear un nuevo proyecto". Busca MAUI, selecciona .NET MAUI App y "Siguiente".

Crear proyecto de aplicación .NET MAUI

Incluir la biblioteca IronOCR.Android

La biblioteca puede añadirse de varias maneras. La forma más sencilla es quizás utilizando NuGet.

  1. Dentro de Visual Studio, haga clic con el botón derecho en "Dependencias" y seleccione "Administrar paquetes NuGet ...".

  2. Seleccione la pestaña "Examinar" y busque "IronOcr.Android".

  3. Seleccione el paquete "IronOcr.Android" y haga clic en "Instalar".

    Descargar el paquete IronOcr.Android

    Para evitar problemas con otras plataformas, modifique el archivo csproj para que sólo incluya el paquete cuando se dirija a la plataforma Android. Para ello:

  4. Haga clic con el botón derecho en el proyecto y seleccione "Editar archivo de proyecto".

  5. Cree un nuevo elemento ItemGroup como tal:
    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
XML
  1. Mueve el PackageReference "IronOcr.Android" dentro del ItemGroup que acabamos de crear.

    Los pasos anteriores evitarán que el paquete "IronOcr.Android" se utilice, por ejemplo, en plataformas iOS (para ello, instale IronOcr.iOS en su lugar).

Editar "MainActivity.cs"

  • Abra el archivo "MainActivity.cs" navegando a Plataformas -> Android.
  • Añade el método MainActivity e invoca el método Initialize.
namespace MAUIIronOCRAndroidSample
{
    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize 
 ConfigChanges.Orientation 
 ConfigChanges.UiMode 
 ConfigChanges.ScreenLayout 
 ConfigChanges.SmallestScreenSize 
 ConfigChanges.Density)]
    public class MainActivity : MauiAppCompatActivity
    {
        public MainActivity()
        {
            IronTesseract.Initialize(this);
        }
    }
}
namespace MAUIIronOCRAndroidSample
{
    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize 
 ConfigChanges.Orientation 
 ConfigChanges.UiMode 
 ConfigChanges.ScreenLayout 
 ConfigChanges.SmallestScreenSize 
 ConfigChanges.Density)]
    public class MainActivity : MauiAppCompatActivity
    {
        public MainActivity()
        {
            IronTesseract.Initialize(this);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Editar "MainPage.xaml"

Edite el archivo XAML para mostrar un botón y una etiqueta para mostrar el resultado del OCR. Por ejemplo:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MAUIIronOCRAndroidSample.MainPage">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button
            Text="Import File"
            Clicked="ReadFileOnImport"
            Grid.Row="0"
            HorizontalOptions="Center"
            Margin="20, 20, 20, 10"/>

        <ScrollView
            Grid.Row="1"
            BackgroundColor="LightGray"
            Padding="10"
            Margin="10, 10, 10, 30">
            <Label x:Name="OutputText"/>
        </ScrollView>
    </Grid>

</ContentPage>
XML

Editar "MainPage.xaml.cs"

En primer lugar, cree una instancia del objeto IronTesseract. Asegúrese de que IronTesseract se inicializa una vez dentro de una clase, como se demuestra en el código siguiente. Instanciarlo dentro de un método puede resultar ineficaz y provocar errores inesperados.

A continuación, utiliza el método FilePicker.PickAsync para seleccionar un archivo, luego abre un flujo de lectura desde el FileResult. Crea un nuevo objeto OcrInput y carga la imagen en él. Realiza el OCR en la imagen utilizando la instancia tesseract y recupera el texto. Por último, muestre el texto resultante en una etiqueta.

Tenga en cuenta que la aplicación actual sólo admite archivos de imagen. El paquete aún no admite documentos PDF. Por lo tanto, cualquier configuración relacionada con PDF está desactivada por defecto y debe permanecer así.

using IronOcr;

namespace MAUIIronOCRAndroidSample;

public partial class MainPage : ContentPage
{
    // Initialize IronTesseract once in a class
    private IronTesseract ocrTesseract = new IronTesseract();

    public MainPage()
    {
        InitializeComponent();
        // Apply License key
        IronOcr.License.LicenseKey = "IRONOCR.MYLICENSE.KEY.1EF01";
    }

    private async void ReadFileOnImport(object sender, EventArgs e)
    {
        try
        {
            var options = new PickOptions
            {
                PickerTitle = "Please select a file"
            };
            var result = await FilePicker.PickAsync(options);
            if (result != null)
            {
                using var stream = await result.OpenReadAsync();
                // Instantiate OcrInput
                using var ocrInput = new OcrInput();
                // Load image stream
                ocrInput.LoadImage(stream);
                // Perform OCR
                var ocrResult = ocrTesseract.Read(ocrInput);
                OutputText.Text = ocrResult.Text;
            }
        }
        catch (Exception ex)
        {
            // Handle exceptions
            System.Diagnostics.Debug.WriteLine(ex);
        }
    }
}
using IronOcr;

namespace MAUIIronOCRAndroidSample;

public partial class MainPage : ContentPage
{
    // Initialize IronTesseract once in a class
    private IronTesseract ocrTesseract = new IronTesseract();

    public MainPage()
    {
        InitializeComponent();
        // Apply License key
        IronOcr.License.LicenseKey = "IRONOCR.MYLICENSE.KEY.1EF01";
    }

    private async void ReadFileOnImport(object sender, EventArgs e)
    {
        try
        {
            var options = new PickOptions
            {
                PickerTitle = "Please select a file"
            };
            var result = await FilePicker.PickAsync(options);
            if (result != null)
            {
                using var stream = await result.OpenReadAsync();
                // Instantiate OcrInput
                using var ocrInput = new OcrInput();
                // Load image stream
                ocrInput.LoadImage(stream);
                // Perform OCR
                var ocrResult = ocrTesseract.Read(ocrInput);
                OutputText.Text = ocrResult.Text;
            }
        }
        catch (Exception ex)
        {
            // Handle exceptions
            System.Diagnostics.Debug.WriteLine(ex);
        }
    }
}
Imports IronOcr

Namespace MAUIIronOCRAndroidSample

	Partial Public Class MainPage
		Inherits ContentPage

		' Initialize IronTesseract once in a class
		Private ocrTesseract As New IronTesseract()

		Public Sub New()
			InitializeComponent()
			' Apply License key
			IronOcr.License.LicenseKey = "IRONOCR.MYLICENSE.KEY.1EF01"
		End Sub

		Private Async Sub ReadFileOnImport(ByVal sender As Object, ByVal e As EventArgs)
			Try
				Dim options = New PickOptions With {.PickerTitle = "Please select a file"}
				Dim result = Await FilePicker.PickAsync(options)
				If result IsNot Nothing Then
					Dim stream = Await result.OpenReadAsync()
					' Instantiate OcrInput
					Dim ocrInput As New OcrInput()
					' Load image stream
					ocrInput.LoadImage(stream)
					' Perform OCR
					Dim ocrResult = ocrTesseract.Read(ocrInput)
					OutputText.Text = ocrResult.Text
				End If
			Catch ex As Exception
				' Handle exceptions
				System.Diagnostics.Debug.WriteLine(ex)
			End Try
		End Sub
	End Class
End Namespace
VB   C#

Por último, en el archivo .csproj, asegúrese de que sólo está construyendo el proyecto para Android. Dado que el paquete que hemos añadido es sólo para Android, la construcción del proyecto para todas las plataformas fallará.

Ejecutar el proyecto

Esto le mostrará cómo ejecutar el proyecto y realizar el OCR.

Ejecutar proyecto .NET MAUI App

Descargar proyecto de aplicación .NET MAUI

Puedes descargar el código completo de esta guía. Viene como un archivo comprimido que puedes abrir en Visual Studio como un proyecto de aplicación .NET MAUI.

Haga clic aquí para descargar el proyecto.

Uso de IronOcr.Android en Avalonia

Similar a MAUI, IronOcr.Android puede ser utilizado en un proyecto Avalonia con la misma configuración descrita anteriormente.

Si quieres realizar OCR en iOS, navega hasta el siguiente artículo para obtener más información: "Cómo realizar OCR en iOS en .NET MAUI"