ASP.NET Core バーコードスキャナー

This article was translated from English: Does it need improvement?
Translated
View the article in English

はじめに

ASP.NET Core は、モダンなウェブアプリケーションを構築するためのクロスプラットフォームフレームワークです。 その Razor ページモデルは、HTTP リクエストを処理するためのページベースのアプローチを提供し、サーバー側のバーコード処理に適しています。 IronBarcode を使用すると、アップロードされた画像は IFormFile オブジェクトとして受け取られ、バイト配列に変換され、テンポラリファイルとしてディスクに書き込まずにバーコードリーダーに直接渡されます。

この記事では、IronBarcode を ASP.NET Core Razor Pages アプリケーションに統合し、アップロードされた画像からバーコードや QR コードをスキャンし、サーバーからバーコードを生成する方法を解説します。

IronBarcode: C# Barcode Library

IronBarcode は、.NET アプリケーションでバーコードの読み取りと書き込みを行うための堅牢な API を提供します。 ライブラリは画像処理を内部で処理するため、開発者は生のバイト、ファイルパス、またはストリームを直接 BarcodeReader.Read メソッドに渡すことができ、別の画像処理ライブラリを必要としません。 QR Code、Code 128、Code 39、PDF417、EAN など、多くのバーコード形式をサポートしています。

ウェブアプリケーション向けの IronBarcode は、完全にメモリ内で画像を処理するため、特に便利です。 アップロードされたファイルをディスクに保存する必要がなく、デプロイが簡単になり、クリーンアップの負担が軽減されます。 同じライブラリで BarcodeWriter.CreateBarcode を使用してバーコードも生成でき、読み取りと書き込みのための単一の依存関係になります。

ASP.NET Core でバーコードスキャナーを構築する手順

ASP.NET Core Razor Pages と IronBarcode を使用して、ウェブベースのバーコードスキャナーを作成するために、次の手順に従ってください。

前提条件

  1. Visual Studio 2022 またはそれ以降(または .NET をサポートする任意の IDE)
  2. .NET 6.0 以上の SDK

プロジェクトを作成する

新しい ASP.NET Core Web App (Razor Pages) プロジェクトを作成します。 これは Visual Studio のプロジェクトウィザードを通じて、またはコマンドラインから実行できます。

dotnet new webapp -n BarcodeWebApp
dotnet new webapp -n BarcodeWebApp
SHELL

IronBarcode ライブラリのインストール

NuGet Package Manager Console を使用して IronBarcode ライブラリをインストールします。 Visual Studio の Tools > NuGet Package Manager > Package Manager Console に移動して、以下を実行します。

Install-Package BarCode

あるいは、コマンドラインから dotnet add package BarCode を使用してインストールします。 最新バージョンは NuGet ウェブサイトで入手できます。

フロントエンド

フロントエンドはファイルアップロードフォームと結果表示エリアで構成されます。 フォームは enctype="multipart/form-data" を使用してバイナリファイルのアップロードを処理します。 バーコードが検出されると、アップロードされた画像の下に成功のアラートで結果が表示されます。

Index.cshtml ファイルの内容を次の内容に置き換えます。

@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>
HTML

レイアウトはデフォルトの ASP.NET Core テンプレートに既に含まれている Bootstrap クラスを使用します。 フォームは Upload ページハンドラーに送信され、条件付きブロックによってアップロードされた画像プレビュー、デコード結果、またはエラーメッセージが表示されます。

サンプル入力バーコード

以下のサンプルバーコードを使用してスキャナーをテストできます。 各画像は異なる形式と値をエンコードしています。

ASP.NET Core Barcode Scanner - Sample QR Code input encoding a URL

QR Code にエンコードされた "https://ironsoftware.com"

ASP.NET Core Barcode Scanner - Sample Code 128 barcode input

Code 128 にエンコードされた "IRONBARCODE-2026"

ASP.NET Core Barcode Scanner - Sample Code 39 barcode input

Code 39 にエンコードされた "HELLO123"

IronBarcode を使用したバーコードスキャン

サーバー側のロジックは、アップロードされたファイルを OnPostUploadAsync メソッドで処理します。 アップロードされた IFormFile がバイト配列に読み込まれ、直接 BarcodeReader.Read に渡されます。 これにより、テンポラリファイルを保存せずに、処理を完全にメモリ内で行います。

Index.cshtml.cs の内容を以下に置き換えます。

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

上記のコードにおける重要な手順:

  1. アップロードを受け取る - IFormFile[BindProperty] を通じてバインドされ、POST ハンドラーで受け取られます。
  2. バイトに変換する - ファイルが MemoryStream にコピーされ、バイト配列に変換されます。 このアプローチは ウェブスキャナーの例で使用されており、base64文字列の代わりに ASP.NET Core の IFormFile に適応されています。
  3. バーコードを読み取る - BarcodeReader.Read(imageBytes) は画像を処理し、検出されたすべてのバーコードを返します。
  4. 結果を表示する - 検出されたすべてのバーコードの値が結合され、UIに表示されます。

以下の GIF は、バーコードリーダーが動作しているシーンを示し、バーコード画像をアップロードして、デコードされた結果を表示します。

ASP.NET Core Barcode Scanner - Demonstration of uploading and reading a barcode

ASP.NET Core アプリケーションで、アップロードされた画像をスキャンするバーコードリーダー

Base64 画像データの処理

ウェブカメラキャプチャや JavaScriptキャンバスなどからの base64 文字列として画像データを受け取るアプリケーションでは、同じ BarcodeReader.Read メソッドが、base64 からデコードされたバイト配列で機能します。このパターンは、AJAX を介して画像データを送信するシングルページアプリケーションで一般的です。

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

このアプローチは、生の base64 フォーマットとデータ URI フォーマット(例: data:image/png;base64,...)の両方を処理し、カンマで分割して実際の base64 ペイロードを取得します。 このパターンを使用した完全な Blazor 実装については、Blazor インテグレーションガイドを参照してください。

サーバーでのバーコードの生成

IronBarcode はサーバー側でもバーコードを生成できます。同じアプリケーションに生成エンドポイントを追加することは、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");
}
$vbLabelText   $csharpLabel

生成されたバーコードはファイルのダウンロードとして返されます。 以下の画像は、OnPostGenerate ハンドラーによって生成された QR コードの出力を示しています。

ASP.NET Core Barcode Scanner - Server-generated QR code output

BarcodeWriter.CreateBarcode でサーバー側で生成された QR コード

バーコード生成のオプションについては、バーコード画像生成チュートリアルバーコードスタイリングガイドを参照してください。

アプリケーションの実行

Visual Studio からまたはコマンドラインからプロジェクトを実行します。

dotnet run
dotnet run
SHELL

アプリケーションは通常、launchSettings.json(通常 @https://localhost:5001 やそれに類するもの)で指定されたポート上で開始します。 ホームページに移動して、バーコードスキャナーのインターフェースを確認します。

結論

この記事では、ASP.NET Core Razor Pages と IronBarcode を使用して、サーバー側でバーコードスキャナーを構築する方法を紹介しました。 同じアプローチは、ASP.NET Core MVC コントローラー、Web API エンドポイント、および Blazor サーバーアプリケーションとも連携し、画像データの受信方法を適応させることができます。 IronBarcode は画像処理を内部で処理するため、ウェブフレームワークに関係なく、統合には最小限のコードが必要です。

他の .NET プラットフォームでバーコードを読み取るためには、.NET MAUI バーコードスキャナーチュートリアルバーコードの読み取り方法ガイドを参照してください。 IronBarcode のチュートリアルをさらに入手するには、バーコード読み取りチュートリアルを参照してください。

To get started quickly, download the complete BarcodeWebApp project and run it with dotnet run.

IronBarcode は、開発および商業使用にライセンスされる必要があります。 ライセンスの詳細はこちらでご覧いただけます。

よくある質問

Razor Pagesを使用してASP.NET Coreでバーコードスキャナーを実装するにはどうすればよいですか?

IronBarcodeをASP.NET Core Razor Pagesプロジェクトで使用して、バーコードスキャナーを実装することができます。このライブラリを使用すると、QRコード、コード128、コード39などのさまざまなバーコード形式を、画像をアップロードしてBarcodeReader.Readで処理することで読み取ることができます。

IronBarcodeを使用して読み取れるバーコードの種類は何ですか?

IronBarcodeは、QRコード、コード128、コード39を含む複数のバーコード形式の読み取りをサポートしており、さまざまなアプリケーションでの使用を可能にします。

ASP.NET Coreプロジェクトでバーコードスキャン用の画像をアップロードするにはどうすればよいですか?

ASP.NET Coreプロジェクトでは、IFormFileを使用して画像をアップロードできます。IronBarcodeはこれらの画像を処理して中に含まれているバーコードを読み取ります。

IronBarcodeはASP.NET Coreでサーバーサイドでバーコードを生成できますか?

はい、IronBarcodeはASP.NET Coreでサーバーサイドでバーコードを生成できます。BarcodeWriter.CreateBarcodeメソッドを使用することで、動的にバーコードを作成して表示できます。

BarcodeReader.Readメソッドは何のために使用されますか?

IronBarcodeのBarcodeReader.Readメソッドは、画像からバーコードをデコードするために使用され、ASP.NET Coreでバーコードスキャナーを実装する際の重要な部分です。

ASP.NET Coreの同じライブラリでQRコードとバーコードの両方をスキャンすることは可能ですか?

はい、IronBarcodeを使用すると、ASP.NET Coreアプリケーション内でQRコードとその他のさまざまなバーコード形式をスキャンすることができ、統一されたソリューションを提供します。

C#でのバーコードスキャンのためにIronBarcodeを使用する利点は何ですか?

IronBarcodeは、簡単な統合、複数のバーコード形式のサポート、強力なサーバーサイドのバーコード生成機能を提供しており、C#アプリケーションでのバーコードスキャンに効率的な選択となります。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 2,121,847 | バージョン: 2026.3 リリース
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package BarCode
サンプルを実行する 文字列が BarCode になるのを見る。