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
Android related to Cómo realizar OCR en Android en .NET MAUI

.NET MAUI (Interfaz de Usuario de Aplicación 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 tiene como objetivo simplificar el proceso de construir interfaces de usuario nativas que pueden ejecutarse en múltiples plataformas.

Para las empresas españolas que desarrollan aplicaciones móviles Android, IronOCR abre un amplio abanico de casos de uso regulatorios: escaneo de DNI (Documento Nacional de Identidad) y NIE (Número de Identidad de Extranjero) para procesos de onboarding digital, captura de facturas Facturae desde el móvil para su integración en aplicaciones de gestión empresarial, y lectura de tickets TicketBAI en puntos de venta móviles del País Vasco. La LOPDGDD es especialmente relevante en el contexto móvil: el procesamiento en el propio dispositivo (on-device) que ofrece IronOCR Android elimina la necesidad de enviar imágenes de documentos personales a servidores remotos, reduciendo drásticamente el riesgo de cumplimiento. Las directrices de la AEPD sobre aplicaciones móviles establecen que si el procesamiento puede realizarse localmente, debe preferirse esa opción frente a la transferencia a la nube. Los permisos de cámara y almacenamiento de Android deben solicitarse explicando al usuario la finalidad del tratamiento, conforme exige la LOPDGDD.

¡El paquete IronOcr.Android trae soporte de OCR a Android!

Paquete IronOCR para Android

El paquete IronOcr.Android habilita funciones de OCR en dispositivos Android a través de proyectos multiplataforma de .NET. No se necesita el paquete IronOCR estándar.

Paquete de instalación IronOcr.Android
Biblioteca C# NuGet para PDF

Instalar con NuGet

Paquete de instalación IronOcr.Android

Crear un proyecto .NET MAUI

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

Cree un proyecto de aplicación .NET MAUI

Incluir la biblioteca IronOcr.Android

La biblioteca se puede agregar de varias maneras. La más fácil es quizás usando NuGet.

  1. Dentro de Visual Studio, haz clic derecho en "Dependencias" y selecciona "Gestionar paquetes NuGet ...".
  2. Seleccione la pestaña "Examinar" y busque "IronOcr.Android".
  3. Seleccione el paquete "IronOcr.Android" y haga clic en "Instalar".

Descargue el paquete IronOcr.Android

Para evitar problemas con otras plataformas, modifica el archivo csproj para incluir el paquete solo cuando se apunte a la plataforma Android. Para hacerlo:

  1. Haga clic derecho en el proyecto y seleccione "Editar archivo del proyecto".
  2. Crea un nuevo elemento ItemGroup de la siguiente manera:

    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
    XML
  3. Mueva la referencia del paquete "IronOcr.Android" dentro del grupo de elementos que acabamos de crear.

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

Editar "MainActivity.cs"

  • Abra el archivo "MainActivity.cs" navegando a Plataformas -> Android.
  • Añada el método MainActivity e invoque el método Initialize.
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using IronOcr;

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()
        {
            // Initialize IronTesseract for OCR purposes
            IronTesseract.Initialize(this);
        }
    }
}
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using IronOcr;

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()
        {
            // Initialize IronTesseract for OCR purposes
            IronTesseract.Initialize(this);
        }
    }
}
Imports Android.App
Imports Android.Content.PM
Imports Android.Runtime
Imports Android.OS
Imports IronOcr

Namespace MAUIIronOCRAndroidSample
	<Activity(Theme := "@style/Maui.SplashTheme", MainLauncher := True, ConfigurationChanges := ConfigChanges.ScreenSize Or ConfigChanges.Orientation Or ConfigChanges.UiMode Or ConfigChanges.ScreenLayout Or ConfigChanges.SmallestScreenSize Or ConfigChanges.Density)>
	Public Class MainActivity
		Inherits MauiAppCompatActivity

		Public Sub New()
			' Initialize IronTesseract for OCR purposes
			IronTesseract.Initialize(Me)
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

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 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"

Primero, cree una instancia del objeto IronTesseract. Asegúrese de que IronTesseract se inicialice una vez dentro de la clase, como se muestra en el código a continuación. Instanciarlo dentro de un método puede ser ineficaz y puede causar errores inesperados.

Luego, utilice el método FilePicker.PickAsync para seleccionar un archivo, luego abra un flujo de lectura desde el FileResult. Cree un nuevo objeto OcrInput y cargue la imagen en él. Realiza OCR en la imagen usando la instancia Tesseract y recupera el texto. Finalmente, muestre el texto resultante en una etiqueta.

