C#'ta PDF'lerden Barkodlar Nasıl Okunur
BarcodeScanning.Native.Maui'den IronBarcode'a Geçiş
Bu kılavuz, BarcodeScanning.Native.Maui'den IronBarcode'a tam bir geçiş yolu sunar, kamera etkinlik deseninin yerine geçişi, ad alanı değişikliklerini, kod geçiş örneklerini ve BarcodeScanning.Native.Maui'nin ele alınamayacak senaryoların ele alınmasını kapsar — Windows MAUI, dosya ve PDF girişi, sunucu tarafı işleme ve barkod oluşturma.
BarcodeScanning.MAUI'den Neden Geçilmeli?
BarcodeScanning.Native.Maui'den geçen ekipler bu tetikleyicileri bildiriyor:
Windows MAUI Hedefi Gerekiyor: BarcodeScanning.Native.Maui iOS ve Android yerel API'lerini sarar. Windows için bir uygulaması yoktur ve planlanmamıştır. MAUI uygulamanız, iOS ve Android'in yanı sıra Windows'u hedefliyorsa, platforma özgü dallama olmadan tüm üç hedefte çalışan bir kütüphaneye ihtiyacınız var.
Dosya veya PDF Girişi Gereksinimlere Eklendi: BarcodeScanning.Native.Maui yalnızca canlı kamera karelerini kabul eder. Kullanıcılar galerilerinden bir resim yüklemek istediklerinde veya bir sunucu tarafı uç noktasından PDF'lerden barkod çıkarmak istediklerinde, kütüphane sunacak hiçbir kod yolu sunmaz. Herhangi bir dosya veya PDF barkod senaryosu farklı bir araç gerektirir.
iOS UPC-A Verileri Üretimde Yanlış Oldu: Apple'ın Vision çerçevesi, UPC-A barkodları için 13 haneli döner (EAN-13 kodlaması). BarcodeScanning.Native.Maui bunu düzeltmeden geçirir. UPC-A kodları başında sıfırla saklanıyorsa, envanter kayıtları, satış noktası sorgulamaları veya tedarik zinciri entegrasyonları sessizce bozulmuş olabilir. IronBarcode, manuel normalizasyon olmaksızın doğru 12 basamaklı UPC-A değerini döndürür.
PDF417 Tarama Güvenilir Olmadı: Kütüphanenin kendi GitHub sorunları PDF417'yi "çok sorunlu - çoğu tarama hiç oluşmuyor" olarak belgeler. Gönderi etiketleri, ehliyetler ve biniş kartları için bu doğrudan bir engelleyici.
Oluşturma Gerekiyordu: BarcodeScanning.Native.Maui barkod oluşturmuyor.IronBarcode Code128, QR, DataMatrix ve diğer formatları görüntü dosyaları veya bayt dizileri olarak oluşturur.
Sunucu Tarafı İşleme Getirildi: BarcodeScanning.Native.Maui bir kamera UI kontrolüdür — bir sunucu işlemi içinde çalışamaz. Mobil taramanın yanı sıra sunucu tarafı barkod okuma gerektiğinde,IronBarcode aynı paket ve aynı API ile her iki tarafı da kapsar.
Temel Sorun
BarcodeScanning.Native.Maui, barkod okumayı tamamen canlı kamera etkinlik modeline bağlı kılar. Herhangi bir gereksinim bu modelin dışına çıktığında, kütüphane hiç birşey sunmaz:
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
ResultLabel.Text = barcode.DisplayValue
End If
End Sub
IronBarcode herhangi bir veri girişini kabul eder — kamera yakalama, dosya, PDF, bayt dizisi — ve her platformda çalışır:
using IronBarCode;
private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
using IronBarCode;
private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
Imports IronBarCode
Private Async Sub ScanBarcodeButton_Clicked(sender As Object, e As EventArgs)
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using ms As New MemoryStream()
Await stream.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
ResultLabel.Text = If(results.FirstOrDefault()?.Value, "No barcode found")
End Using
End Using
End Sub
IronBarcode ve BarcodeScanning.MAUI: Özellik Karşılaştırması
| Özellik | BarcodeScanning.MAUI | IronBarcode |
|---|---|---|
| Canlı kamera kare okuma | Evet — CameraView kontrolü | Hayır (Medya Seçici'yi kullanarak yakalayın, sonra okuyun) |
| Uygulama içi kamera nişangahı | Evet — gerçek zamanlı sürekli | Hayır — Medya Seçici aracılığıyla sistem kamera UI'yi kullanır |
| Görüntü dosyasından okuma | Hayır | Evet — BarcodeReader.Read(path) |
| Bayt dizisinden okuma | Hayır | Evet — BarcodeReader.Read(bytes) |
| Akıştan okuma | Hayır | Evet — BarcodeReader.Read(stream) |
| PDF'den okuma | Hayır | Evet — BarcodeReader.Read(pdf) |
| Barkod oluşturma | Hayır | Evet — BarcodeWriter + QRCodeWriter |
| Windows MAUI desteği | Hayır | Evet |
| iOS MAUI desteği | Evet | Evet |
| Android MAUI desteği | Evet | Evet |
| macOS MAUI desteği | Belgelenmemiş | Evet |
| Sunucu tarafı / ASP.NET | Hayır | Evet |
| Docker / Azure / AWS Lambda | Hayır | Evet |
| iOS UPC-A doğruluğu | 13 basamak döndürür (hata), manuel normalizasyon gerektirir | Doğru 12 basamaklı UPC-A döndürür |
| PDF417 güvenilirliği | "Çoğu tarama asla gerçekleşmez" (GitHub sorunları) | Desteklenen |
| Çoklu barkod algılama | Evet (bir kare başına birden fazla e.BarcodeResults ile) |
Evet (ExpectMultipleBarcodes seçeneği) |
| Okuma hızı kontrolü | None | ReadingSpeed.Faster / Balanced / Detailed / ExtremeDetail |
| Lisans | MIT (açık kaynak, ücretsiz) | Ticari — Lite $749, Plus $1.499, Professional $2.999, Unlimited $5.999 |
| .NET Framework desteği | Hayır (sadece MAUI) | Evet — .NET Framework 4.6.2+ |
Hızlı Başlangıç: BarcodeScanning.MAUI'den IronBarcode'a Geçiş
Adım 1: NuGet Paketini Değiştirin
BarcodeScanning.Native.Maui'i kaldırın:
dotnet remove package BarcodeScanning.Native.Maui
dotnet remove package BarcodeScanning.Native.Maui
IronBarcode'u kurun:
dotnet add package IronBarcode
dotnet add package IronBarcode
Adım 2: Ad Alanlarını Güncelleyin
Tüm dosyalardan BarcodeScanning ad alanını kaldırın:
// Remove
using BarcodeScanning;
// Remove
using BarcodeScanning;
Imports BarcodeScanning
IronBarCode ad alanını ekleyin:
// Add
using IronBarCode;
// Add
using IronBarCode;
Imports IronBarCode
XAML dosyalarında, scanner: XML ad alanı bildirimini kaldırın:
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui"
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui"
Adım 3: Lisansa İzin Verin
Lisans başlatmayı uygulama başlangıcında ekleyin — MauiProgram.cs veya App.xaml.cs'da:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Kod Göç Örnekleri
Kamera Tarama: CameraView'den MediaPicker'a
CameraView kontrolü, sürekli kare algılama ile gerçek zamanlı bir vizör sağladı.IronBarcode alternatifi, sistem kamerasını açmak, bir fotoğraf çekmek ve sonucu işlemek için MAUI'nin MediaPicker'sini kullanır.
BarcodeScanning.MAUI Yaklaşımı — XAML:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui">
<StackLayout>
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All"
VerticalOptions="FillAndExpand" />
<Label x:Name="ResultLabel" Text="Waiting for scan..." />
</StackLayout>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui">
<StackLayout>
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All"
VerticalOptions="FillAndExpand" />
<Label x:Name="ResultLabel" Text="Waiting for scan..." />
</StackLayout>
</ContentPage>
BarcodeScanning.MAUI Yaklaşımı — arka plan kodu:
using BarcodeScanning;
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
MainThread.BeginInvokeOnMainThread(() =>
ResultLabel.Text = barcode.DisplayValue);
}
using BarcodeScanning;
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
MainThread.BeginInvokeOnMainThread(() =>
ResultLabel.Text = barcode.DisplayValue);
}
Imports BarcodeScanning
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
MainThread.BeginInvokeOnMainThread(Sub()
ResultLabel.Text = barcode.DisplayValue
End Sub)
End If
End Sub
IronBarcode Yaklaşımı — XAML:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui">
<StackLayout>
<Button Text="Scan Barcode" Clicked="ScanButton_Clicked" />
<Label x:Name="ResultLabel" Text="Tap to scan..." />
</StackLayout>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui">
<StackLayout>
<Button Text="Scan Barcode" Clicked="ScanButton_Clicked" />
<Label x:Name="ResultLabel" Text="Tap to scan..." />
</StackLayout>
</ContentPage>
IronBarcode Yaklaşımı — arka plan kodu:
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var first = results.FirstOrDefault();
ResultLabel.Text = first?.Value ?? "No barcode found";
}
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var first = results.FirstOrDefault();
ResultLabel.Text = first?.Value ?? "No barcode found";
}
Imports IronBarCode
Imports System.IO
Imports System.Linq
Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using ms As New MemoryStream()
Await stream.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
Dim first = results.FirstOrDefault()
ResultLabel.Text = If(first?.Value, "No barcode found")
End Using
End Using
End Sub
Bu kod, iOS, Android ve Windows MAUI üzerinde herhangi bir platforma özgü dallama yapmadan çalışır. Kullanıcı deneyimi canlı uygulama içi nişangâhtan platformun yerel kamera ekranına değişir — çoğu iş uygulaması için uygundur. IronBarcode MAUI okuma kılavuzu ek yapılandırma seçeneklerini kapsar.
Her Tarama İçin Birden Fazla Barkod İşleme
BarcodeScanning.MAUI Yaklaşımı:
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
foreach (var barcode in e.BarcodeResults)
{
MainThread.BeginInvokeOnMainThread(() =>
Console.WriteLine($"Found: {barcode.DisplayValue}"));
}
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
foreach (var barcode in e.BarcodeResults)
{
MainThread.BeginInvokeOnMainThread(() =>
Console.WriteLine($"Found: {barcode.DisplayValue}"));
}
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
For Each barcode In e.BarcodeResults
MainThread.BeginInvokeOnMainThread(Sub()
Console.WriteLine($"Found: {barcode.DisplayValue}")
End Sub)
Next
End Sub
IronBarcode Yaklaşımı:
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode
Imports System.IO
Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using ms As New MemoryStream()
Await stream.CopyToAsync(ms)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(ms.ToArray(), options)
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
End Using
End Using
End Sub
ExpectMultipleBarcodes = true, okuyucuya ilk barkodu bulduktan sonra taramaya devam etmesini söyler. Bu seçenek olmadan, çağrı ilk eşleşmede döner, bu, tek barkod senaryoları için daha hızlıdır.
iOS UPC-A Düzeltmesi: Normalizasyon Geçici Çözümünü Kaldırın
Kod tabanınızda bir UPC-A ön sıfır geçici çözümü varsa, bunu tamamen çıkarın. IronBarcode, manuel müdahale gerektirmeden doğru 12 haneli değeri döndürür.
BarcodeScanning.MAUI Yaklaşımı — geçici çözüm mevcut:
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
// Workaround: Apple Vision returns 13 digits for UPC-A
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value, barcode.BarcodeFormat.ToString());
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
// Workaround: Apple Vision returns 13 digits for UPC-A
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value, barcode.BarcodeFormat.ToString());
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode Is Nothing Then Return
Dim value = barcode.DisplayValue
' Workaround: Apple Vision returns 13 digits for UPC-A
If barcode.BarcodeFormat = BarcodeFormats.Upca AndAlso value.Length = 13 Then
value = value.Substring(1)
End If
ProcessBarcode(value, barcode.BarcodeFormat.ToString())
End Sub
IronBarcode Yaklaşımı — geçici çözüm gerekli değil:
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var first = results.FirstOrDefault();
if (first == null) return;
// result.Value is the correct 12-digit UPC-A — no normalization needed
ProcessBarcode(first.Value, first.Format.ToString());
}
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var first = results.FirstOrDefault();
if (first == null) return;
// result.Value is the correct 12-digit UPC-A — no normalization needed
ProcessBarcode(first.Value, first.Format.ToString());
}
Imports IronBarCode
Imports System.IO
Imports System.Linq
Imports System.Threading.Tasks
Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using ms As New MemoryStream()
Await stream.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
Dim first = results.FirstOrDefault()
If first Is Nothing Then Return
' result.Value is the correct 12-digit UPC-A — no normalization needed
ProcessBarcode(first.Value, first.Format.ToString())
End Using
End Using
End Sub
BarcodeFormats.Upca ve Substring(1) ile eşleşenleri silin — bu kod, taşıma sonrası işlevsizdir.
Dosya ve PDF Desteği Eklemek
BarcodeScanning.Native.Maui, dosya veya PDF girişi için bir eşdeğere sahip değildir. Bu, geçiş sırasında yerine getirilecek yeni bir gereksinimse:
BarcodeScanning.MAUI Yaklaşımı:
//Hayırequivalent exists — BarcodeScanning.Native.Maui cannot read from files or PDFs
//Hayırequivalent exists — BarcodeScanning.Native.Maui cannot read from files or PDFs
'Hayır equivalent exists — BarcodeScanning.Native.Maui cannot read from files or PDFs
IronBarcode Yaklaşımı:
using IronBarCode;
// Read from a file the user picked with FilePicker
private async void ReadFileButton_Clicked(object sender, EventArgs e)
{
var file = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "Select image or PDF"
});
if (file == null) return;
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// Read barcodes from a PDF directly — no intermediate image step
private void ReadPdfBarcodes()
{
var results = BarcodeReader.Read("shipment-manifest.pdf");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;
// Read from a file the user picked with FilePicker
private async void ReadFileButton_Clicked(object sender, EventArgs e)
{
var file = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "Select image or PDF"
});
if (file == null) return;
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// Read barcodes from a PDF directly — no intermediate image step
private void ReadPdfBarcodes()
{
var results = BarcodeReader.Read("shipment-manifest.pdf");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode
' Read from a file the user picked with FilePicker
Private Async Sub ReadFileButton_Clicked(sender As Object, e As EventArgs)
Dim file = Await FilePicker.PickAsync(New PickOptions With {
.PickerTitle = "Select image or PDF"
})
If file Is Nothing Then Return
Dim results = BarcodeReader.Read(file.FullPath)
For Each result In results
ResultLabel.Text &= vbCrLf & $"{result.Format}: {result.Value}"
Next
End Sub
' Read barcodes from a PDF directly — no intermediate image step
Private Sub ReadPdfBarcodes()
Dim results = BarcodeReader.Read("shipment-manifest.pdf")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
End Sub
IronBarcode PDF okuma belgesi, çok sayfalı PDF desteğini ve sayfa aralığı seçimini kapsar.
Sunucu Tarafı Barkod İşleme
Uygulamanızın API'si ASP.NET backend'i varsa ve o da barkod işlemesine ihtiyaç duyuyorsa, aynı BarcodeReader.Read() çağrısı orada değişiklik yapılmadan çalışır. BarcodeScanning.Native.Maui'nin sunucu tarafı eşdeğeri yoktur.
BarcodeScanning.MAUI Yaklaşımı:
//Hayırequivalent exists — BarcodeScanning.Native.Maui is a camera UI control
// and cannot run in a server process
//Hayırequivalent exists — BarcodeScanning.Native.Maui is a camera UI control
// and cannot run in a server process
' Hayırequivalent exists — BarcodeScanning.Native.Maui is a camera UI control
' and cannot run in a server process
IronBarcode Yaklaşımı:
using IronBarCode;
// ASP.NET endpoint — reads barcodes from an uploaded file
[HttpPost("scan")]
public async Task<IActionResult> ScanBarcode(IFormFile file)
{
using var ms = new MemoryStream();
await file.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
using IronBarCode;
// ASP.NET endpoint — reads barcodes from an uploaded file
[HttpPost("scan")]
public async Task<IActionResult> ScanBarcode(IFormFile file)
{
using var ms = new MemoryStream();
await file.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Threading.Tasks
' ASP.NET endpoint — reads barcodes from an uploaded file
<HttpPost("scan")>
Public Async Function ScanBarcode(file As IFormFile) As Task(Of IActionResult)
Using ms As New MemoryStream()
Await file.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
Aynı paket, aynı API, aynı davranış — mobil ve sunucuda.
Barkod Oluşturma
BarcodeScanning.Native.Maui'nin bir oluşturma API'si yoktur. IronBarcode, birden çok format oluşturur.
BarcodeScanning.MAUI Yaklaşımı:
//Hayırequivalent exists — BarcodeScanning.Native.Maui cannot generate barcodes
//Hayırequivalent exists — BarcodeScanning.Native.Maui cannot generate barcodes
' No equivalent exists — BarcodeScanning.Native.Maui cannot generate barcodes
IronBarcode Yaklaşımı:
using IronBarCode;
// QR code
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 500)
.SaveAsPng("qr.png");
// Code128 barcode sized to specific dimensions
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("label.png");
// Get bytes for returning from an API or storing in a database
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
// QR code
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 500)
.SaveAsPng("qr.png");
// Code128 barcode sized to specific dimensions
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("label.png");
// Get bytes for returning from an API or storing in a database
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
' QR code
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 500) _
.SaveAsPng("qr.png")
' Code128 barcode sized to specific dimensions
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("label.png")
' Get bytes for returning from an API or storing in a database
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
.ToPngBinaryData()
IronBarcode oluşturma belgesi, desteklenen tüm formatları ve stil seçeneklerini kapsar.
BarcodeScanning.MAUI API to IronBarcode Eşleme Referans
| BarcodeScanning.Native.Maui | IronBarcode |
|---|---|
CameraView XAML kontrolü |
Kaldırın — Button + MediaPicker.CapturePhotoAsync() kullanın |
OnDetectionFinished olayı |
BarcodeReader.Read(imageBytes) dönüş değeri |
OnDetectionFinishedEventArg e |
BarcodeReader.Read()'dan IEnumerable sonucu |
e.BarcodeResults |
BarcodeReader.Read() dönüş değeri |
e.BarcodeResults.FirstOrDefault() |
results.FirstOrDefault() |
barcode.DisplayValue |
result.Value |
barcode.BarcodeFormat |
result.Format |
BarcodeFormats="All" |
Otomatik algılandı — yapılandırma gerekli değil |
CameraEnabled="True" |
await MediaPicker.CapturePhotoAsync() |
| Sadece iOS + Android | iOS, Android, Windows, macOS MAUI |
| Dosya girişi yok | BarcodeReader.Read(filePath) |
| PDF girişi yok | BarcodeReader.Read("document.pdf") |
| Oluşturma yok | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| iOS UPC-A 13 hane döndürür | Doğru 12 hane döndürür — normalizasyon gerekmez |
| PDF417 güvenilmez | Desteklenen |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Canlı Nişangâh Deneyimi Kaybedildi
BarcodeScanning.MAUI: CameraView kontrolü, MAUI sayfasına doğrudan gömülü bir gerçek zamanlı kamera önizlemesi sağladı. Kullanıcılar kamera görüntüsünü görebilir ve bir barcode'a nişan alabilir — algılama, butona basmaya gerek kalmadan otomatik olarak gerçekleşir.
Çözüm: Bunun yerine platform kamer ekranını gösterir MediaPicker.CapturePhotoAsync(). Çoğu iş akışı için bu kabul edilebilir. Sürekli canlı önizlemeye ihtiyaç duyan tüketici uygulamaları için kamera kareleri doğrudan BarcodeReader.Read()'ye iletilebilir:
using IronBarCode;
// Continuous scanning: pass camera frame bytes to BarcodeReader.Read()
// (frame capture depends on your MAUI camera frame source)
private void ProcessCameraFrame(byte[] frameBytes)
{
var results = BarcodeReader.Read(frameBytes);
if (results.Any())
{
var first = results.First();
MainThread.BeginInvokeOnMainThread(() =>
ResultLabel.Text = first.Value);
}
}
using IronBarCode;
// Continuous scanning: pass camera frame bytes to BarcodeReader.Read()
// (frame capture depends on your MAUI camera frame source)
private void ProcessCameraFrame(byte[] frameBytes)
{
var results = BarcodeReader.Read(frameBytes);
if (results.Any())
{
var first = results.First();
MainThread.BeginInvokeOnMainThread(() =>
ResultLabel.Text = first.Value);
}
}
Imports IronBarCode
' Continuous scanning: pass camera frame bytes to BarcodeReader.Read()
' (frame capture depends on your MAUI camera frame source)
Private Sub ProcessCameraFrame(frameBytes As Byte())
Dim results = BarcodeReader.Read(frameBytes)
If results.Any() Then
Dim first = results.First()
MainThread.BeginInvokeOnMainThread(Sub()
ResultLabel.Text = first.Value
End Sub)
End If
End Sub
Bu, IronBarcode'dan ayrı olarak bir kamera kare kaynağını bağlamayı gerektirir. Bu yola başvurmadan önce canlı bir ön izlemenin gerçekten gerekli olup olmadığını veya sistem kamera arayüzünün yeterli olup olmadığını değerlendirin.
Sorun 2: e.BarcodeResults Özellik Adı ve Enum Değişiklikleri
BarcodeScanning.MAUI: barcode.DisplayValue, çözülen dizeyi döndürür; barcode.BarcodeFormat, bir BarcodeScanning kütüphane enum değeri döndürür.
Çözüm: DisplayValue'yı result.Value ile ve barcode.BarcodeFormat'yı result.Format ile değiştirin. Yineleme deseninin aynısıdır:
// Before
foreach (var barcode in e.BarcodeResults)
Console.WriteLine(barcode.DisplayValue);
// After
var results = BarcodeReader.Read(imageBytes);
foreach (var result in results)
Console.WriteLine(result.Value);
// Before
foreach (var barcode in e.BarcodeResults)
Console.WriteLine(barcode.DisplayValue);
// After
var results = BarcodeReader.Read(imageBytes);
foreach (var result in results)
Console.WriteLine(result.Value);
' Before
For Each barcode In e.BarcodeResults
Console.WriteLine(barcode.DisplayValue)
Next
' After
Dim results = BarcodeReader.Read(imageBytes)
For Each result In results
Console.WriteLine(result.Value)
Next
Sorun 3: UI Güncellemeleri için Thread Marshaling
BarcodeScanning.MAUI: OnDetectionFinished arka planda bir iş parçacığında tetiklenir, bu nedenle tüm UI güncellemeleri MainThread.BeginInvokeOnMainThread() gerektirir.
Çözüm: MediaPicker + async düzeni ile, await sonrası devam eden süreç, çağrı bağlamına geri döner — genellikle ana iş parçacığıdır. Sonuç görüntüsü etrafındaki MainThread.BeginInvokeOnMainThread() sarmalayıcıları genel olarak kaldırılabilir, bu da işlemci kodunu basitleştirir.
Sorun 4: MAUI Kamera İzinleri
BarcodeScanning.MAUI: Paket, kurulumu sırasında otomatik olarak AndroidManifest.xml ve Info.plist kamera izinlerini ekler.
Çözüm:IronBarcode ile MediaPicker kullanılırken, standart MAUI kamera izinleri elle eklenmelidir. Bunlar, MediaPicker.CapturePhotoAsync() için herhangi bir MAUI uygulamasının ihtiyaç duyduğu izinlerle aynıdır ve genellikle zaten mevcuttur. Cihazda test etmeden önce android.permission.CAMERA'in AndroidManifest.xml'te beyan edildiğini ve NSCameraUsageDescription'in Info.plist'de ayarlandığını doğrulayın.
BarcodeScanning.MAUI Taşıma Kontrol Listesi
Geçiş Öncesi Görevler
Herhangi bir değişiklik yapmadan önce tüm BarcodeScanning.Native.Maui kullanımını bulmak için bu aramaları yapın:
grep -rn "using BarcodeScanning" --include="*.cs" .
grep -rn "using BarcodeScanning" --include="*.xaml" .
grep -rn "CameraView" --include="*.cs" .
grep -rn "CameraView" --include="*.xaml" .
grep -rn "OnDetectionFinished" --include="*.cs" .
grep -rn "OnDetectionFinishedEventArg" --include="*.cs" .
grep -rn "e\.BarcodeResults" --include="*.cs" .
grep -rn "DisplayValue" --include="*.cs" .
grep -rn "BarcodeFormats\.Upca" --include="*.cs" .
grep -rn "scanner:" --include="*.xaml" .
grep -rn "using BarcodeScanning" --include="*.cs" .
grep -rn "using BarcodeScanning" --include="*.xaml" .
grep -rn "CameraView" --include="*.cs" .
grep -rn "CameraView" --include="*.xaml" .
grep -rn "OnDetectionFinished" --include="*.cs" .
grep -rn "OnDetectionFinishedEventArg" --include="*.cs" .
grep -rn "e\.BarcodeResults" --include="*.cs" .
grep -rn "DisplayValue" --include="*.cs" .
grep -rn "BarcodeFormats\.Upca" --include="*.cs" .
grep -rn "scanner:" --include="*.xaml" .
Her isabeti belgeler. Hangi dosyaların CameraView XAML kullanımını içerdiğini (XAML değişiklikleri gerektirir) ve hangilerinin yalnızca kod arkasında değişiklikler içerdiğine dikkat edin. Taşıma işlemi sonrası silinmesi gereken herhangi bir UPC-A normalizasyon çözümü belirleyin.
Kod Güncelleme Görevleri
BarcodeScanning.Native.MauiNuGet paketini kaldırınIronBarcodeNuGet paketini kurunIronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";'iMauiProgram.csveyaApp.xaml.cs'e ekleyin- Tüm
.csdosyalarındausing BarcodeScanning;'ıusing IronBarCode;ile değiştirin - Tüm XAML dosyalarından
xmlns:scanner="..."ad alanı bildirimlerini kaldırın - XAML'deki
scanner:CameraViewkontrollerini,MediaPicker.CapturePhotoAsync()tetikleyen birButtonile değiştirin - XAML'den
OnDetectionFinished="..."etkinlik bağlantılarını kaldırın OnDetectionFinishedolay işleyicilerini,BarcodeReader.Read()kullananasyncbuton tıklama işleyicileriyle değiştirinbarcode.DisplayValue'iresult.Valueile her yerde değiştirinbarcode.BarcodeFormat'iresult.Formatile her yerde değiştirin- Tüm
BarcodeFormats.Upca+Substring(1)normalize etme çözümlerini silin - Çoklu barkod algılama daha önce
e.BarcodeResultsçoklu öğe döndürmeye dayanıyorsa,BarcodeReaderOptions'yeExpectMultipleBarcodes = trueekleyin - Asenkron düzen onları gereksiz kıldığında sonuç görüntüsü kodundan
MainThread.BeginInvokeOnMainThread()sarmalayıcılarını kaldırın AndroidManifest.xmlveInfo.plistkamera izinlerinin mevcut olduğunu doğrulayın
Geçiş Sonrası Testler
- iOS barcode taramasının çalıştığını ve UPC-A değerlerinin başında sıfırlar olmadan 12 basamaklı dizeler olarak döndüğünü doğrulayın
- Android barcode taramasının, uygulama tarafından kullanılan tüm formatlar için doğru değerleri ürettiğini doğrulayın
- Windows'ın bir yapı hedefi olması durumunda Windows MAUI barcode taramasının çalıştığını doğrulayın
- Gerçek gönderim etiketleri, ehliyetler veya biniş kartlarına karşı PDF417 taramasını test edin eğer bunlar kullanılıyorsa
ExpectMultipleBarcodes = trueile çoklu barkod senaryolarını test edin ve bir görüntüdeki tüm barkodların döndüğü onaylayın- Tüm MAUI hedeflerinde dosya seçici taramasının (
BarcodeReader.Read(filePath)) çalıştığını doğrulayın - Bu, taşınma yanında eklenen yeni bir yetenek ise PDF barcode okumanın doğrulayın
- Bir sunucu bileşeni eklendiyse, sunucu tarafı
BarcodeReader.Read()'ın doğru sonuçlar ürettiğini doğrulayın - Herhangi bir mevcut otomatik testi çalıştırın ve taşınma öncesi taban çizgileri ile barcode değer çıktısını karşılaştırın
IronBarcode'a Geçmenin Temel Faydaları
Tam Windows MAUI Desteği: IronBarcode, dört MAUI hedefinde çalışır — iOS, Android, Windows ve macOS — aynı kod ve aynı paket kullanılarak. Windows için platforma özgü barkod uygulaması gerekmez ve uygulama kodunda #if WINDOWS blokları gerekmez.
Herhangi Bir Girdi Kaynağı: BarcodeReader.Read() dosya yollarını, byte dizilerini, akışları ve PDF belgelerini kabul eder. Herhangi bir barcode senaryosu — kamera yakalama, dosya yükleme, galeri resmi, sunucu tarafı PDF işleme — aynı statik yöntemi, aynı sonuç türüyle kullanır.
Doğru UPC-A Değerleri: IronBarcode, iOS'de doğru 12 haneli UPC-A değerini uygulamada herhangi bir normalizasyon kodu olmadan döndürür. BarcodeScanning.Native.Maui'nin davranışı nedeniyle bir başına sıfır ile saklanan geçmiş UPC-A verileri, göçten sonra okunan değerlerin doğruluğunu etkilemez.
Güvenilir PDF417: PDF417 tamamen desteklenir ve güvenilir bir şekilde okunur. Gönderim etiketleri, ehliyet ve biniş kartları BarcodeScanning.Native.Maui'nin GitHub sorunlarında belgelenmiş olan "çoğu tarama gerçekleşmez" kısıtlaması olmaksızın tarar.
Barkod Oluşturma: BarcodeWriter.CreateBarcode() ve QRCodeWriter.CreateQrCode() Code128, QR, DataMatrix ve diğer formatları PNG dosyaları veya byte dizileri olarak üretir. Üretim ve okuma, aynı paketle sağlanır, ek bir bağımlılık gerektirmez.
Sunucu Tarafı Dağıtım: Aynı BarcodeReader.Read() çağrısı ASP.NET, Azure Functions, Docker konteynerlerinde ve AWS Lambda üzerinde çalışır. Mobil ve sunucu barcode mantığı, aynı API'yi, aynı format desteğini ve aynı sonuç tipini paylaşabilir, iki ayrı barcode uygulaması tutmaya gerek yoktur.
Sıkça Sorulan Sorular
BarcodeScanning.MAUI'den IronBarcode'a neden geçmeliyim?
Yaygın nedenler arasında lisanslamanın basitleştirilmesi (SDK + runtime anahtar karmaşıklığının kaldırılması), veri geçiş limitlerinin ortadan kaldırılması, yerel PDF desteği kazanılması, Docker/CI/CD dağıtımının iyileştirilmesi ve üretim kodunda API tekrarlama azalması yer alır.
BarcodeScanning.MAUI API çağrılarını IronBarcode ile nasıl değiştiririm?
Örnek oluşturma ve lisanslama tekrarlamalarını IronBarCode.License.LicenseKey = "anahtar" ile değiştirin. Okuyucu çağrılarını BarcodeReader.Read(yol) ile ve yazıcı çağrılarını BarcodeWriter.CreateBarcode(veri, kodlama) ile değiştirin. Statik yöntemler örnek yönetimi gerektirmez.
BarcodeScanning.MAUI'den IronBarcode'a geçişte ne kadar kod değişir?
Çoğu geçiş daha az kod satırıyla sonuçlanır. Lisanslama tekrarlamaları, örnek oluşturucular ve açık format yapılandırması kaldırılır. Temel okuma/yazma işlemleri, daha temiz sonuç nesneleriyle daha kısa IronBarcode eşdeğerlerine dönüştürülür.
Geçiş sırasında hem BarcodeScanning.MAUI hem de IronBarcode kurulu kalmalı mı?
Hayır. Çoğu geçiş doğrudan değişim yapılır, paralel bir işletim yerine geçer. Bir hizmet sınıfını bir seferde geçirin, NuGet referansını değiştirin ve sonraki sınıfa geçmeden önce başlatma ve API çağrı desenlerini güncelleyin.
IronBarcode için NuGet paketi adı nedir?
Paket 'IronBarCode' (büyük B ve C harfleriyle). 'Install-Package IronBarCode' veya 'dotnet add package IronBarCode' ile kurun. Kodda kullanılan yönerge 'using IronBarCode;' şeklindedir.
IronBarcode, BarcodeScanning.MAUI ile karşılaştırıldığında Docker dağıtımını nasıl basitleştirir?
IronBarcode, harici SDK dosyaları veya montajlı lisans yapılandırması olmayan bir NuGet paketidir. Docker'da, IRONBARCODE_LICENSE_KEY ortam değişkenini ayarlayın ve paket lisans doğrulamasını başlangıçta kendi kendine yapar.
IronBarcode, BarcodeScanning.MAUI'den geçişten sonra tüm barkod formatlarını otomatik olarak algılıyor mu?
Evet. IronBarcode, desteklenen tüm formatlardaki sembolojiyi otomatik olarak algılar. Açık BarcodeTypes sayımı gerekli değildir. Format zaten biliniyorsa ve performans önemliyse, BarcodeReaderOptions arama alanını optimize etmek için sınırlamayı sağlar.
IronBarcode, ayrı bir kütüphane olmadan PDF'lerden barkod okuyabiliyor mu?
Evet. BarcodeReader.Read("document.pdf") PDF dosyalarını yerel olarak işlemler. Sonuçlar her barkod için SayfaNumarası, Format, Değer ve Güven içerir. Harici bir PDF render adımı gerekmez.
IronBarcode, paralel barkod işlemeyi nasıl yönetiyor?
IronBarcode'un statik yöntemleri durumsuz ve thread-safe'dir. Dağıtılmış dosya listeleri üzerinde per-thread örnek yönetimi olmadan doğrudan Parallel.ForEach kullanın. BarcodeReaderOptions.MaxParallelThreads, iç thread bütçesini kontrol eder.
BarcodeScanning.MAUI'den IronBarcode'a geçişte hangi sonuç özellikleri değişir?
Yaygın yeniden adlandırmalar: BarcodeValue, Value olur; BarcodeType, Format olur. IronBarcode sonuçları ayrıca Güven ve SayfaNumarası ekler. Çözüm çapında arama-değiştirme, mevcut sonuç işleme kodundaki yeniden adlandırmaları ele alır.
Bir CI/CD hattında IronBarcode lisanslamasını nasıl ayarlayabilirim?
IRONBARCODE_LICENSE_KEY'i bir boru hattı sırrı olarak saklayın ve uygulama başlangıç kodunda IronBarCode.License.LicenseKey olarak atayın. Bir sır, geliştirme, test, aşama ve üretim dahil olmak üzere tüm ortamları kapsar.
IronBarcode, özel biçimlendirmeye sahip QR kodu üretimini destekliyor mu?
Evet. QRCodeWriter.CreateQrCode() özelleştirilmiş renkler için ChangeBarCodeColor(), logo yerleştirme için AddBrandLogo(), yapılandırılabilir hata düzeltme seviyeleri ve PNG, JPG, PDF ve akış dahil birden çok çıktı formatını destekler.

