برنامه نویسی

نحوه ساخت یک برنامه .net Maui Windows برای خواندن بارکد از اسناد اسکن شده

دیجیتالی شدن اسناد یک کار مشترک در صنایع مختلف است. بسیاری از اسناد – از جمله مقالات امتحان ، قراردادهای حقوقی ، سوابق بیمار ، بیانیه های حساب و موارد دیگر – بارکدهای حاوی اطلاعات مهم را ذخیره می کنند. در این مقاله ، ما نحوه ساخت یک برنامه ویندوز .NET MAUI را برای دیجیتالی کردن اسناد با استفاده از اسکنرهای سنتی نشان خواهیم داد (HPبا کانتینبا اپیسونو غیره) و بارکد را از اسناد اسکن شده استخراج کنید.

ویدیوی نسخه ی نمایشی

پیش نیازهای

چرا شرکت ها هنوز از اسکنرهای سنتی استفاده می کنند؟

قبل از غواصی به کد ، بیایید بررسی کنیم که چرا شرکت ها به جای دوربین های USB HD یا تلفن های همراه برای دیجیتالی شدن اسناد ، از اسکنرهای سنتی استفاده می کنند:

  • کیفیت و قوام تصویر: اسکنرها روشنایی یکنواخت و فاصله ثابت بین سند و سنسور را ارائه می دهند و از تصاویر با کیفیت بالا اطمینان می دهند.
  • سرعت و کارآیی: اسکنرها می توانند به سرعت و به طور خودکار چندین صفحه را پردازش کنند.
  • دقت OCR: تصاویر اسکن شده با کیفیت بالا ، دقت پردازش OCR را افزایش می دهد.
  • امنیت و انطباق: اسکنرها امنیت و انطباق بهتری نسبت به نیازهای نظارتی نسبت به دستگاه های تلفن همراه ارائه می دهند.

سرویس DynamSoft API های استراحت را فراهم می کند که به زبانهای برنامه نویسی اجازه می دهد تا با آنها ارتباط برقرار کنند دوقلوبا ویابا عاقلوت شخص اسکنرهای سازگار. در بخش های بعدی ، ما از Twain.wia.sane.scanner ، یک بسته بندی C# سرویس Dynamsoft ، برای تعامل با اسکنرها و Dynamsoft.dotnet.BarcodeReader.Bundle برای خواندن بارکد استفاده خواهیم کرد.

مرحله 1: یک برنامه .NET 9 MAUI Windows را تنظیم کنید

  1. در کد ویژوال استودیو ، فشار دهید Ctrl+Shift+P برای باز کردن پالت فرمان و اجرای Create a new .NET MAUI App فرمان به داربست یک پروژه جدید .NET MAUI.

    یک برنامه جدید .NET MAUI ایجاد کنید

  2. اضافه کردن Dynamsoft.DotNet.BarcodeReader.Bundle وت Twain.Wia.Sane.Scanner به *.csproj پرونده

    
         Include="Dynamsoft.DotNet.BarcodeReader.Bundle" Version="10.4.2000" />
         Include="Twain.Wia.Sane.Scanner" Version="1.2.0" />
    
    

مرحله 2: اسناد را از یک اسکنر Twain ، Wia یا Sane سازگار به دست آورید

ساخت و ساز UI