using IronOcr;
using Microsoft.Maui.Controls;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

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

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

        private async void ReadFileOnImport(object sender, EventArgs e)
        {
            try
            {
                // Configure the file picker
                var options = new PickOptions
                {
                    PickerTitle = "Please select a file"
                };

                // Await user's file selection
                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 for OCR processing
                    ocrInput.AddImage(stream);
                    // Perform OCR
                    var ocrResult = ocrTesseract.Read(ocrInput);
                    // Display extracted text
                    OutputText.Text = ocrResult.Text;
                }
            }
            catch (Exception ex)
            {
                // Log and handle exceptions
                Debug.WriteLine(ex);
            }
        }
    }
}
using IronOcr;
using Microsoft.Maui.Controls;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

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

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

        private async void ReadFileOnImport(object sender, EventArgs e)
        {
            try
            {
                // Configure the file picker
                var options = new PickOptions
                {
                    PickerTitle = "Please select a file"
                };

                // Await user's file selection
                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 for OCR processing
                    ocrInput.AddImage(stream);
                    // Perform OCR
                    var ocrResult = ocrTesseract.Read(ocrInput);
                    // Display extracted text
                    OutputText.Text = ocrResult.Text;
                }
            }
            catch (Exception ex)
            {
                // Log and handle exceptions
                Debug.WriteLine(ex);
            }
        }
    }
}
Imports IronOcr
Imports Microsoft.Maui.Controls
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Threading.Tasks

Namespace MAUIIronOCRAndroidSample
	Partial Public Class MainPage
		Inherits ContentPage

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

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

		Private Async Sub ReadFileOnImport(ByVal sender As Object, ByVal e As EventArgs)
			Try
				' Configure the file picker
				Dim options = New PickOptions With {.PickerTitle = "Please select a file"}

				' Await user's file selection
				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 for OCR processing
					ocrInput.AddImage(stream)
					' Perform OCR
					Dim ocrResult = ocrTesseract.Read(ocrInput)
					' Display extracted text
					OutputText.Text = ocrResult.Text
				End If
			Catch ex As Exception
				' Log and handle exceptions
				Debug.WriteLine(ex)
			End Try
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

Por último, en el archivo .csproj, asegúrese de que solo está compilando el proyecto para Android. Dado que el paquete que agregamos es solo para Android, compilar el proyecto para todas las plataformas fallará.

Ejecutar el proyecto

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

Execute .NET MAUI App project

Descargar proyecto de aplicación .NET MAUI

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

Haga clic aquí para descargar el proyecto.

Consideraciones de cumplimiento para aplicaciones Android en España

Al distribuir tu aplicación Android con OCR en el mercado español, ten en cuenta los siguientes requisitos regulatorios:

Permisos Android y LOPDGDD: los permisos CAMERA y READ_EXTERNAL_STORAGE que requiere IronOCR deben solicitarse con una explicación clara de la finalidad del tratamiento conforme a la LOPDGDD. Si la aplicación escanea documentos de identidad (DNI, NIE, TIE), el aviso debe indicar explícitamente que las imágenes no se transmiten a ningún servidor.

DNI, NIE y TIE: IronOCR Android puede leer la Zona de Lectura Mecánica (MRZ) de documentos de identidad españoles (DNI, NIE, TIE — Tarjeta de Identidad de Extranjero) aprovechando el modo de reconocimiento optimizado para documentos de identidad. Los datos extraídos de la MRZ incluyen número de documento, fecha de nacimiento, fecha de caducidad y nacionalidad.

TicketBAI en punto de venta móvil: las aplicaciones de TPV (Terminal Punto de Venta) para el País Vasco deben leer el código QR de TicketBAI de los tickets emitidos. IronOCR Android gestiona esta lectura de forma nativa mediante su funcionalidad de detección de códigos de barras (ReadBarCodes = true).

Facturae en movilidad: los comerciales y autónomos que necesitan capturar facturas de proveedor desde su teléfono Android pueden utilizar IronOCR para extraer los campos fiscales clave (NIF del proveedor, base imponible, tipo y cuota de IVA) directamente en el dispositivo, sin enviar la imagen a la nube, cumpliendo así con los principios de minimización de datos de la LOPDGDD.

Uso de IronOcr.Android en Avalonia

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

