如何在 .NET MAUI 中对 Android 执行 OCR

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

查克尼特·宾

Android related to 如何在 .NET MAUI 中对 Android 执行 OCR

.NET MAUI(多平台应用程序用户界面)是Xamarin.Forms框架的发展,旨在使用.NET为Android、iOS、macOS和Windows创建跨平台应用程序。 .NET MAUI 旨在简化构建可在多个平台上运行的原生用户界面的过程。

IronOCR.Android包为安卓提供了OCR支持。!!

IronOCR Android 包

IronOcr.Android 包通过 .NET 跨平台项目在 Android 设备上启用 OCR 功能。 vanilla IronOCR 包不需要。

PM > Install-Package IronOcr.Android
适用于PDF的C# NuGet库

安装使用 NuGet

安装软件包 IronOcr.Android

创建一个 .NET MAUI 项目

打开 Visual Studio 并点击“创建新项目”。 搜索 MAUI,选择 .NET MAUI 应用程序然后点击“下一步”。

创建 .NET MAUI 应用程序项目

包含 IronOCR.Android 库

可以通过多种方式添加库。 或许使用 NuGet 是最简单的方式。

  1. 在 Visual Studio 中,右键单击“依赖项”并选择“管理 NuGet 包...”。

  2. 选择“浏览”标签并搜索“IronOcr.Android”。

  3. 选择“IronOcr.Android”包并点击“安装”。

    下载 IronOcr.Android 软件包

    为了防止与其他平台发生问题,请修改 csproj 文件,使其仅在针对 Android 平台时包含该软件包。 为了做到这一点:

  4. 右键单击项目并选择“编辑项目文件”。

  5. 创建一个新的 ItemGroup 元素,如下所示:
    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
XML
  1. 将“IronOcr.Android” PackageReference 移至我们刚刚创建的 ItemGroup 内。

    上述步骤将防止在例如 iOS 平台上使用“IronOcr.Android”包。(为此,安装IronOcr.iOS而是).

编辑 "MainActivity.cs"

  • 打开 Platforms -> Android 下的 "MainActivity.cs" 文件。
  • MainActivity 方法添加并调用 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#

编辑“MainPage.xaml”

编辑 XAML 文件以显示一个按钮和一个标签来显示 OCR 结果。 例如

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

编辑“MainPage.xaml.cs”

首先,创建一个 IronTesseract 对象的实例。 确保在一个类中只初始化一次IronTesseract,如下面的代码所示。 在方法中实例化它可能会低效,并可能导致意外错误。

接下来,使用 FilePicker.PickAsync 方法选择一个文件,然后从 FileResult 中打开一个读取流。 创建一个新的 OcrInput 对象并将图像加载到其中。 使用 tesseract 实例对图像进行 OCR 并检索文本。 最后,在标签中显示结果文本。

请注意,当前实现仅支持图像文件。 该软件包尚不支持PDF文档。 因此,默认情况下,任何与PDF相关的配置都是禁用的,并且应该保持禁用状态。

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#

最后,在 .csproj 文件中,请确保只为 Android 构建项目。 由于我们添加的包仅适用于Android,因此为所有平台构建项目将失败。

运行项目

这将向您展示如何运行项目并执行OCR。

执行 .NET MAUI 应用程序项目

下载 .NET MAUI 应用程序项目

您可以下载本指南的完整代码。它以压缩文件的形式提供,您可以将其作为.NET MAUI App项目在Visual Studio中打开。

点击此处下载项目。

使用 IronOcr.Android 在 Avalonia 中

与MAUI类似,IronOcr.Android可以在Avalonia项目中使用,设置方式与上述相同。

如果您想在 iOS 上执行 OCR,请前往以下文章了解更多信息:"如何用 .NET MAUI 在 iOS 上执行 OCR"