طرح UI را در MainPage.xamlبشر UI شامل می شود Pickerبا CheckBoxبا Buttonبا Labelوت Editor مؤلفه ها


 xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              x:Class="documentbarcode.MainPage">

     HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand">

         Margin="20"
                              MaximumWidthRequest="400"
                              WidthRequest="400"
                              Spacing="20">
              Padding="10"
                          BackgroundColor="#f0f0f0"
                          Spacing="5">

                 x:Name="DevicePicker"
                        Title="Select Source"
                        ItemsSource="{Binding Items}">
                


                 x:Name="ColorPicker"
                        Title="Select Pixel Type">
                    
                         Type="{x:Type x:String}">
                            B & W
                            Gray
                            Color
                        
                    
                

                 x:Name="ResolutionPicker"
                        Title="Select Resolution">
                    
                         Type="{x:Type x:Int32}">
                            100
                            150
                            200
                            300
                        
                    
                

                 Orientation="Horizontal">
                     x:Name="showUICheckbox"/>
                    
                 Orientation="Horizontal">
                     x:Name="adfCheckbox"/>
                    
                 Orientation="Horizontal">
                     x:Name="duplexCheckbox"/>
                    

                 RowDefinitions="*, *"
                      ColumnDefinitions="*, *"
                      Padding="10">
                    


                


        

         x:Name="ImageScrollView"
                    WidthRequest="800"
                    HeightRequest="800">
             x:Name="ImageContainer"/>
        


         x:Name="LargeImage"
                Aspect="AspectFit"
                MaximumWidthRequest="600"/>
    


حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توضیح اجزای UI:

  • DevicePicker: یک اسکنر Twain ، WIA یا Sane سازگار را انتخاب می کند.
  • ColorPicker: نوع پیکسل را انتخاب می کند.
  • ResolutionPicker: وضوح را انتخاب می کند.
  • showUICheckbox: UI اسکنر را تغییر می دهد.
  • adfCheckbox: فیدر سند اتوماتیک را فعال می کند.
  • duplexCheckbox: اسکن دوبلکس را فعال می کند.
  • BarcodeResultContent: نتایج بارکد را نمایش می دهد.
  • ImageScrollView: نمایش های کوچک تصویر اسکن شده.
  • LargeImage: تصویر اسکن شده انتخاب شده را نمایش می دهد.

اسناد اسکن در ج

  1. لیست منبع اسکنر را دریافت کرده و جمعیت را جمع کنید DevicePicker:

    private static string licenseKey = "LICENSE-KEY";
    private static ScannerController scannerController = new ScannerController();
    private static List<Dictionary<string, object>> devices = new List<Dictionary<string, object>>();
    private static string host = "http://127.0.0.1:18622";
    
    private List<byte[]> _streams = new List<byte[]>();
    public ObservableCollection<string> Items { get; set; }
    private int selectedIndex = -1;
    
    private async void InitializeDevices()
    {
    
      var scanners = await scannerController.GetDevices(host, ScannerType.TWAINX64SCANNER | ScannerType.ESCLSCANNER);
      if (scanners.Count == 0)
      {
        await DisplayAlert("Error", "No scanner found", "OK");
        return;
      }
      for (int i = 0; i < scanners.Count; i++)
      {
        var scanner = scanners[i];
        devices.Add(scanner);
        var name = scanner["name"];
        if (name != null)
        {
          Items.Add(name.ToString());
        }
      }
    
      DevicePicker.SelectedIndex = 0;
    }
    
  2. برای رسیدگی به اسکن سند ، یک رویداد کلیک بر روی یک رویداد کلیک کنید:

    private async void OnLoadImageClicked(object sender, System.EventArgs e)
    {
      if (DevicePicker.SelectedIndex < 0) return;
      var parameters = new Dictionary<string, object>
          {
            {"license", licenseKey},
            {"device", devices[DevicePicker.SelectedIndex]["device"]}
          };
    
      parameters["config"] = new Dictionary<string, object>
          {
            {"IfShowUI", showUICheckbox.IsChecked},
            {"PixelType", ColorPicker.SelectedIndex},
            {"Resolution", (int)ResolutionPicker.SelectedItem},
            {"IfFeederEnabled", adfCheckbox.IsChecked},
            {"IfDuplexEnabled", duplexCheckbox.IsChecked},
          };
    
      var data = await scannerController.ScanDocument(host, parameters);
      string jobId = "";
      if (data.ContainsKey(ScannerController.SCAN_SUCCESS))
      {
        jobId = data[ScannerController.SCAN_SUCCESS];
      }
    
      string error = "";
      if (data.ContainsKey(ScannerController.SCAN_ERROR))
      {
        error = data[ScannerController.SCAN_ERROR];
      }
    
      if (!string.IsNullOrEmpty(jobId))
      {
        var images = await scannerController.GetImageStreams(host, jobId);
        int start = _streams.Count;
        for (int i = 0; i < images.Count; i++)
        {
          MemoryStream stream = new MemoryStream(images[i]);
          _streams.Add(images[i]);
          ImageSource imageStream = ImageSource.FromStream(() => stream);
          Image image = new Image
          {
            WidthRequest = 200,
            Aspect = Aspect.AspectFit,
            Source = imageStream,
            BindingContext = i + start
          };
    
          var tapGestureRecognizer = new TapGestureRecognizer();
          tapGestureRecognizer.Tapped += OnImageTapped;
          image.GestureRecognizers.Add(tapGestureRecognizer);
    
          ImageContainer.Children.Add(image);
    
        }
    
        ScrollToLatestImage();
        ShowLargeImage(_streams[_streams.Count - 1]);
      }
      else if (!string.IsNullOrEmpty(error))
      {
        await DisplayAlert("Error", error, "OK");
      }
    }
    
    private void ShowLargeImage(byte[] bytes)
    {
      MemoryStream stream = new MemoryStream(bytes);
      ImageSource imageStream = ImageSource.FromStream(() => stream);
      LargeImage.Source = imageStream;
    }
    
    private void OnImageTapped(object? sender, TappedEventArgs e)
    {
      if (sender is Image image && image.BindingContext is int index)
      {
        byte[] imageData = _streams[index];
        ShowLargeImage(imageData);
        selectedIndex = index;
      }
    }
    

    تمام تصاویر اسکن شده در آن ذخیره می شوند _streams برای عملیات بعدی در OnImageTapped از روش برای نمایش تصویر انتخاب شده در LargeImageبشر

