如何在 .NET MAUI 中在 Android 上執行 OCR

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

查克尼思·賓

.NET MAUI (跨平台應用程式使用者介面) 是一個Xamarin.Forms框架的進化版,旨在使用.NET創建適用於Android、iOS、macOS和Windows的跨平台應用程式。 .NET MAUI旨在簡化構建可在多個平台上運行的本地用戶界面的過程。

IronOCR.Android package為Android帶來了OCR支持。!!

IronOCR Android 套件

IronOcr.Android 套件 透過 .NET 跨平台專案在 Android 設備上實現OCR功能。不需要使用原生的 IronOCR 套件。

PM > Install-Package IronOcr.Android
用於 PDF 的 C# NuGet 程式庫

安裝與 NuGet

Install-Package IronOCR.Android

建立 .NET MAUI 專案

打開 Visual Studio,點擊「建立新專案」。搜尋 MAUI,選擇 .NET MAUI 應用程式並點擊「下一步」。

建立 .NET MAUI 應用程式專案

包含 IronOCR.Android 库

該庫可以通過多種方式添加。最簡單的方法是使用 NuGet。

  1. 在 Visual Studio 中,右鍵單擊“Dependencies”,並選擇“Manage NuGet Packages ...”。
  2. 選擇“Browse”選項卡並搜索“IronOcr.Android”。
  3. 選擇“IronOcr.Android”包並點擊“Install”。

下載IronOcr.Android軟體包

為了防止與其他平台發生問題,請修改 csproj 檔案,使其只在目標為 Android 平台時才包含該套件。請按如下步驟進行:

  1. 右鍵點擊專案並選擇「編輯專案檔案」。

  2. 新建一個 ItemGroup 元素,如下所示:
    <ItemGroup Condition="$(TargetFramework.Contains('android')) == true">
    </ItemGroup>
XML
  1. 將 "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,如下面代碼所示。在方法內實例化它可能無效,並且可能導致意外錯誤。

接下來,使用 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 App 專案

下載 .NET MAUI App 專案

您可以下載本指南的完整代碼。它是一個壓縮文件,可以在 Visual Studio 中作為 .NET MAUI App 專案打開。

點擊這裡下載專案。

在 Avalonia 中使用 IronOcr.Android

與 MAUI 相似,可以在 Avalonia 專案中使用 IronOcr.Android,設置方式如上所述。

如果您想在 iOS 上執行 OCR,請瀏覽以下文章以了解更多資訊:"如何在 .NET MAUI 中在 iOS 上執行 OCR請提供您想要翻譯的內容。