Przejdź do treści stopki
KORZYSTANIE Z IRONBARCODE

Jak zbudować SDK czytnika kodów kreskowych w .NET?

IronBarcode pozwala programistom .NET na dodanie funkcji odczytu kodów kreskowych do swoich aplikacji przy minimalnym nakładzie kodu. Obsługuje wiele formatów, w tym BARCODE'y 1D i 2D oraz różne źródła obrazów, a także zapewnia wysoką dokładność dzięki wykrywaniu opartemu na uczeniu maszynowym w środowiskach produkcyjnych.

Skanowanie BarCode ma kluczowe znaczenie dla wielu zastosowań, od zarządzania zapasami po handel detaliczny i logistykę. Dzięki zintegrowaniu funkcji odczytu kodów kreskowych z aplikacjami .NET można uprościć gromadzenie danych, zautomatyzować przepływy pracy i zwiększyć wydajność. Oceniając rozwiązania do odczytu kodów kreskowych, należy wziąć pod uwagę takie czynniki, jak obsługiwane formaty, szybkość przetwarzania i złożoność integracji. Biblioteka IronBarcode oferuje pełną kompatybilność międzyplatformową oraz wyjątkowe funkcje odporności na awarie.

IronBarcode to skuteczna biblioteka .NET, która upraszcza pracę z kodami kreskowymi. Za pomocą tego narzędzia można odczytywać kody kreskowe z obrazów, strumieni i plików PDF, a także generować kody QR za pomocą generatora kodów QR w języku C#. W tym artykułe pokazano, jak zintegrować skanowanie kodów kreskowych z aplikacją .NET, skupiając się na tworzeniu integracji API lub aplikacji internetowej w celu udostępnienia funkcji skanowania kodów kreskowych. Biblioteka obsługuje różne formaty BARCODE-ów, w tym BARCODE-y 1D i 2D, oferując zaawansowane możliwości generowania i opcje stylizacji.

Jakie są najlepsze zastosowania integracji IronBarcode?

IronBarcode doskonale sprawdza się w następujących sytuacjach:

Jak stworzyć SDK czytnika BarCode w .NET?

Aby stworzyć czytnik kodów kreskowych, który może być udostępniony jako usługa w aplikacji, należy zintegrować IronBarcode z interfejsem API REST lub aplikacją internetową. Wybór architektury zależy od potrzeb przetwarzania: przetwarzanie pojedynczych obrazów w przypadku sporadycznego skanowania, przetwarzanie wsadowe w przypadku przepływów pracy z dokumentami lub przetwarzanie strumieniowe w przypadku aplikacji do ciągłego skanowania. Oto przykład wykorzystujący ASP.NET Core z uwzględnieniem odpowiednich zasad bezpieczeństwa wątków. Funkcje odczytu biblioteki obejmują zaawansowane filtry tworzenia obrazów zapewniające optymalną dokładność.

  1. Zainstaluj bibliotekę .NET do odczytu kodów kreskowych w języku C# przy użyciu pakietów NuGet
  2. Utwórz klasę skanowania kodów kreskowych z możliwością ponownego użycia, wyposażoną w odpowiednią obsługę błędów
  3. Opracowanie metod odczytu kodów kreskowych z różnych źródeł
  4. Zintegruj odczyt obrazów BarCode z aplikacją, korzystając z ulepszonych ustawień
  5. Testuj i popraw wydajność dzięki opcjom prędkości czytania

Czego potrzebuję przed rozpoczęciem?

Jeśli jeszcze tego nie zrobiłeś, pobierz IronBarcode do swojego projektu. Upewnij się, że posiadasz odpowiedni klucz licencyjny do zamierzonego zastosowania. Należy pamiętać, że udostępnianie funkcji IronBarcode za pośrednictwem publicznego API lub odsprzedaż jako samodzielnej usługi wymaga dodatkowej licencji (SDK, OEM lub SaaS). Przed rozpoczęciem pracy upewnij się, że rozumiesz opcje licencyjne. W przypadku środowisk programistycznych można zacząć od bezpłatnej wersji próbnej, a gdy wszystko będzie gotowe do produkcji, zastosować klucz licencyjny. Zapoznaj się z dziennikiem zmian, aby uzyskać informacje o najnowszych aktualizacjach i kamieńiach milowych.