مرحله 3: بارکد را از اسناد اسکن شده بخوانید

  1. اولیه کردن CaptureVisionRouter شی:

    private void InitializeCVR()
    {
      string errorMsg;
      int errorCode = LicenseManager.InitLicense(licenseKey, out errorMsg);
      if (errorCode != (int)Dynamsoft.Core.EnumErrorCode.EC_OK)
        Console.WriteLine("License initialization error: " + errorMsg);
    
      cvr = new CaptureVisionRouter();
    }
    
  2. برای خواندن بارکد از تصویر فعلی ، یک رویداد کلیک بر روی دکمه اضافه کنید:

    private void OnScanBarcodeClicked(object sender, System.EventArgs e)
    {
      if (_streams.Count == 0)
      {
        DisplayAlert("Error", "Please load an image first.", "OK");
        return;
      }
    
      BarcodeResultContent.Text = "";
      CapturedResult result = cvr.Capture(_streams[selectedIndex], PresetTemplate.PT_READ_BARCODES);
      if (result != null)
      {
        DecodedBarcodesResult barcodesResult = result.GetDecodedBarcodesResult();
        if (barcodesResult != null)
        {
          BarcodeResultItem[] items = barcodesResult.GetItems();
          BarcodeResultContent.Text += "Total barcode(s) found: " + items.Length + Environment.NewLine + Environment.NewLine;
          int index = 1;
          foreach (BarcodeResultItem barcodeItem in items)
          {
            BarcodeResultContent.Text += "Result " + index + Environment.NewLine;
            BarcodeResultContent.Text += "Barcode Format: " + barcodeItem.GetFormatString() + Environment.NewLine;
            BarcodeResultContent.Text += "Barcode Text: " + barcodeItem.GetText() + Environment.NewLine + Environment.NewLine;
            index += 1;
          }
    
        }
      }
    }
    

    در Capture روش بارکد را از داده های تصویر می خواند و لیستی از نتایج بارکد را برمی گرداند. نتایج بارکد در BarcodeResultContent ویراستار.

  3. یک اسکنر را به رایانه شخصی خود وصل کنید و فشار دهید F5 برای اجرای برنامه .NET MAUI Windows.

    .NET MAUI DOCUDE اسکنر در MACOS

رمز منبع

https://github.com/yushulx/dotnet-twain-wain-sane-scanner/tree/main/examples/documentbarcode

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا