跳至頁尾內容
使用 IRONBARCODE

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK

隨著行動技術的興起,Scanbot SDK 和原生 SDK 等文件掃描應用程式已成為個人和企業不可或缺的工具。 在本教學中,我們將探討如何使用最新版本的 .NET 多平台應用程式 UI (MAUI) 和 IronOCR(一個功能強大的 .NET OCR(光學字元辨識)函式庫)來建立一個文件掃描應用程式。 .NET MAUI 簡化了跨平台行動應用程式的創建,確保在 Android 等裝置上無縫部署。 看完本指南,您將能夠開發自己的文件掃描 SDK 應用程序,輕鬆地從圖像和掃描文件中提取文字。

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK

  1. 安裝IronOCR C# 庫以使用文件掃描器 SDK。
  2. 設計一個包含必要控制項的 .NET MAUI 表單。
  3. 使用MediaPicker.CapturePhotoAsync方法拍照。
  4. 將拍攝的照片轉換為串流
  5. 將流傳遞給 OcrInput LoadImage方法。
  6. 使用 IronTesseract Read方法執行 OCR。
  7. 使用 OcrResult Text屬性顯示文件文字。

IronOCR - C# OCR 庫

IronOCR是由 Iron Software, LLC 開發的尖端光學字元辨識 (OCR) 軟體,旨在準確且有效率地將影像和掃描文件轉換為可編輯的文字。 OCR 技術徹底改變了企業處理文件的方式,讓從掃描文件、PDF 和影像等各種來源提取有價值的資訊變得更加容易。

IronOCR憑藉其先進的功能、強大的性能和易於整合的特點,在眾多OCR解決方案中脫穎而出。 無論您是希望將 OCR 功能整合到應用程式中的開發人員,還是希望簡化文件管理流程的企業,IronOCR 都能提供全面的解決方案。

IronOCR的主要特點

1.高精度: IronOCR 採用最先進的演算法和機器學習技術,在文字辨識方面實現了卓越的精度。 它可以準確地從複雜文件中提取文本,包括低解析度影像或品質差的掃描件。 2.多語言支援: IronOCR 支援 125 多種語言的文字識別,使其適用於在多元語言環境中經營的企業。 3.影像預處理: IronOCR 提供各種影像預處理功能,如降噪、對比度調整和傾斜校正,以提高準確性。 這些技術可以改善 OCR 結果,尤其是在處理失真或不完美的影像時。 4.支援多種文件格式: IronOCR 支援多種文件格式,包括 TIFF、JPEG、PNG 和 PDF,確保與不同文件來源的兼容性。 5.自訂選項:開發人員可以自訂 IronOCR 的行為以滿足特定要求,從而在識別參數和工作流程整合方面提供靈活性。 6.快速且可擴展: IronOCR 針對效能進行了最佳化,可從大量文件中快速提取文字。 其可擴展架構確保了無縫運行,無論文件量如何。 7.與 .NET 應用程式整合: IronOCR 與 .NET 應用程式無縫集成,提供易於使用的 API 以集成 OCR 功能。 這簡化了開發流程,加快了支援 OCR 功能的應用程式的上市速度。 8.文件分類和資料提取:除了基本的文字識別之外,IronOCR 還提供了文件分類和資料提取的高級功能,可以識別名稱、地址或發票號碼等特定資料欄位。

先決條件

  • 具備C#程式設計基礎。
  • 安裝了 Visual Studio 2022 和 .NET MAUI 工作負載。
  • 透過 NuGet 套件管理器安裝 IronOCR 套件庫。

1. 設定您的 .NET MAUI 項目

  • 開啟 Visual Studio 2022 並建立一個新的 .NET MAUI 應用程式專案。

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 1 - .NET MAUI 應用程式項目

  • 選擇合適的項目名稱並配置項目設定。

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 2 - 專案配置

  • 確保您已安裝目標平台裝置開發所需的 Android 和 iOS SDK。