Si desea realizar OCR en iOS, navegue al siguiente artículo para obtener más información: "Cómo realizar OCR en iOS en .NET MAUI"

Preguntas Frecuentes

¿Cómo puedo realizar OCR en Android en una aplicación .NET MAUI?

Para realizar OCR en Android usando .NET MAUI, instala el paquete IronOcr.Android vía NuGet en Visual Studio. Utiliza la clase IronTesseract para procesar imágenes y extraer texto. Asegúrate de que tu proyecto esté configurado para dirigirse a Android modificando adecuadamente el archivo .csproj.

¿Cuál es el propósito del paquete IronOcr.Android?

El paquete IronOcr.Android está diseñado específicamente para llevar capacidades de OCR a dispositivos Android dentro de proyectos .NET MAUI. Simplifica la integración de características de reconocimiento de texto en aplicaciones multiplataforma dirigidas a Android.

¿Cómo configuro un proyecto .NET MAUI para OCR en Android?

Configura tu proyecto .NET MAUI instalando el paquete IronOcr.Android a través de NuGet. Ajusta el archivo .csproj para dirigirte a Android creando un nuevo elemento ItemGroup y moviendo la referencia de paquete IronOcr.Android dentro de él. Esto evita problemas de construcción para otras plataformas.

¿Qué modificaciones se necesitan en MainActivity.cs para la configuración de OCR?

En el archivo MainActivity.cs bajo Platforms -> Android, añade el método MainActivity y llama al método Initialize de IronTesseract. Esto establece las capacidades de OCR necesarias para procesar texto de imágenes.

¿Cómo puedo editar MainPage.xaml para incorporar características de OCR?

Edita MainPage.xaml para incluir un botón para importar archivos y una etiqueta para mostrar los resultados del OCR. Define los elementos de interfaz de usuario necesarios para interactuar con la lógica de procesamiento de OCR y gestionar eficazmente la entrada del usuario.

¿Qué debo hacer si encuentro errores durante el procesamiento de OCR?

Utiliza bloques try-catch alrededor de tu código de procesamiento de OCR para manejar excepciones. Registra cualquier error empleando Debug.WriteLine u otro mecanismo de registro para ayudar a diagnosticar y solucionar problemas.

¿Es posible usar el paquete IronOcr.Android en proyectos Avalonia?

Sí, el paquete IronOcr.Android se puede usar en proyectos Avalonia con un proceso de configuración similar al de .NET MAUI. Ajusta la configuración del proyecto en consecuencia para habilitar la funcionalidad OCR.

¿Dónde puedo encontrar un proyecto de muestra completo para OCR en Android usando .NET MAUI?

Un proyecto de muestra completo para OCR en Android usando la biblioteca IronOCR en .NET MAUI está disponible para descargar a través de un enlace proporcionado en la guía. El proyecto viene como un archivo comprimido, listo para abrirse en Visual Studio.

¿Cómo aseguro que el paquete IronOcr.Android solo apunte a Android en un proyecto multiplataforma?

Para asegurar que el paquete IronOcr.Android solo apunte a Android, modifica el archivo .csproj creando un ItemGroup condicional para Android y moviendo la referencia de paquete IronOcr.Android dentro de él. Esto previene conflictos al construir para otras plataformas.

¿Cómo garantizar el cumplimiento LOPDGDD al escanear DNI o NIE con IronOCR en Android?

Para cumplir con la LOPDGDD al escanear documentos de identidad en Android: (1) usa el procesamiento on-device de IronOCR Android para que las imágenes no abandonen el dispositivo; (2) solicita los permisos de cámara con una explicación clara de la finalidad del tratamiento (art. 13 LOPDGDD); (3) extrae únicamente los campos necesarios para la finalidad declarada (número de documento, fecha de caducidad) descartando datos biométricos o fotografía; (4) no persistas la imagen del documento más allá de lo necesario para completar el proceso de verificación.

¿Se puede leer el código QR de TicketBAI con IronOCR en una aplicación Android de TPV?

Sí. Activa ocrTesseract.Configuration.ReadBarCodes = true antes de realizar el OCR. IronOCR Android detectará y decodificará el código QR de TicketBAI presente en el ticket impreso. El valor decodificado contiene el identificador único del ticket que debe almacenarse conforme a la normativa TicketBAI del País Vasco para garantizar la trazabilidad de las operaciones.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 5,896,332 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.