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:
- Systemy zarządzania zapasami – automatyzacja śledzenia produktów dzięki obsłudze wielu BarCode'ów oraz obsłudze wielostronicowych plików TIFF/GIF
- Aplikacje logistyczne – przetwarzanie BarCodes wysyłkowych przy użyciu szybkiego odczytu i konfigurowalnych formatów wyjściowych
- Systemy POS dla handlu detalicznego – weryfikacja transakcji dzięki tworzeniu kodów kreskowych Code 39 i 1D BarCode
- Przetwarzanie dokumentów – Wyodrębnianie danych z faktur w formacie PDF przy użyciu niestandardowych ustawień czytnika
- Aplikacje medyczne – odczyt identyfikatorów pacjentów z korekcją błędów przy użyciu formatów 2D
- Kontrola jakości produkcji – uruchamianie przetwarzania wsadowego z konfigurowalnymi marginesami BarCode
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ść.
- Zainstaluj bibliotekę .NET do odczytu kodów kreskowych w języku C# przy użyciu pakietów NuGet
- Utwórz klasę skanowania kodów kreskowych z możliwością ponownego użycia, wyposażoną w odpowiednią obsługę błędów
- Opracowanie metod odczytu kodów kreskowych z różnych źródeł
- Zintegruj odczyt obrazów BarCode z aplikacją, korzystając z ulepszonych ustawień
- 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
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
Jak wygląda API w Swagger UI?

Jak wygląda odpowiedź API?

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
Jakie inne ulepszenia warto rozważyć?
- Obsługa błędów: Wdrożenie kompleksowej obsługi błędów, w tym rozpoznawania BarCode MSI
- Przetwarzanie wsadowe: Tworzenie metod do asynchronicznego przetwarzania wsadowego z obrazami BARCODE-ów 1-BPP
- Monitorowanie wydajności: Dodaj wskaźniki z konfiguracją prędkości odczytu
- Buforowanie: Wprowadź buforowanie wyników dla często skanowanych BarCodes
- Wstępne przetwarzanie obrazu: zastosuj korekcję orientacji i filtry kontrastu
- Optymalizacje specyficzne dla formatów: Skonfiguruj ustawienia dla GS1-128 i nowych formatów
WebSocketWsparcie: Dodaj skanowanie BARCODE w czasie rzeczywistym w celu ciągłego monitorowania- Stylizacja niestandardowa: stosowanie stylów BARCODE i dostosowywanie kodów QR
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.




