Altbilgi içeriğine atla
VIDEOLAR

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
SHELL

IronBarcode'u kurun:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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
$vbLabelText   $csharpLabel

IronBarCode ad alanını ekleyin:

// Add
using IronBarCode;
// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

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"
XML

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"
$vbLabelText   $csharpLabel

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>
XML

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
$vbLabelText   $csharpLabel

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>
XML

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. BarcodeScanning.Native.Maui NuGet paketini kaldırın
  2. IronBarcode NuGet paketini kurun
  3. IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";'i MauiProgram.cs veya App.xaml.cs'e ekleyin
  4. Tüm .cs dosyalarında using BarcodeScanning;using IronBarCode; ile değiştirin
  5. Tüm XAML dosyalarından xmlns:scanner="..." ad alanı bildirimlerini kaldırın
  6. XAML'deki scanner:CameraView kontrollerini, MediaPicker.CapturePhotoAsync() tetikleyen bir Button ile değiştirin
  7. XAML'den OnDetectionFinished="..." etkinlik bağlantılarını kaldırın
  8. OnDetectionFinished olay işleyicilerini, BarcodeReader.Read() kullanan async buton tıklama işleyicileriyle değiştirin
  9. barcode.DisplayValue'i result.Value ile her yerde değiştirin
  10. barcode.BarcodeFormat'i result.Format ile her yerde değiştirin
  11. Tüm BarcodeFormats.Upca + Substring(1) normalize etme çözümlerini silin
  12. Çoklu barkod algılama daha önce e.BarcodeResults çoklu öğe döndürmeye dayanıyorsa, BarcodeReaderOptions'ye ExpectMultipleBarcodes = true ekleyin
  13. Asenkron düzen onları gereksiz kıldığında sonuç görüntüsü kodundan MainThread.BeginInvokeOnMainThread() sarmalayıcılarını kaldırın
  14. AndroidManifest.xml ve Info.plist kamera 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 = true ile ç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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara