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

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

查克尼特·宾

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

IronOcr.Android软件包**为Android带来了OCR支持!!

IronOCR 安卓软件包

IronOcr.Android软件包**可通过.NET跨平台项目在Android设备上实现OCR功能。无需使用 IronOCR 软件包。

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

安装使用 NuGet

安装软件包 IronOcr.Android

创建一个 .NET MAUI 项目

打开 Visual Studio,点击 "创建新项目"。搜索 MAUI,选择 .NET MAUI App,然后点击 "下一步"。

创建 .NET MAUI 应用程序项目

加入 IronOCR.Android 库

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

1.在 Visual Studio 中,右键单击 "依赖项",然后选择 "管理 NuGet 包..."。

2.选择 "浏览 "选项卡并搜索 "IronOcr.Android"。

3.选择 "IronOcr.Android "软件包并点击 "安装"。

下载 IronOcr.Android 软件包

为防止其他平台出现问题,请修改 csproj 文件,使其仅在针对 Android 平台时包含软件包。为此,请

1.右键单击项目,选择 "编辑项目文件"。

2.创建一个新的 ItemGroup 元素:

    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
XML

3.将 "IronOcr.Android "PackageReference 移到我们刚刚创建的 ItemGroup 中。

上述步骤将防止 "IronOcr.Android "软件包在 iOS 等平台上使用 (为此,安装 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 在类中被初始化一次,如下面的代码所示。在方法中初始化 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 应用程序项目

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

点击此处下载项目。

在 Avalonia 中使用 IronOcr.Android

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

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