Skaner kodów kreskowych ASP.NET Core
Wprowadzenie
ASP.NET Core to wieloplatformowy framework do tworzenia nowoczesnych aplikacji webowych. Jego model Razor Pages oferuje podejście oparte na stronach do obsługi żądań HTTP, co sprawia, że doskonale nadaje się do przetwarzania kodów kreskowych po stronie serwera. Za pomocą IronBarcode przesłane obrazy mogą być odbierane jako obiekty IFormFile, konwertowane do tablicy bajtów i przekazywane bezpośrednio do czytnika kodów kreskowych bez zapisywania tymczasowych plików na dysku.
Ten artykuł przeprowadza przez integrację IronBarcode w aplikacji ASP.NET Core Razor Pages w celu skanowania kodów kreskowych i QR z przesłanych obrazów, a także generowania kodów kreskowych z serwera.
Jak czytać i skanować kody kreskowe w ASP.NET Core
- Zainstaluj bibliotekę C# do odczytu i skanowania kodów kreskowych
- Utwórz nowy projekt ASP.NET Core Razor Pages
- Zaprojektuj formularz przesyłania plików do akceptacji obrazów kodów kreskowych
- Użyj metody
Readdo skanowania przesłanego obrazu w poszukiwaniu kodów kreskowych - Wyświetl zdekodowaną wartość kodu kreskowego na stronie
IronBarcode: biblioteka IronBarcode w języku C
IronBarcode udostępnia solidne API do odczytu i zapisu kodów kreskowych w aplikacjach .NET. Biblioteka obsługuje przetwarzanie obrazów wewnętrznie, dzięki czemu programiści mogą przekazywać surowe bajty, ścieżki plików lub strumienie bezpośrednio do metody BarcodeReader.Read bez potrzeby stosowania osobnych bibliotek do przetwarzania obrazów. Obsługuje szeroki zakres formatów kodów kreskowych, w tym QR Code, Code 128, Code 39, PDF417, EAN i wiele innych.
Dla aplikacji webowych IronBarcode jest szczególnie przydatny, ponieważ przetwarza obrazy całkowicie w pamięci. Przesłane pliki nigdy nie muszą być zapisywane na dysku, co upraszcza wdrożenie i zmniejsza nakład pracy związanej z czyszczeniem. Ta sama biblioteka generuje także kody kreskowe za pomocą BarcodeWriter.CreateBarcode, co czyni ją jedyną niezbędną zależnością zarówno do odczytu, jak i zapisu.
Kroki do zbudowania skanera kodów kreskowych w ASP.NET Core
Wykonaj te kroki, aby utworzyć oparty na webie skaner kodów kreskowych przy użyciu ASP.NET Core Razor Pages i IronBarcode.
Wymagania wstępne
- Visual Studio 2022 lub późniejszy (lub dowolne IDE z obsługą .NET)
- SDK .NET 6.0 lub nowszy
Utwórz projekt
Utwórz nowy projekt ASP.NET Core Web App (Razor Pages). Można to zrobić za pomocą kreatora projektów w Visual Studio lub z wiersza poleceń:
dotnet new webapp -n BarcodeWebApp
dotnet new webapp -n BarcodeWebApp
Zainstaluj bibliotekę IronBarcode
Zainstaluj bibliotekę IronBarcode przy użyciu konsoli Menedżera pakietów NuGet. Przejdź do Tools > NuGet Package Manager > Package Manager Console w Visual Studio i uruchom:
Install-Package BarCode
Alternatywnie, zainstaluj to z wiersza poleceń za pomocą dotnet add package BarCode. Najnowsza wersja jest dostępna na stronie NuGet.
Frontend
Frontend składa się z formularza przesyłania plików i obszaru wyświetlania wyników. Formularz używa enctype="multipart/form-data" do obsługi przesyłania plików binarnych. Kiedy kod kreskowy zostanie wykryty, wynik pojawi się w alertu sukcesu poniżej przesłanego obrazu.
Zamień zawartość pliku Index.cshtml na następującą:
@page
@model IndexModel
@{
ViewData["Title"] = "Barcode Scanner";
}
<div class="container mt-4">
<h1 class="mb-4">Barcode Scanner</h1>
<div class="card mb-4">
<div class="card-header"><h5>Upload & Read Barcode</h5></div>
<div class="card-body">
<form method="post" asp-page-handler="Upload" enctype="multipart/form-data">
<div class="mb-3">
<label for="file" class="form-label">Select a barcode image:</label>
<input type="file" class="form-control" id="file"
name="UploadedFile" accept="image/*" />
</div>
<button type="submit" class="btn btn-primary">Scan Barcode</button>
</form>
@if (Model.ImageDataUrl != null)
{
<div class="mt-3">
<h6>Uploaded Image:</h6>
<img src="@Model.ImageDataUrl" alt="Uploaded barcode"
style="max-width: 300px;" class="img-thumbnail" />
</div>
}
@if (Model.BarcodeResult != null)
{
<div class="alert alert-success mt-3">
<strong>Barcode Value:</strong> @Model.BarcodeResult
</div>
}
@if (Model.ErrorMessage != null)
{
<div class="alert alert-warning mt-3">@Model.ErrorMessage</div>
}
</div>
</div>
</div>
@page
@model IndexModel
@{
ViewData["Title"] = "Barcode Scanner";
}
<div class="container mt-4">
<h1 class="mb-4">Barcode Scanner</h1>
<div class="card mb-4">
<div class="card-header"><h5>Upload & Read Barcode</h5></div>
<div class="card-body">
<form method="post" asp-page-handler="Upload" enctype="multipart/form-data">
<div class="mb-3">
<label for="file" class="form-label">Select a barcode image:</label>
<input type="file" class="form-control" id="file"
name="UploadedFile" accept="image/*" />
</div>
<button type="submit" class="btn btn-primary">Scan Barcode</button>
</form>
@if (Model.ImageDataUrl != null)
{
<div class="mt-3">
<h6>Uploaded Image:</h6>
<img src="@Model.ImageDataUrl" alt="Uploaded barcode"
style="max-width: 300px;" class="img-thumbnail" />
</div>
}
@if (Model.BarcodeResult != null)
{
<div class="alert alert-success mt-3">
<strong>Barcode Value:</strong> @Model.BarcodeResult
</div>
}
@if (Model.ErrorMessage != null)
{
<div class="alert alert-warning mt-3">@Model.ErrorMessage</div>
}
</div>
</div>
</div>
Układ używa klas Bootstrap już zawartych w domyślnym szablonie ASP.NET Core. Formularz wysyła dane do handlera strony Upload, a bloki warunkowe wyświetlają podgląd przesłanego obrazu, zdekodowany wynik lub komunikat o błędzie.
Przykładowe kody wejściowe
Poniższe przykładowe kody mogą być użyte do przetestowania skanera. Każdy obraz koduje inny format i wartość:
Kod QR kodujący "https://ironsoftware.com"
Kod kreskowy Code 128 kodujący "IRONBARCODE-2026"
Kod kreskowy Code 39 kodujący "HELLO123"
Skanowanie kodów kreskowych z IronBarcode
Logika po stronie serwera obsługuje przesłany plik w metodzie OnPostUploadAsync. Przesłany IFormFile jest odczytywany do tablicy bajtów, która jest przekazywana bezpośrednio do BarcodeReader.Read. Dzięki temu unika się zapisywania plików tymczasowych i cały proces odbywa się w pamięci.
Zamień zawartość w Index.cshtml.cs na:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using IronBarCode;
public class IndexModel : PageModel
{
[BindProperty]
public IFormFile? UploadedFile { get; set; }
public string? BarcodeResult { get; set; }
public string? ErrorMessage { get; set; }
public string? ImageDataUrl { get; set; }
public void OnGet()
{
}
public async Task<IActionResult> OnPostUploadAsync()
{
if (UploadedFile == null || UploadedFile.Length == 0)
{
ErrorMessage = "Please select an image file.";
return Page();
}
try
{
using var ms = new MemoryStream();
await UploadedFile.CopyToAsync(ms);
byte[] imageBytes = ms.ToArray();
// Store image as base64 for preview display
string base64 = Convert.ToBase64String(imageBytes);
ImageDataUrl = $"data:{UploadedFile.ContentType};base64,{base64}";
// Read barcode from uploaded image bytes
var results = BarcodeReader.Read(imageBytes);
if (results != null && results.Count() > 0)
{
BarcodeResult = string.Join("\n",
results.Select(r => r.Value));
}
else
{
ErrorMessage = "No barcode detected in the uploaded image.";
}
}
catch (Exception ex)
{
ErrorMessage = $"Error processing image: {ex.Message}";
}
return Page();
}
}
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using IronBarCode;
public class IndexModel : PageModel
{
[BindProperty]
public IFormFile? UploadedFile { get; set; }
public string? BarcodeResult { get; set; }
public string? ErrorMessage { get; set; }
public string? ImageDataUrl { get; set; }
public void OnGet()
{
}
public async Task<IActionResult> OnPostUploadAsync()
{
if (UploadedFile == null || UploadedFile.Length == 0)
{
ErrorMessage = "Please select an image file.";
return Page();
}
try
{
using var ms = new MemoryStream();
await UploadedFile.CopyToAsync(ms);
byte[] imageBytes = ms.ToArray();
// Store image as base64 for preview display
string base64 = Convert.ToBase64String(imageBytes);
ImageDataUrl = $"data:{UploadedFile.ContentType};base64,{base64}";
// Read barcode from uploaded image bytes
var results = BarcodeReader.Read(imageBytes);
if (results != null && results.Count() > 0)
{
BarcodeResult = string.Join("\n",
results.Select(r => r.Value));
}
else
{
ErrorMessage = "No barcode detected in the uploaded image.";
}
}
catch (Exception ex)
{
ErrorMessage = $"Error processing image: {ex.Message}";
}
return Page();
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.AspNetCore.Mvc.RazorPages
Imports IronBarCode
Imports System.IO
Imports System.Threading.Tasks
Public Class IndexModel
Inherits PageModel
<BindProperty>
Public Property UploadedFile As IFormFile
Public Property BarcodeResult As String
Public Property ErrorMessage As String
Public Property ImageDataUrl As String
Public Sub OnGet()
End Sub
Public Async Function OnPostUploadAsync() As Task(Of IActionResult)
If UploadedFile Is Nothing OrElse UploadedFile.Length = 0 Then
ErrorMessage = "Please select an image file."
Return Page()
End If
Try
Using ms As New MemoryStream()
Await UploadedFile.CopyToAsync(ms)
Dim imageBytes As Byte() = ms.ToArray()
' Store image as base64 for preview display
Dim base64 As String = Convert.ToBase64String(imageBytes)
ImageDataUrl = $"data:{UploadedFile.ContentType};base64,{base64}"
' Read barcode from uploaded image bytes
Dim results = BarcodeReader.Read(imageBytes)
If results IsNot Nothing AndAlso results.Count() > 0 Then
BarcodeResult = String.Join(vbLf, results.Select(Function(r) r.Value))
Else
ErrorMessage = "No barcode detected in the uploaded image."
End If
End Using
Catch ex As Exception
ErrorMessage = $"Error processing image: {ex.Message}"
End Try
Return Page()
End Function
End Class
Kluczowe kroki w powyższym kodzie:
- Odbierz przesłanie -
IFormFilejest połączony za pomocą[BindProperty]i odbierany w handlerze POST. - Konwertuj na bajty - Plik jest kopiowany do
MemoryStreami konwertowany do tablicy bajtów. Jest to takie samo podejście jak użyte w przykładzie skanera webowego, dostosowane do ASP.NET CoreIFormFilezamiast ciągów base64. - Odczytaj kod kreskowy -
BarcodeReader.Read(imageBytes)przetwarza obraz i zwraca wszystkie wykryte kody kreskowe. - Wyświetl wynik - Wszystkie wykryte wartości kodów kreskowych są łączone i wyświetlane w UI.
Poniższy GIF demonstruje działanie skanera kodów kreskowych, przesyłając obraz kodu kreskowego i wyświetlając zdekodowany wynik:
Czytnik kodów kreskowych skanuje przesłany obraz w aplikacji ASP.NET Core
Przetwarzanie danych obrazów w formacie Base64
Dla aplikacji, które otrzymują dane obrazów jako ciągi base64 (np. z przechwyceń kamer internetowych lub kanwy JavaScript), ta sama metoda BarcodeReader.Read działa z tablicami bajtów zdekodowanymi z base64. Wzorzec ten jest powszechny w jednolitych aplikacjach stron używających AJAX do przesyłania danych obrazów:
public string ReadBarCode(string imageDataBase64)
{
// Decode the base64 image data
var splitObject = imageDataBase64.Split(',');
byte[] imageByteData = Convert.FromBase64String(
(splitObject.Length > 1) ? splitObject[1] : splitObject[0]);
// Read barcode directly from byte array
var results = BarcodeReader.Read(imageByteData);
return $"{DateTime.Now}: Barcode is ({results.First().Value})";
}
public string ReadBarCode(string imageDataBase64)
{
// Decode the base64 image data
var splitObject = imageDataBase64.Split(',');
byte[] imageByteData = Convert.FromBase64String(
(splitObject.Length > 1) ? splitObject[1] : splitObject[0]);
// Read barcode directly from byte array
var results = BarcodeReader.Read(imageByteData);
return $"{DateTime.Now}: Barcode is ({results.First().Value})";
}
Public Function ReadBarCode(imageDataBase64 As String) As String
' Decode the base64 image data
Dim splitObject = imageDataBase64.Split(","c)
Dim imageByteData As Byte() = Convert.FromBase64String(
If(splitObject.Length > 1, splitObject(1), splitObject(0)))
' Read barcode directly from byte array
Dim results = BarcodeReader.Read(imageByteData)
Return $"{DateTime.Now}: Barcode is ({results.First().Value})"
End Function
To podejście obsługuje zarówno surowe base64, jak i formaty URI danych (np. data:image/png;base64,...) przez rozdzielenie na przecinku i pobranie rzeczywistego ładunku base64. Dla kompletnej implementacji Blazor z użyciem tego wzorca, zobacz przewodnik integracji Blazor.
Generowanie kodów kreskowych na serwerze
IronBarcode może również generować kody kreskowe po stronie serwera. Dodanie punktu końcowego generacji do tej samej aplikacji jest prosty za pomocą BarcodeWriter.CreateBarcode:
public IActionResult OnPostGenerate()
{
var barcode = BarcodeWriter.CreateBarcode(
"https://ironsoftware.com", BarcodeEncoding.QRCode);
byte[] barcodeBytes = barcode.ToPngBinaryData();
return File(barcodeBytes, "image/png", "generated-barcode.png");
}
public IActionResult OnPostGenerate()
{
var barcode = BarcodeWriter.CreateBarcode(
"https://ironsoftware.com", BarcodeEncoding.QRCode);
byte[] barcodeBytes = barcode.ToPngBinaryData();
return File(barcodeBytes, "image/png", "generated-barcode.png");
}
Public Function OnPostGenerate() As IActionResult
Dim barcode = BarcodeWriter.CreateBarcode("https://ironsoftware.com", BarcodeEncoding.QRCode)
Dim barcodeBytes As Byte() = barcode.ToPngBinaryData()
Return File(barcodeBytes, "image/png", "generated-barcode.png")
End Function
Wygenerowany kod kreskowy jest zwracany jako plik do pobrania. Poniższy obraz pokazuje wynik kodu QR wygenerowany przez handler OnPostGenerate:
Kod QR wygenerowany po stronie serwera za pomocą BarcodeWriter.CreateBarcode
Dla większej ilości opcji generowania kodów kreskowych, zobacz tutorial generowania obrazów z kodami kreskowymi oraz poradnik stylizowania kodów kreskowych.
Uruchamianie aplikacji
Uruchom projekt z Visual Studio lub wiersza polecenia:
dotnet run
dotnet run
Aplikacja uruchamia się na porcie określonym w launchSettings.json (zazwyczaj https://localhost:5001 lub podobnym). Przejdź do strony głównej, aby zobaczyć interfejs skanera kodów kreskowych.
Wnioski
Ten artykuł pokazał, jak zbudować skaner kodów kreskowych po stronie serwera za pomocą ASP.NET Core Razor Pages i IronBarcode. To samo podejście działa z kontrolerami ASP.NET Core MVC, punktami końcowymi Web API i aplikacjami Blazor Server, dostosowując sposób, w jaki odbierane są dane obrazu. IronBarcode obsługuje przetwarzanie obrazu wewnętrznie, więc integracja wymaga minimalnego kodu, niezależnie od frameworka webowego.
Dla odczytu kodów kreskowych na innych platformach .NET, zobacz tutorial skanera kodów kreskowych .NET MAUI oraz poradniki jak czytać kody kreskowe z obrazów. Znajdź więcej tutoriali o IronBarcode w tutorialu czytania kodów kreskowych.
To get started quickly, download the complete BarcodeWebApp project and run it with dotnet run.
IronBarcode musi być licencjonowany na potrzeby rozwoju i użytkowania komercyjnego. Szczegóły licencjonowania są dostępne tutaj.
Często Zadawane Pytania
Jak zaimplementować skaner kodów kreskowych w ASP.NET Core przy użyciu Razor Pages?
Możesz użyć IronBarcode w swoim projekcie ASP.NET Core Razor Pages, aby zaimplementować skaner kodów kreskowych. Biblioteka pozwala na odczyt różnych formatów kodów kreskowych, takich jak kody QR, Code 128 i Code 39, poprzez przesyłanie obrazów i przetwarzanie ich za pomocą BarcodeReader.Read.
Jakie rodzaje kodów kreskowych można odczytać za pomocą IronBarcode?
IronBarcode obsługuje odczyt wielu formatów kodów kreskowych, w tym kodów QR, Code 128 i Code 39, dzięki czemu jest wszechstronnym narzędziem do różnych zastosowań.
Jak przesłać obrazy do skanowania kodów BarCode w projekcie ASP.NET Core?
W projekcie ASP.NET Core można przesyłać obrazy za pomocą IFormFile. IronBarcode przetwarza te obrazy w celu odczytania zawartych w nich kodów kreskowych.
Czy IronBarcode może generować kody kreskowe po stronie serwera w ASP.NET Core?
Tak, IronBarcode może generować kody kreskowe po stronie serwera w ASP.NET Core przy użyciu metody BarcodeWriter.CreateBarcode, co pozwala na dynamiczne tworzenie i wyświetlanie kodów kreskowych.
Do czego służy metoda BarcodeReader.Read?
Metoda BarcodeReader.Read w bibliotece IronBarcode służy do dekodowania kodów kreskowych z obrazów, co czyni ją kluczowym elementem implementacji skanera kodów kreskowych w ASP.NET Core.
Czy w .NET Core można skanować zarówno kody QR, jak i kody BARCODE przy użyciu tej samej biblioteki?
Tak, IronBarcode umożliwia skanowanie zarówno kodów QR, jak i różnych innych formatów kodów kreskowych w ramach tej samej aplikacji .NET Core, zapewniając zunifikowane rozwiązanie.
Jakie są zalety korzystania z IronBarcode do skanowania kodów kreskowych w języku C#?
IronBarcode oferuje łatwą integrację, obsługę wielu formatów kodów kreskowych oraz solidne możliwości generowania kodów kreskowych po stronie serwera, co czyni go wydajnym wyborem do skanowania kodów kreskowych w aplikacjach C#.