2. 安裝 IronOCR 庫

  • 在 Visual Studio 中右鍵點選您的解決方案。
    • 選擇"管理解決方案的 NuGet 套件",然後在"瀏覽"標籤中搜尋"IronOCR"。

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 3 - IronOCR NuGet 套件

  • 將 IronOCR 庫安裝到您的專案中。

3. 設計使用者介面

讓我們先來設計 MainPage.xaml 的佈局。 我們將創建一個簡單的佈局,其中包含一個用於顯示所拍攝照片的圖像控制項、一個用於拍照的"拍攝"按鈕和一個用於顯示提取文字的標籤。

以下是 MainPage.xaml 的 XAML 程式碼:

<?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"
             xmlns:d="http://schemas.microsoft.com/dotnet/2021/maui/design"
             x:Class="DocumentScanner.MainPage">
    <ScrollView>
        <VerticalStackLayout Padding="30,0" Spacing="25">
            <Image Source="dotnet_bot.png"
                   HeightRequest="185"
                   Aspect="AspectFit"
                   SemanticProperties.Description="dot net bot in a race car number eight" />
            <Label Text="Welcome to .NET MAUI Document Scanner SDK"
                   Style="{StaticResource Headline}"
                   SemanticProperties.HeadingLevel="Level1" />
            <Label Text="Using IronOCR"
                   Style="{StaticResource SubHeadline}"
                   SemanticProperties.HeadingLevel="Level2"
                   SemanticProperties.Description="Welcome to .NET MAUI Document Scanner SDK" />
            <!-- Camera preview -->
            <Image x:Name="cameraPreview" />
            <!-- Capture button -->
            <Button Text="Capture" Clicked="OnCaptureClicked" />
            <!-- Text display area -->
            <Label x:Name="textLabel" Text="Recognized Text:"/>
        </VerticalStackLayout>
    </ScrollView>
</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"
             xmlns:d="http://schemas.microsoft.com/dotnet/2021/maui/design"
             x:Class="DocumentScanner.MainPage">
    <ScrollView>
        <VerticalStackLayout Padding="30,0" Spacing="25">
            <Image Source="dotnet_bot.png"
                   HeightRequest="185"
                   Aspect="AspectFit"
                   SemanticProperties.Description="dot net bot in a race car number eight" />
            <Label Text="Welcome to .NET MAUI Document Scanner SDK"
                   Style="{StaticResource Headline}"
                   SemanticProperties.HeadingLevel="Level1" />
            <Label Text="Using IronOCR"
                   Style="{StaticResource SubHeadline}"
                   SemanticProperties.HeadingLevel="Level2"
                   SemanticProperties.Description="Welcome to .NET MAUI Document Scanner SDK" />
            <!-- Camera preview -->
            <Image x:Name="cameraPreview" />
            <!-- Capture button -->
            <Button Text="Capture" Clicked="OnCaptureClicked" />
            <!-- Text display area -->
            <Label x:Name="textLabel" Text="Recognized Text:"/>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>
XML

在這種佈局中:

  • 我們使用VerticalStackLayout將控制項垂直堆疊起來。
  • 名為cameraPreview 的**影像**控制項用於顯示拍攝的照片。
  • 點選按鈕控制項時,會觸發OnCaptureClicked事件處理程序。
  • 名為textLabel 的**標籤**控制項用於顯示擷取的文字。

輸出

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 4 - MainPage.xaml 輸出

4. 實現文件掃描功能

為了將文字擷取功能整合到我們的 .NET MAUI 文件掃描應用程式中,我們將按照以下步驟操作:

1.利用相機 API:利用 .NET MAUI 提供的相機 API,直接在您的應用程式中擷取影像檔案。 2.將影像傳遞給 IronOCR:捕捉影像後,將其傳遞給 IronOCR 進行文字擷取,利用其強大的功能。 3.顯示提取的文本:在應用程式使用者介面的指定區域顯示提取的文本,供使用者查看。

以下是實現這些步驟的相應程式碼片段:

using IronOcr;

namespace DocumentScanner
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private async void OnCaptureClicked(object sender, EventArgs e)
        {
            License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
            try
            {
                // Request camera permissions
                var status = await Permissions.RequestAsync<Permissions.Camera>();
                if (status == PermissionStatus.Granted)
                {
                    // Take photo
                    var photo = await MediaPicker.CapturePhotoAsync();
                    if (photo != null)
                    {
                        // Display captured photo in Image
                        cameraPreview.Source = ImageSource.FromStream(() => photo.OpenReadAsync().Result);
                        using (var stream = await photo.OpenReadAsync())
                        {
                            // Use a stream from the captured photo for OCR
                            var ocr = new IronTesseract();
                            using var ocrInput = new OcrInput();
                            ocrInput.LoadImage(stream);
                            var ocrResult = ocr.Read(ocrInput);
                            if (string.IsNullOrEmpty(ocrResult.Text))
                            {
                                await DisplayAlert("Error", "No Text Detected!", "OK");
                            }
                            else
                            {
                                await DisplayAlert("Text Detected!", ocrResult.Text, "OK");
                                // Display extracted text
                                textLabel.Text = ocrResult.Text;
                            }
                        }
                    }
                }
                else
                {
                    // Camera permission denied
                    await DisplayAlert("Permission Denied", "Camera permission is required to capture photos.", "OK");
                }
            }
            catch (Exception ex)
            {
                // Handle exception
                await DisplayAlert("Error", ex.Message, "OK");
            }
        }
    }
}
using IronOcr;

namespace DocumentScanner
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private async void OnCaptureClicked(object sender, EventArgs e)
        {
            License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
            try
            {
                // Request camera permissions
                var status = await Permissions.RequestAsync<Permissions.Camera>();
                if (status == PermissionStatus.Granted)
                {
                    // Take photo
                    var photo = await MediaPicker.CapturePhotoAsync();
                    if (photo != null)
                    {
                        // Display captured photo in Image
                        cameraPreview.Source = ImageSource.FromStream(() => photo.OpenReadAsync().Result);
                        using (var stream = await photo.OpenReadAsync())
                        {
                            // Use a stream from the captured photo for OCR
                            var ocr = new IronTesseract();
                            using var ocrInput = new OcrInput();
                            ocrInput.LoadImage(stream);
                            var ocrResult = ocr.Read(ocrInput);
                            if (string.IsNullOrEmpty(ocrResult.Text))
                            {
                                await DisplayAlert("Error", "No Text Detected!", "OK");
                            }
                            else
                            {
                                await DisplayAlert("Text Detected!", ocrResult.Text, "OK");
                                // Display extracted text
                                textLabel.Text = ocrResult.Text;
                            }
                        }
                    }
                }
                else
                {
                    // Camera permission denied
                    await DisplayAlert("Permission Denied", "Camera permission is required to capture photos.", "OK");
                }
            }
            catch (Exception ex)
            {
                // Handle exception
                await DisplayAlert("Error", ex.Message, "OK");
            }
        }
    }
}
$vbLabelText   $csharpLabel

程式碼解釋

讓我們一步一步地分析程式碼:

  • 在 MainPage.xaml.cs 檔案中,定義了OnCaptureClicked方法來處理 Capture 按鈕的點擊事件。
  • IronOCR 許可證金鑰已設置,這是使用 IronOCR 庫所必需的。 請將&quot;YOUR-LICENSE-KEY-HERE&quot;替換為您的實際許可證金鑰。
  • 使用Permissions.RequestAsync請求相機權限()以確保應用程式可以存取裝置的攝影機。
  • 呼叫MediaPicker.CapturePhotoAsync()來使用相機拍照。 如果成功,照片將顯示在cameraPreview Image 控制項中。
  • 開啟擷取照片的流並將其用作 IronOCR 的輸入,建立一個IronTesseract實例,將影像流載入到OcrInput物件中,並呼叫Read方法執行 OCR。
  • 如果提取成功,則提取的文字將顯示在textLabel控制項中。 如果未偵測到文本,則使用DisplayAlert顯示錯誤訊息。

如需進一步了解 IronOCR 和其他程式碼範例,請造訪此程式碼範例頁面。

5. 測試文件掃描應用程式

  • 在各種平台(Android、iOS 和 Windows)上運行該應用程序,以確保跨平台相容性。
  • 測試不同的場景,例如掃描不同字體、大小和方向的文件。
  • 驗證擷取的文字是否準確,並在使用者介面上正確顯示。

輸出 - 無文字的掃描文檔

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 5 - 掃描的 PDF 建立輸出

輸出 - 帶有文字的掃描文檔

如何在 .NET MAUI 應用程式中使用文件掃描器 SDK:圖 6 - 掃描文檔

結論

透過本教學課程,您已經學會如何在 .NET MAUI 中使用 IronOCR 文件掃描器 SDK。 文件掃描應用程式有許多實際應用,從將紙本文件數位化到從收據和發票中提取儲存的資訊。 利用 IronOCR 的強大功能和 .NET MAUI 的靈活性,您可以建立功能豐富的文件掃描應用程序,以滿足各種使用情境的需求。 嘗試不同的功能,探索其他庫,不斷磨練你的技能,從而創建更令人印象深刻的應用程式。

有關 IronOCR 功能的更多詳細信息,請訪問此文件頁面。

IronOCR 提供免費試用版,供用戶測試其商業模式下的全部功能。 其永久精簡版授權起價為$799 。 從下載頁面下載庫檔案並試用。

常見問題解答

如何使用.NET MAUI建立一個文件掃描應用程式?

您可以使用 .NET MAUI 和 IronOCR 光學字元辨識功能建立一個文件掃描應用程式。首先,透過 Visual Studio 中的 NuGet 套件管理器安裝 IronOCR,然後使用 .NET MAUI 設計應用程式的 UI,並使用 IronTesseract 的 Read 方法實作掃描功能。

使用 IronOCR 作為文件掃描應用程式有哪些好處?

IronOCR 提供高精度的文字辨識、多語言支援以及對多種文件格式的相容性。此外,它還提供影像預處理、快速運行以及與 .NET 應用程式的無縫集成,使其成為文件掃描應用程式的強大之選。

如何在.NET MAUI專案中安裝IronOCR?

若要在 .NET MAUI 專案中安裝 IronOCR,請開啟 Visual Studio 並使用 NuGet 套件管理器搜尋「IronOCR」。將該套件新增至您的專案即可開始使用其 OCR 功能。

文件掃描應用程式中影像的擷取和處理涉及哪些步驟?

流程包括使用 MediaPicker 擷取影像,將其轉換為串流格式,然後使用 IronOCR 的 IronTesseract 進行文字擷取。提取的文字可以顯示在應用程式的使用者介面中。

IronOCR支援哪些OCR處理文件格式?

IronOCR 支援多種文件格式,包括 TIFF、JPEG、PNG 和 PDF,從而實現多功能的文件掃描和文字擷取功能。

IronOCR是否支援多種語言的OCR識別?

是的,IronOCR 支援超過 125 種語言的 OCR,使其適用於需要在各種語言環境下進行文字辨識的應用。

.NET MAUI 如何促進跨平台開發?

.NET MAUI 使開發人員能夠使用單一程式碼庫建立跨平台行動應用程序,從而實現在 Android、iOS 和 Windows 裝置上的無縫部署。

使用 .NET MAUI 開發文件掃描應用程式需要哪些先決條件?

先修條件包括 C# 程式設計基礎、具有 .NET MAUI 工作負載的 Visual Studio 2022 以及從 NuGet 安裝的 IronOCR 庫。

如何測試我的文件掃描應用程式在不同平台上的相容性?

您可以將您的文件掃描應用程式部署到 Android、iOS 和 Windows 裝置上,從而跨平台測試其效能,以確保文字擷取的功能和準確性,並利用 .NET MAUI 的跨平台功能。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。