Aby uzyskać optymalną wydajność, należy wziąć pod uwagę środowisko wdrożeniowe. IronBarcode obsługuje kompatybilność międzyplatformową, w tym systemy Windows, Linux, macOS, Docker oraz platformy chmurowe, takie jak Azure i AWS Lambda. Programiści aplikacji mobilnych mogą korzystać z obsługi systemów Android i iOS dzięki integracji z Blazor. W przypadku aplikacji .NET MAUI należy postępować zgodnie z samouczkiem dotyczącym czytnika kodów kreskowych BarCode.

Jak utworzyć klasę skanera BarCode?

Po skonfigurowaniu IronBarcode i zainstalowaniu go w projekcie można utworzyć klasę skanera kodów kreskowych wielokrotnego użytku, która integruje funkcjonalność IronBarcode i udostępnia ją jako punkt końcowy API. Wdrożenie obejmuje optymalizację wydajności oraz korekcję obrazu w trudnych scenariuszach z korekcją orientacji. Rozważ wdrożenie obszarów przycinania w celu przyspieszenia przetwarzania, gdy lokalizacje BarCode są przewidywalne:

using IronBarCode;
using System.IO;
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace BarcodeIntegration
{
    public class BarcodeScanner
    {
        private static readonly ConcurrentDictionary<string, BarcodeReaderOptions> _optionsCache = new();

        static BarcodeScanner()
        {
            // Set the license key
            IronBarCode.License.LicenseKey = "Your-License-Key";
        }

        // Method to read a barcode from an image file with performance optimization
        public string ReadBarcodeFromImage(string imagePath, BarcodeReadingSpeed speed = BarcodeReadingSpeed.Balanced)
        {
            try
            {
                var options = GetCachedOptions(speed);
                // Try to read the barcode from the given image path
                var barcode = BarcodeReader.Read(imagePath, options);
                return barcode?.ToString() ?? "No Barcode Found"; // Return the barcode string or indicate no barcode was found
            }
            catch (Exception ex)
            {
                // Return an error message if an exception occurs
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a stream (e.g., file upload or memory stream)
        public async Task<string> ReadBarcodeFromStreamAsync(Stream inputStream)
        {
            try
            {
                var options = GetCachedOptions(BarcodeReadingSpeed.Detailed);
                // Enable image correction for better accuracy
                options.ImageFilters = new[] { 
                    new SharpenFilter(), 
                    new ContrastFilter() 
                };

                // Try to read the barcode from the given stream
                var barcode = await Task.Run(() => BarcodeReader.Read(inputStream, options));
                return barcode?.ToString() ?? "No barcode found";
            }
            catch (Exception ex)
            {
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a PDF file with batch processing support
        public async Task<List<string>> ReadBarcodesFromPdfAsync(string filePath)
        {
            try
            {
                var options = new BarcodeReaderOptions
                {
                    ExpectMultipleBarcodes = true,
                    Speed = BarcodeReadingSpeed.Detailed
                };

                // Try to read barcodes from the given PDF file path
                var barcodes = await Task.Run(() => BarcodeReader.ReadPdf(filePath, options));
                return barcodes.Select(b => b.ToString()).ToList();
            }
            catch (Exception ex)
            {
                return new List<string> { $"Error reading barcode: {ex.Message}" };
            }
        }

        // Cache reader options for performance
        private BarcodeReaderOptions GetCachedOptions(BarcodeReadingSpeed speed)
        {
            return _optionsCache.GetOrAdd(speed.ToString(), _ => new BarcodeReaderOptions
            {
                Speed = speed,
                AutoRotate = true,
                RemoveFalsePositive = true
            });
        }
    }
}
using IronBarCode;
using System.IO;
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace BarcodeIntegration
{
    public class BarcodeScanner
    {
        private static readonly ConcurrentDictionary<string, BarcodeReaderOptions> _optionsCache = new();

        static BarcodeScanner()
        {
            // Set the license key
            IronBarCode.License.LicenseKey = "Your-License-Key";
        }

        // Method to read a barcode from an image file with performance optimization
        public string ReadBarcodeFromImage(string imagePath, BarcodeReadingSpeed speed = BarcodeReadingSpeed.Balanced)
        {
            try
            {
                var options = GetCachedOptions(speed);
                // Try to read the barcode from the given image path
                var barcode = BarcodeReader.Read(imagePath, options);
                return barcode?.ToString() ?? "No Barcode Found"; // Return the barcode string or indicate no barcode was found
            }
            catch (Exception ex)
            {
                // Return an error message if an exception occurs
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a stream (e.g., file upload or memory stream)
        public async Task<string> ReadBarcodeFromStreamAsync(Stream inputStream)
        {
            try
            {
                var options = GetCachedOptions(BarcodeReadingSpeed.Detailed);
                // Enable image correction for better accuracy
                options.ImageFilters = new[] { 
                    new SharpenFilter(), 
                    new ContrastFilter() 
                };

                // Try to read the barcode from the given stream
                var barcode = await Task.Run(() => BarcodeReader.Read(inputStream, options));
                return barcode?.ToString() ?? "No barcode found";
            }
            catch (Exception ex)
            {
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a PDF file with batch processing support
        public async Task<List<string>> ReadBarcodesFromPdfAsync(string filePath)
        {
            try
            {
                var options = new BarcodeReaderOptions
                {
                    ExpectMultipleBarcodes = true,
                    Speed = BarcodeReadingSpeed.Detailed
                };

                // Try to read barcodes from the given PDF file path
                var barcodes = await Task.Run(() => BarcodeReader.ReadPdf(filePath, options));
                return barcodes.Select(b => b.ToString()).ToList();
            }
            catch (Exception ex)
            {
                return new List<string> { $"Error reading barcode: {ex.Message}" };
            }
        }

        // Cache reader options for performance
        private BarcodeReaderOptions GetCachedOptions(BarcodeReadingSpeed speed)
        {
            return _optionsCache.GetOrAdd(speed.ToString(), _ => new BarcodeReaderOptions
            {
                Speed = speed,
                AutoRotate = true,
                RemoveFalsePositive = true
            });
        }
    }
}
Imports IronBarCode
Imports System.IO
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

Namespace BarcodeIntegration
    Public Class BarcodeScanner
        Private Shared ReadOnly _optionsCache As New ConcurrentDictionary(Of String, BarcodeReaderOptions)()

        Shared Sub New()
            ' Set the license key
            IronBarCode.License.LicenseKey = "Your-License-Key"
        End Sub

        ' Method to read a barcode from an image file with performance optimization
        Public Function ReadBarcodeFromImage(imagePath As String, Optional speed As BarcodeReadingSpeed = BarcodeReadingSpeed.Balanced) As String
            Try
                Dim options = GetCachedOptions(speed)
                ' Try to read the barcode from the given image path
                Dim barcode = BarcodeReader.Read(imagePath, options)
                Return If(barcode?.ToString(), "No Barcode Found") ' Return the barcode string or indicate no barcode was found
            Catch ex As Exception
                ' Return an error message if an exception occurs
                Return $"Error reading barcode: {ex.Message}"
            End Try
        End Function

        ' Method to read a barcode from a stream (e.g., file upload or memory stream)
        Public Async Function ReadBarcodeFromStreamAsync(inputStream As Stream) As Task(Of String)
            Try
                Dim options = GetCachedOptions(BarcodeReadingSpeed.Detailed)
                ' Enable image correction for better accuracy
                options.ImageFilters = {New SharpenFilter(), New ContrastFilter()}

                ' Try to read the barcode from the given stream
                Dim barcode = Await Task.Run(Function() BarcodeReader.Read(inputStream, options))
                Return If(barcode?.ToString(), "No barcode found")
            Catch ex As Exception
                Return $"Error reading barcode: {ex.Message}"
            End Try
        End Function

        ' Method to read a barcode from a PDF file with batch processing support
        Public Async Function ReadBarcodesFromPdfAsync(filePath As String) As Task(Of List(Of String))
            Try
                Dim options = New BarcodeReaderOptions With {
                    .ExpectMultipleBarcodes = True,
                    .Speed = BarcodeReadingSpeed.Detailed
                }

                ' Try to read barcodes from the given PDF file path
                Dim barcodes = Await Task.Run(Function() BarcodeReader.ReadPdf(filePath, options))
                Return barcodes.Select(Function(b) b.ToString()).ToList()
            Catch ex As Exception
                Return New List(Of String) From {$"Error reading barcode: {ex.Message}"}
            End Try
        End Function

        ' Cache reader options for performance
        Private Function GetCachedOptions(speed As BarcodeReadingSpeed) As BarcodeReaderOptions
            Return _optionsCache.GetOrAdd(speed.ToString(), Function(_) New BarcodeReaderOptions With {
                .Speed = speed,
                .AutoRotate = True,
                .RemoveFalsePositive = True
            })
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

Ta ulepszona klasa BarcodeScanner zawiera optymalizacje wydajności poprzez buforowanie opcji, przetwarzanie asynchroniczne zapewniające lepszą skalowalność oraz filtry obrazów poprawiające dokładność. Implementacja jest zgodna z zasadami SOLID i zapewnia obsługę błędów gotową do wdrożenia w środowisku produkcyjnym. Aby uzyskać dodatkową funkcjonalność, rozważ użycie integracji z System.Drawing lub eksportowanie jako strumienie. Można również tworzyć obrazy kodów kreskowych z niestandardowymi stylami kodów kreskowych i stylizacją kodów QR.

Jakich metod należy używać do odczytu różnych źródeł BarCodes?

Każda metoda została ulepszona pod kątem konkretnych przypadków użycia i wymagań przetwarzania:

  • ReadBarcodeFromImage(string imagePath): Odczytuje BARCODE z pliku graficznego.
  • ReadBarcodeFromStream(Stream inputStream): Odczytuje BARCODE ze strumienia wejściowego (np. przesłanego pliku lub strumienia pamięci).
  • ReadBarcodeFromPdf(string filePath): Odczytuje BARCODE z pliku PDF.

W przypadku dużych ilości danych warto rozważyć użycie obszarów przycinania, aby nawet 5-krotnie zwiększyć szybkość przetwarzania, gdy lokalizacje BARCODE-ów są przewidywalne. Można również tworzyć obrazy BARCODE lub zapisywać BARCODE w różnych formatach. Biblioteka obsługuje odczyt z obiektów System.Drawing i może eksportować BarCodes jako dokumenty HTML lub PDF.

Jak udostępnić funkcję odczytu BarCode za pośrednictwem interfejsu API REST?

Aby umożliwić aplikacjom zewnętrznym korzystanie z funkcji skanowania kodów kreskowych, udostępnij ją jako interfejs API REST przy użyciu ASP.NET Core. Implementacja obejmuje prawidłową obsługę błędów, walidację oraz obsługę wielu formatów danych wejściowych. Możesz również generować kody kreskowe za pomocą generatora obrazów BarCode C# lub zapoznać się z przykładami szybkiego startu dotyczącymi kodów kreskowych. Podczas przetwarzania plików PDF warto rozważyć umieszczenie BARCODE-ów na istniejących plikach w celu śledzenia dokumentów:

using Microsoft.AspNetCore.Mvc;
using System.IO;
using Microsoft.AspNetCore.Http;
using BarcodeIntegration;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    private readonly BarcodeScanner _barcodeScanner;
    private readonly ILogger<BarcodeController> _logger;

    public BarcodeController(ILogger<BarcodeController> logger)
    {
        _barcodeScanner = new BarcodeScanner();
        _logger = logger;
    }

    // POST endpoint to read barcode from an uploaded image
    [HttpPost("read-from-image")]
    public async Task<IActionResult> ReadFromImage(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest(new { Error = "No file uploaded" });

        // Validate file type
        var allowedTypes = new[] { "image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff" };
        if (!allowedTypes.Contains(file.ContentType.ToLower()))
            return BadRequest(new { Error = "Unsupported file type" });

        try
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);

            _logger.LogInformation($"Barcode read successfully from {file.FileName}");
            return Ok(new { Barcode = result, FileName = file.FileName });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode");
            return StatusCode(500, new { Error = "Internal server error" });
        }
    }

    // POST endpoint for batch processing
    [HttpPost("read-batch")]
    public async Task<IActionResult> ReadBatch(List<IFormFile> files)
    {
        var results = new List<object>();

        foreach (var file in files)
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);
            results.Add(new { FileName = file.FileName, Barcode = result });
        }

        return Ok(new { Results = results, Count = results.Count });
    }

    // POST endpoint to generate barcode from data
    [HttpPost("generate")]
    public IActionResult GenerateBarcode([FromBody] BarcodeGenerationRequest request)
    {
        try
        {
            // Create barcode with specified data and format
            var barcode = BarcodeWriter.CreateBarcode(request.Data, request.Format ?? BarcodeWriterEncoding.Code128);

            // Apply custom styling if requested
            if (request.Width.HasValue && request.Height.HasValue)
                barcode.ResizeTo(request.Width.Value, request.Height.Value);

            if (!string.IsNullOrEmpty(request.ForegroundColor))
                barcode.ChangeBarCodeColor(System.Drawing.ColorTranslator.FromHtml(request.ForegroundColor));

            // Return as base64 encoded image
            using var ms = barcode.ToStream();
            var bytes = ms.ToArray();
            return Ok(new { 
                Image = Convert.ToBase64String(bytes),
                Format = request.Format?.ToString() ?? "Code128",
                Data = request.Data 
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating barcode");
            return BadRequest(new { Error = "Failed to generate barcode" });
        }
    }
}

public class BarcodeGenerationRequest
{
    public string Data { get; set; }
    public BarcodeWriterEncoding? Format { get; set; }
    public int? Width { get; set; }
    public int? Height { get; set; }
    public string ForegroundColor { get; set; }
}
using Microsoft.AspNetCore.Mvc;
using System.IO;
using Microsoft.AspNetCore.Http;
using BarcodeIntegration;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    private readonly BarcodeScanner _barcodeScanner;
    private readonly ILogger<BarcodeController> _logger;

    public BarcodeController(ILogger<BarcodeController> logger)
    {
        _barcodeScanner = new BarcodeScanner();
        _logger = logger;
    }

    // POST endpoint to read barcode from an uploaded image
    [HttpPost("read-from-image")]
    public async Task<IActionResult> ReadFromImage(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest(new { Error = "No file uploaded" });

        // Validate file type
        var allowedTypes = new[] { "image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff" };
        if (!allowedTypes.Contains(file.ContentType.ToLower()))
            return BadRequest(new { Error = "Unsupported file type" });

        try
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);

            _logger.LogInformation($"Barcode read successfully from {file.FileName}");
            return Ok(new { Barcode = result, FileName = file.FileName });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode");
            return StatusCode(500, new { Error = "Internal server error" });
        }
    }

    // POST endpoint for batch processing
    [HttpPost("read-batch")]
    public async Task<IActionResult> ReadBatch(List<IFormFile> files)
    {
        var results = new List<object>();

        foreach (var file in files)
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);
            results.Add(new { FileName = file.FileName, Barcode = result });
        }

        return Ok(new { Results = results, Count = results.Count });
    }

    // POST endpoint to generate barcode from data
    [HttpPost("generate")]
    public IActionResult GenerateBarcode([FromBody] BarcodeGenerationRequest request)
    {
        try
        {
            // Create barcode with specified data and format
            var barcode = BarcodeWriter.CreateBarcode(request.Data, request.Format ?? BarcodeWriterEncoding.Code128);

            // Apply custom styling if requested
            if (request.Width.HasValue && request.Height.HasValue)
                barcode.ResizeTo(request.Width.Value, request.Height.Value);

            if (!string.IsNullOrEmpty(request.ForegroundColor))
                barcode.ChangeBarCodeColor(System.Drawing.ColorTranslator.FromHtml(request.ForegroundColor));

            // Return as base64 encoded image
            using var ms = barcode.ToStream();
            var bytes = ms.ToArray();
            return Ok(new { 
                Image = Convert.ToBase64String(bytes),
                Format = request.Format?.ToString() ?? "Code128",
                Data = request.Data 
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating barcode");
            return BadRequest(new { Error = "Failed to generate barcode" });
        }
    }
}

public class BarcodeGenerationRequest
{
    public string Data { get; set; }
    public BarcodeWriterEncoding? Format { get; set; }
    public int? Width { get; set; }
    public int? Height { get; set; }
    public string ForegroundColor { get; set; }
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports Microsoft.AspNetCore.Http
Imports BarcodeIntegration

<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
    Inherits ControllerBase

    Private ReadOnly _barcodeScanner As BarcodeScanner
    Private ReadOnly _logger As ILogger(Of BarcodeController)

    Public Sub New(logger As ILogger(Of BarcodeController))
        _barcodeScanner = New BarcodeScanner()
        _logger = logger
    End Sub

    ' POST endpoint to read barcode from an uploaded image
    <HttpPost("read-from-image")>
    Public Async Function ReadFromImage(file As IFormFile) As Task(Of IActionResult)
        If file Is Nothing OrElse file.Length = 0 Then
            Return BadRequest(New With {.Error = "No file uploaded"})
        End If

        ' Validate file type
        Dim allowedTypes = New String() {"image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff"}
        If Not allowedTypes.Contains(file.ContentType.ToLower()) Then
            Return BadRequest(New With {.Error = "Unsupported file type"})
        End If

        Try
            Using stream = file.OpenReadStream()
                Dim result = Await _barcodeScanner.ReadBarcodeFromStreamAsync(stream)

                _logger.LogInformation($"Barcode read successfully from {file.FileName}")
                Return Ok(New With {.Barcode = result, .FileName = file.FileName})
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error processing barcode")
            Return StatusCode(500, New With {.Error = "Internal server error"})
        End Try
    End Function

    ' POST endpoint for batch processing
    <HttpPost("read-batch")>
    Public Async Function ReadBatch(files As List(Of IFormFile)) As Task(Of IActionResult)
        Dim results = New List(Of Object)()

        For Each file In files
            Using stream = file.OpenReadStream()
                Dim result = Await _barcodeScanner.ReadBarcodeFromStreamAsync(stream)
                results.Add(New With {.FileName = file.FileName, .Barcode = result})
            End Using
        Next

        Return Ok(New With {.Results = results, .Count = results.Count})
    End Function

    ' POST endpoint to generate barcode from data
    <HttpPost("generate")>
    Public Function GenerateBarcode(<FromBody> request As BarcodeGenerationRequest) As IActionResult
        Try
            ' Create barcode with specified data and format
            Dim barcode = BarcodeWriter.CreateBarcode(request.Data, If(request.Format, BarcodeWriterEncoding.Code128))

            ' Apply custom styling if requested
            If request.Width.HasValue AndAlso request.Height.HasValue Then
                barcode.ResizeTo(request.Width.Value, request.Height.Value)
            End If

            If Not String.IsNullOrEmpty(request.ForegroundColor) Then
                barcode.ChangeBarCodeColor(System.Drawing.ColorTranslator.FromHtml(request.ForegroundColor))
            End If

            ' Return as base64 encoded image
            Using ms = barcode.ToStream()
                Dim bytes = ms.ToArray()
                Return Ok(New With {
                    .Image = Convert.ToBase64String(bytes),
                    .Format = If(request.Format?.ToString(), "Code128"),
                    .Data = request.Data
                })
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error generating barcode")
            Return BadRequest(New With {.Error = "Failed to generate barcode"})
        End Try
    End Function
End Class

Public Class BarcodeGenerationRequest
    Public Property Data As String
    Public Property Format As BarcodeWriterEncoding?
    Public Property Width As Integer?
    Public Property Height As Integer?
    Public Property ForegroundColor As String
End Class
$vbLabelText   $csharpLabel

Jak wygląda API w Swagger UI?

Interfejs Swagger UI przedstawiający API BarcoderScannerSDK z dwoma punktami końcowymi POST do odczytu kodów kreskowych z obrazów i plików PDF, zawierający interfejs przesyłania plików oraz opcje konfiguracji żądań

Jak wygląda odpowiedź API?

Dokumentacja API przedstawiająca pomyślne żądanie POST do punktu końcowego odczytu BARCODE, który zwraca komunikat

To API udostępnia punkty końcowe POST, do których można przesyłać obrazy kodów kreskowych, a API zwraca dane BarCode. Wdrożenie obejmuje odpowiednią walidację, obsługę błędów i rejestrowanie w celu wykorzystania w środowisku produkcyjnym. W przypadku aplikacji mobilnych warto rozważyć dodanie punktów końcowych zoptymalizowanych pod kątem mniejszych rozmiarów obrazów i szybszych czasów odpowiedzi. Można również tworzyć BARCODES na podstawie danych lub eksportować je w formacie HTML lub PDF. Aby spełnić wymagania dotyczące wysokiego kontrastu, należy wygenerować obrazy BarCode 1-BPP.## Jakie zaawansowane funkcje mogę dodać?

Aby jeszcze bardziej ulepszyć swój zestaw SDK, rozważ wdrożenie tych gotowych do użycia w środowisku produkcyjnym funkcji, korzystając z kompletnej Dokumentacji API IronBarcode. Zapoznaj się z przeglądem funkcji i sprawdź wersje demonstracyjne, aby zobaczyć praktyczne zastosowania:

Jak obsługiwać wiele typów BarCodes?

IronBarcode obsługuje odczyt wielu kodów kreskowych jednocześnie. Możesz skonfigurować swój SDK tak, aby akceptował wiele BARCODE-ów jednocześnie z filtrowaniem według określonego formatu. Biblioteka obsługuje zapis BARCODE'ów Unicode, w tym znaków chińskich i arabskich. W przypadku specjalistycznych zastosowań zapoznaj się z odczytem kodu 39 i twórz kody QR o niestandardowym wyglądzie:

public async Task<List<BarcodeResult>> ReadMultipleBarcodesAsync(string imagePath, BarcodeEncoding[] expectedTypes = null)
{
    try
    {
        var options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = expectedTypes ?? BarcodeEncoding.All,
            Speed = BarcodeReadingSpeed.Detailed,
            MaxParallelThreads = Environment.ProcessorCount,
            Multithreaded = true
        };

        // Apply confidence threshold for machine learning accuracy
        options.Confidence = Confidence.High;

        var results = await Task.Run(() => BarcodeReader.Read(imagePath, options));

        return results.Select(barcode => new BarcodeResult
        {
            Value = barcode.ToString(),
            Format = barcode.BarcodeType.ToString(),
            Confidence = barcode.Confidence,
            Position = barcode.Rect
        }).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error reading multiple barcodes");
        throw;
    }
}
public async Task<List<BarcodeResult>> ReadMultipleBarcodesAsync(string imagePath, BarcodeEncoding[] expectedTypes = null)
{
    try
    {
        var options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = expectedTypes ?? BarcodeEncoding.All,
            Speed = BarcodeReadingSpeed.Detailed,
            MaxParallelThreads = Environment.ProcessorCount,
            Multithreaded = true
        };

        // Apply confidence threshold for machine learning accuracy
        options.Confidence = Confidence.High;

        var results = await Task.Run(() => BarcodeReader.Read(imagePath, options));

        return results.Select(barcode => new BarcodeResult
        {
            Value = barcode.ToString(),
            Format = barcode.BarcodeType.ToString(),
            Confidence = barcode.Confidence,
            Position = barcode.Rect
        }).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error reading multiple barcodes");
        throw;
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks

Public Async Function ReadMultipleBarcodesAsync(imagePath As String, Optional expectedTypes As BarcodeEncoding() = Nothing) As Task(Of List(Of BarcodeResult))
    Try
        Dim options As New BarcodeReaderOptions() With {
            .ExpectMultipleBarcodes = True,
            .ExpectBarcodeTypes = If(expectedTypes, BarcodeEncoding.All),
            .Speed = BarcodeReadingSpeed.Detailed,
            .MaxParallelThreads = Environment.ProcessorCount,
            .Multithreaded = True
        }

        ' Apply confidence threshold for machine learning accuracy
        options.Confidence = Confidence.High

        Dim results = Await Task.Run(Function() BarcodeReader.Read(imagePath, options))

        Return results.Select(Function(barcode) New BarcodeResult With {
            .Value = barcode.ToString(),
            .Format = barcode.BarcodeType.ToString(),
            .Confidence = barcode.Confidence,
            .Position = barcode.Rect
        }).ToList()
    Catch ex As Exception
        _logger.LogError(ex, "Error reading multiple barcodes")
        Throw
    End Try
End Function
$vbLabelText   $csharpLabel

Jakie inne ulepszenia warto rozważyć?

W przypadku wdrożeń produkcyjnych warto rozważyć wdrożenie progów pewności, aby ograniczyć liczbę wyników fałszywie pozytywnych i zapewnić dokładność danych. Wykrywanie oparte na uczeniu maszynowym można dostosować do konkretnego przypadku użycia. Podczas tworzenia pakietów wdrożeniowych należy postępować zgodnie z instrukcją instalatora MSI i rozwiązać wszelkie problemy związane z brakującymi plikami DLL. W przypadku wdrożeń AWS należy pamiętać o potencjalnych problemach związanych z działaniem środowiska uruchomieniowego. Rozważ tworzenie BarCodes w różnych formatach danych wyjściowych i zapoznaj się z samouczkami dotyczącymi odczytu BarCodes.

O jakich kwestiach związanych z licencjonowaniem powinienem pamiętać?

Jak wspomniano wcześniej, zestaw SDK IronBarcode jest przeznaczony do integracji z aplikacjami wewnętrznymi, a udostępnienie go za pośrednictwem interfejsu API wymaga dodatkowej licencji. Przed udostępnieniem IronBarcode jako części usługi, takiej jak publiczne API, należy uzyskać niezbędną licencję (SDK, OEM lub SaaS). W przypadku wdrożeń Enterprise warto rozważyć rozszerzenia licencji, które zapewniają dodatkowe stanowiska lub lepsze wsparcie techniczne. Zapoznaj się z opcjami aktualizacji, aby skalować swoje wdrożenie.

Nie wolno odsprzedawać IronBarcode jako samodzielnego zestawu SDK ani udostępniać go za pośrednictwem publicznego interfejsu API bez upewnienia się, że posiadana licencja obejmuje takie zastosowanie. W przypadku aplikacji internetowych może być konieczne skonfigurowanie klucza licencyjnego w pliku web.config w celu prawidłowej aktywacji. Bądź na bieżąco z aktualizacjami CVE dotyczącymi bezpieczeństwa i stosuj się do najlepszych praktyk w zakresie wyjątków kopiowania w czasie wykonywania. W przypadku problemów technicznych prosimy o przesłanie zgłoszenia do działu inżynierii. Zapoznaj się z materiałami na temat pisania BARCODE-ów Unicode i przejrzyj samouczek dotyczący odczytywania BARCODE-ów.

Dłączego warto wypróbować IronBarcode już dziś?

Poznaj nowe możliwości IronBarcode. Wypróbuj naszą bezpłatną wersję próbną i odkryj płynne generowanie, odczytywanie i edycję BarCode dla swoich aplikacji .NET. Dzięki zaawansowanym funkcjom, wyjątkowej wydajności i przyjaznemu dla użytkownika interfejsowi IronBarcode jest najlepszym rozwiązaniem dla wszystkich Twoich potrzeb związanych z kodami kreskowymi. Zapoznaj się z naszą pełną dokumentacją, przejrzyj przykłady kodu i obejrzyj prezentacje na żywo, aby zrozumieć wszystkie możliwości. Zapoznaj się z samouczkami dotyczącymi odczytu kodów kreskowych i sprawdź obsługę MicroQR oraz rMQR. Dowiedz się więcej o opcjach pakietów NuGet dla różnych scenariuszy wdrażania. Więcej informacji na temat naszego kompleksowego rozwiązania do obsługi BarCode można znaleźć w dokumentacji IronBarcode. Rozpocznij bezpłatny okres próbny już dziś i usprawnij swoje projekty.

Często Zadawane Pytania

Jak moge zintegrowac czytnik kodow kreskowych z aplikacja .NET?

Mozesz zintegrowac czytnik kodow kreskowych z aplikacja .NET, korzystajac z biblioteki IronBarcode. Najpierw zainstaluj IronBarcode, nastepnie utworz klase do skanowania kodow kreskowych i zaimplementuj metody do odczytu kodow z obrazow, strumieni i PDF-ow. Na koniec przetestuj i zoptymalizuj swoje ustawienia.

Jak moge udostepnic funkcjonalnosc odczytu kodow kreskowych jako REST API?

Aby udostepnic funkcjonalnosc odczytu kodow kreskowych jako REST API, uzyj ASP.NET Core do utworzenia aplikacji sieciowej. Wlacz biblioteke IronBarcode, opracuj klase BarcodeScanner i zdefiniuj punkty koncowe API, ktore beda odczytywac kody przy uzyciu metod takich jak ReadBarcodeFromImage i ReadBarcodeFromStream.

Jakie rodzaje kodow kreskowych mozna odczytac, korzystajac z biblioteki .NET?

Biblioteka .NET, taka jak IronBarcode, moze odczytywac rozne rodzaje kodow kreskowych, w tym kody QR, Code 128, UPC i EAN. Mozesz skonfigurowac biblioteke tak, aby wykrywala wiele typow kodow jednoczesnie, ustawiajac odpowiednie parametry detekcji.

Jak moge obslugiwac bledy przy odczycie kodow kreskowych w .NET?

Obsluga bledow w odczycie kodow kreskowych moze zostac osiagnieta poprzez zaimplementowanie solidnej obslugi bledow w ramach twoich metod skanowania za pomoca IronBarcode. Upewnij sie, ze przechwytujesz wyjatki i dostarczasz sensowne informacje zwrotne lub mechanizmy ponawiania, aby poprawic niezawodnosc procesu odczytu kodow kreskowych.

Jakie sa wymagania licencyjne przy uzyciu bibliotek .NET do kodow kreskowych w publicznym API?

Korzystajac z IronBarcode w publicznym API, musisz zapewnic odpowiednia licencje. Obejmuje to uzyskanie licencji SDK, OEM lub SaaS, poniewaz udostepnienie funkcjonalnosci biblioteki jako samodzielnej uslugi lub publicznego API wymaga dodatkowych uprawnien.

Czy moge przetwarzac partiami wiele skanow kodow kreskowych korzystajac z biblioteki .NET?

Tak, mozna przetwarzac partiami wiele skanow kodow kreskowych korzystajac z IronBarcode. Biblioteka pozwala na odczyt wielu kodow kreskowych w jednej operacji, co moze byc szczegolnie przydatne przy efektywnym przetwarzaniu duzych zbiorow obrazow lub dokumentow.

Czy jest dostepna wersja probna biblioteki .NET do kodow kreskowych?

Tak, IronBarcode oferuje bezplatna wersje probna, pozwalajaca eksplorowac jej mozliwosci w zakresie generowania, odczytu i edycji kodow kreskowych w aplikacjach .NET. Ta wersja probna moze pomoc w ocenie biblioteki przed podjeciem decyzji o zakupie.

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie