نحوه ساخت یک برنامه .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 را تنظیم کنید
-
در کد ویژوال استودیو ، فشار دهید
Ctrl+Shift+P
برای باز کردن پالت فرمان و اجرایCreate a new .NET MAUI App
فرمان به داربست یک پروژه جدید .NET MAUI. -
اضافه کردن
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
: تصویر اسکن شده انتخاب شده را نمایش می دهد.
اسناد اسکن در ج
-
لیست منبع اسکنر را دریافت کرده و جمعیت را جمع کنید
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; }
-
برای رسیدگی به اسکن سند ، یک رویداد کلیک بر روی یک رویداد کلیک کنید:
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: بارکد را از اسناد اسکن شده بخوانید
-
اولیه کردن
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(); }
-
برای خواندن بارکد از تصویر فعلی ، یک رویداد کلیک بر روی دکمه اضافه کنید:
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
ویراستار. -
یک اسکنر را به رایانه شخصی خود وصل کنید و فشار دهید
F5
برای اجرای برنامه .NET MAUI Windows.
رمز منبع
https://github.com/yushulx/dotnet-twain-wain-sane-scanner/tree/main/examples/documentbarcode