푸터 콘텐츠로 바로가기
동영상

Blazor에서 바코드 스캐너를 사용하는 방법 | IronBarcode

Spire.Barcode에서 IronBarcode로의 마이그레이션

Spire.Barcode의 BarcodeScanner.Scan()는 모든 호출에 BarCodeType 인수가 필요합니다. 코드베이스가 다양한 문서 소스, 새로운 공급업체 라벨, 새로운 바코드 형식을 처리해야 할 정도로 커짐에 따라, 이러한 설계 방식은 시간이 지남에 따라 유지 관리 비용을 증가시키는 타입 추측 루프를 생성합니다. 이 가이드는 Spire.Barcode에서IronBarcode로의 전환 과정을 완벽하게 다룹니다. 팀이 이러한 전환을 하는 이유, 전환을 실행하는 구체적인 단계, 그리고 모든 일반적인 작업에 대한 전환 전후의 코드 패턴을 설명합니다.

Spire.Barcode에서 마이그레이션해야 하는 이유

형식 명세 오버헤드: Spire.Barcode에서 BarcodeScanner.Scan()를 호출할 때마다 호출 코드가 제공해야 하는 BarCodeType 열거형 값이 필요합니다. 출처를 알 수 없거나 형식이 혼합된 바코드를 처리하는 애플리케이션은 가능한 유형의 후보 목록을 유지하고 일치하는 유형을 찾을 때까지 해당 목록을 순회해야 합니다. 워크플로에 추가되는 각 형식에 대해 후보 배열을 업데이트하고, 감지 로직을 재테스트하고, 반복 순서로 인해 한 형식이 다른 형식을 가리지 않는지 확인해야 합니다. 이러한 추가 비용은 형식의 다양성에 비례하여 증가합니다.

무료 평가판 제한 사항: FreeSpire.Barcode는 상용 제품에 비해 판독 성능을 의도적으로 저하시키고 사용 가능한 심볼 세트를 제한합니다. FreeSpire.Barcode 평가 중에 수행된 벤치마크 및 포맷 적용 범위 테스트는 상용 Spire.Barcode의 동작을 나타내지 않습니다. 무료 평가판을 사용해 본 후 구매를 결정한 팀은 구매 후 실제 운영 환경에서 제품이 다르게 작동한다는 사실을 알게 될 수 있습니다. 특히 처리량 및 지원되는 심볼 종류와 관련하여 이러한 차이가 나타날 수 있습니다.

PDF 파일에 두 개의 라이브러리가 필요합니다: Spire.Barcode는 PDF 파일에서 바코드를 직접 읽을 수 없습니다. PDF 기반 워크플로우에서는 자체 라이선스를 가진 개별 Spire.PDF 패키지가 필요하며 개발자가 작성한 코드를 사용하여 페이지를 반복하고 각 페이지에서 이미지를 추출한 후 해당 이미지를 바코드 스캐너에 전달해야 합니다. 개념적으로 바코드 판독에 속하는 작업이 두 개의 제품, 두 개의 라이선스 계약, 그리고 상당한 규모의 인프라 코드로 분산되어 있습니다.

반환 형식 복잡성: BarcodeScanner.Scan()string[]를 반환하며, 이 값은 디코드된 값만 포함합니다. 감지된 바코드 형식은 반환 값에 포함되지 않습니다. 예를 들어 QR 코드 값은 한 프로세서로, Code128 값은 다른 프로세서로 전송하는 등 형식별로 결과를 라우팅해야 하는 애플리케이션은 결과를 생성한 반복 단계에서 파생된 별도의 유형 변수를 유지해야 하므로 스캔 자체 외에 추가적인 상태 관리가 필요합니다.

근본적인 문제

형식 추측 루프는 필수 BarCodeType 제약의 가장 눈에 띄는 증상입니다. 여러 소스의 문서를 처리하는 Spire.Barcode 코드베이스에서 다음과 같은 패턴이 반복적으로 나타납니다.

// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };

string foundValue = null;
foreach (var type in candidates)
{
    string[] found = scanner.Scan("barcode.png", type);
    if (found.Length > 0)
    {
        foundValue = found[0];
        break;
    }
}
// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };

string foundValue = null;
foreach (var type in candidates)
{
    string[] found = scanner.Scan("barcode.png", type);
    if (found.Length > 0)
    {
        foundValue = found[0];
        break;
    }
}
Imports Spire.Barcode

Dim scanner As New BarcodeScanner()
Dim candidates = {BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417}

Dim foundValue As String = Nothing
For Each type In candidates
    Dim found As String() = scanner.Scan("barcode.png", type)
    If found.Length > 0 Then
        foundValue = found(0)
        Exit For
    End If
Next
$vbLabelText   $csharpLabel

IronBarcode 루프를 완전히 제거합니다. 형식 감지 기능이 라이브러리에 내장되어 있습니다.

// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");

foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");

foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarcode

' IronBarcode: single call, all formats, type included in result
Dim results = BarcodeReader.Read("barcode.png")

For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode와 Spire.Barcode의 기능 비교

기능 Spire.Barcode IronBarcode
자동 형식 감지 아니요
BarCodeType 매개변수는 필수입니다. 아니요
결과의 메타데이터 형식 아니요
네이티브 PDF 읽기 아니요 (Spire.PDF 파일이 필요합니다)
PDF용 추가 라이브러리 Spire.PDF (별도 라이선스) None
무료 요금제 읽기 성능 의도적으로 저하됨 전속력
무료 티어 워터마크 크기가 커서 바코드를 덮습니다. 작고, 가장자리만
무료 티어 심볼 약 20가지 종류 50가지 이상의 종류
무료 등급 등록 아니요
생성 API 모델 설정 객체 + 생성기 유동적인 체인을 갖춘 정적 공장
맞춤 로고가 포함된 QR 코드 상업용 등급 전용 모든 등급
읽기 결과의 반환 유형 string[] BarcodeResults (유형 메타데이터 포함)
기호 개수 39세 이상 (상업용) 50세 이상
라이선스 모델 좌석별 영구 구독 갱신 옵션이 있는 영구 계약

빠른 시작

1단계: NuGet 패키지 교체

현재 사용 중인 Spire 패키지를 제거하십시오.

# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode

# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode

# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
SHELL

바코드 추출 외의 문서 작업에 Spire.PDF가 사용되는 경우, 보존하고 바코드 관련 코드 경로만 제거하십시오.

IronBarcode 설치하세요:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

단계 2: 네임스페이스 업데이트

모든 Spire 네임스페이스 가져오기를IronBarcode네임스페이스로 대체하십시오:

// Remove:
using Spire.Barcode;
using Spire.Pdf;

// Add:
using IronBarCode;
// Remove:
using Spire.Barcode;
using Spire.Pdf;

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

단계 3: 라이선스 초기화

Spire 라이선스 초기화를 애플리케이션 시작 시 단일IronBarcode속성 할당으로 대체하십시오. 키 형식 및 배포 옵션에 대한 자세한 내용은IronBarcode 라이선스 페이지를 참조하십시오.

// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");

// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");

// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");

// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");

// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key")

' Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key")

' Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Docker 및 CI 환경의 경우, 라이선스 키는 환경 변수를 통해 제공할 수 있습니다.

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

코드 마이그레이션 예제

알려진 형식의 바코드 읽기

Spire.Barcode에서 단일 형식 읽기는 유형을 명시적으로 전달하고 string[]를 수신합니다.

Spire.Barcode 접근 방식:

using Spire.Barcode;

BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);

if (results.Length > 0)
{
    ProcessShipment(results[0]);
}
using Spire.Barcode;

BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);

if (results.Length > 0)
{
    ProcessShipment(results[0]);
}
Imports Spire.Barcode

Dim scanner As New BarcodeScanner()
Dim results As String() = scanner.Scan("shipping-label.png", BarCodeType.Code128)

If results.Length > 0 Then
    ProcessShipment(results(0))
End If
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

var results = BarcodeReader.Read("shipping-label.png");

if (results.Any())
{
    ProcessShipment(results.First().Value);
}
using IronBarCode;

var results = BarcodeReader.Read("shipping-label.png");

if (results.Any())
{
    ProcessShipment(results.First().Value);
}
Imports IronBarCode

Dim results = BarcodeReader.Read("shipping-label.png")

If results.Any() Then
    ProcessShipment(results.First().Value)
End If
$vbLabelText   $csharpLabel

BarCodeType 매개변수가 제거됩니다. 하위 로직에서 감지된 형식을 확인해야 하는 경우 results.First().Format가 별도의 상태 변수를 요구하지 않고 제공합니다.

혼합 형식 유형 루프 축소

Spire.Barcode 코드베이스가 여러 형식을 포함할 수 있는 문서를 처리할 때, 새로운 형식이 워크플로에 추가됨에 따라 형식 추측 루프가 시간이 지남에 따라 누적됩니다.

Spire.Barcode 접근 방식:

using Spire.Barcode;

BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
    BarCodeType.Code128,
    BarCodeType.QRCode,
    BarCodeType.DataMatrix,
    BarCodeType.EAN13,
    BarCodeType.PDF417
};

List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
    string[] found = scanner.Scan("document-scan.png", type);
    allValues.AddRange(found);
}
using Spire.Barcode;

BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
    BarCodeType.Code128,
    BarCodeType.QRCode,
    BarCodeType.DataMatrix,
    BarCodeType.EAN13,
    BarCodeType.PDF417
};

List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
    string[] found = scanner.Scan("document-scan.png", type);
    allValues.AddRange(found);
}
Imports Spire.Barcode

Dim scanner As New BarcodeScanner()
Dim candidates As BarCodeType() = {
    BarCodeType.Code128,
    BarCodeType.QRCode,
    BarCodeType.DataMatrix,
    BarCodeType.EAN13,
    BarCodeType.PDF417
}

Dim allValues As New List(Of String)()
For Each type As BarCodeType In candidates
    Dim found As String() = scanner.Scan("document-scan.png", type)
    allValues.AddRange(found)
Next
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
using IronBarCode;

// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
Imports IronBarCode

' The entire loop is replaced by a single call
Dim results = BarcodeReader.Read("document-scan.png")
Dim allValues As List(Of String) = results.Select(Function(r) r.Value).ToList()
$vbLabelText   $csharpLabel

IronBarcode의 이미지 읽기 기능은 50개 이상의 모든 심볼을 한 번에 처리합니다. 대량 배치 처리에 대해서 읽기 속도를 조정해야 할 때, BarcodeReaderOptions가 형식별 분기를 추가하지 않고 해당 제어를 제공합니다:

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("document-scan.png", options)
$vbLabelText   $csharpLabel

적절한 ReadingSpeed 값을 선택하는 방법에 대한 안내는 읽기 속도 옵션 문서를 참조하십시오.

바코드 생성

Spire.Barcode 생성을 위해서는 BarcodeSettings 개체를 인스턴스화하고, 각각의 속성을 개별적으로 할당하고, 설정을 BarCodeGenerator에 전달한 뒤에 파일 작성 전에 GenerateImage()를 호출해야 합니다.

Spire.Barcode 접근 방식:

using Spire.Barcode;

BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;

BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
using Spire.Barcode;

BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;

BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
Imports Spire.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging

Dim settings As New BarcodeSettings()
settings.Type = BarCodeType.Code128
settings.Data = "SHIP-9842-XZ"
settings.ShowText = True
settings.TextMargin = 5
settings.BarHeight = 60
settings.Unit = GraphicsUnit.Pixel

Dim generator As New BarCodeGenerator(settings)
Dim barcodeImage As Image = generator.GenerateImage()
barcodeImage.Save("shipping-label.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("shipping-label.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("shipping-label.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

변경 가능한 BarcodeSettings 개체와 개별적인 BarCodeGenerator 인스턴스는 플루언트 체인이 포함된 단일 정적 팩토리 호출로 대체됩니다. 각 CreateBarcode() 호출이 독립적이기 때문에 설정이 동시에 호출되는 동안 실수로 공유될 위험이 없습니다.

PDF 문서에서 바코드 읽기

Spire.Barcode는 PDF 파일을 직접 읽을 수 없습니다. Spire 기반 접근 방식에서는 파일을 열고, 페이지를 반복하고, 각 페이지에서 래스터 이미지를 추출한 다음, 해당 이미지를 바코드 스캐너로 한 번에 전달하기 위해 별도의 Spire.PDF 패키지가 필요합니다.

Spire.Barcode 접근 방식:

using Spire.Pdf;
using Spire.Barcode;

var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");

var scanner = new BarcodeScanner();
var extractedValues = new List<string>();

foreach (PdfPageBase page in pdf.Pages)
{
    Image[] images = page.ExtractImages();
    foreach (Image image in images)
    {
        string[] found = scanner.Scan(image, BarCodeType.QRCode);
        extractedValues.AddRange(found);
    }
}
using Spire.Pdf;
using Spire.Barcode;

var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");

var scanner = new BarcodeScanner();
var extractedValues = new List<string>();

foreach (PdfPageBase page in pdf.Pages)
{
    Image[] images = page.ExtractImages();
    foreach (Image image in images)
    {
        string[] found = scanner.Scan(image, BarCodeType.QRCode);
        extractedValues.AddRange(found);
    }
}
Imports Spire.Pdf
Imports Spire.Barcode

Dim pdf As New PdfDocument()
pdf.LoadFromFile("invoices.pdf")

Dim scanner As New BarcodeScanner()
Dim extractedValues As New List(Of String)()

For Each page As PdfPageBase In pdf.Pages
    Dim images() As Image = page.ExtractImages()
    For Each image As Image In images
        Dim found() As String = scanner.Scan(image, BarCodeType.QRCode)
        extractedValues.AddRange(found)
    Next
Next
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

var results = BarcodeReader.Read("invoices.pdf");

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
using IronBarCode;

var results = BarcodeReader.Read("invoices.pdf");

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
Imports IronBarCode

Dim results = BarcodeReader.Read("invoices.pdf")

For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode는 PDF 문서를 직접 읽습니다 Spire.PDF 또는 수작업의 페이지 관리가 필요하지 않습니다. 각 바코드가 추출된 페이지 번호는 결과 객체에서 확인할 수 있습니다. PDF 읽기 코드가 대체되면, 프로젝트에서 Spire.PDF 패키지 참조 및 모든 using Spire.Pdf; Import를 제거할 수 있습니다.

Spire.Barcode API와IronBarcode매핑 참조

Spire.Barcode IronBarcode 노트
new BarcodeScanner() BarcodeReader.Read() (정적) 스캐너 인스턴스가 필요하지 않습니다.
scanner.Scan(path, BarCodeType.X) BarcodeReader.Read(path) 타입 매개변수가 제거되었습니다.
BarCodeType.Code128 (필수) 자동 감지됨 동등한 자격이 필요하지 않습니다.
BarCodeType.QRCode (필수) 자동 감지됨 동등한 자격이 필요하지 않습니다.
string[] results from Scan() BarcodeResults 컬렉션 .Value를 통해 값에 접근
results[0] (문자열) results[0].Value
결과 형식을 알 수 없습니다. result.Format 결과 객체에 포함된 유형
new BarcodeSettings() CreateBarcode()의 매개변수 설정 객체가 필요하지 않습니다.
settings.Type = BarCodeType.X BarcodeEncoding.X를 두 번째 매개변수로 사용
settings.Data = "value" CreateBarcode()의 첫 번째 매개변수
new BarCodeGenerator(settings) 필요 없음 정적 공장이 그것을 대체합니다.
generator.GenerateImage() .SaveAsPng() / .SaveAsJpeg() 형식별 출력 방법
BarcodeSettings.ApplyKey("key") IronBarCode.License.LicenseKey = "key" 시작 시 한 번만 설정됩니다.
Spire.License.LicenseProvider.SetLicenseKey("key") IronBarCode.License.LicenseKey = "key" 동일한 단일 라인 교체
Spire.PDF (PDF 읽기 용) 필요 없음 PDF를 기본적으로 지원합니다.

일반적인 마이그레이션 문제와 해결책

문제 1: BarCodeType 매개변수 제거

Spire.Barcode: scanner.Scan(path, BarCodeType.Code128) — 메서드 서명에 의해 유형 인수가 필요합니다. 해당 부분을 제거하면 컴파일 오류가 발생합니다.

해결책: 전체 호출을 BarcodeReader.Read(path)로 대체하십시오. BarCodeType.를 코드베이스에서 검색하여 모든 발생 위치를 찾으십시오. 형식 추측 루프 (BarCodeType[] 후보 배열을 반복하는 foreach 블록)는 전체를 삭제할 수 있습니다; 단일 BarcodeReader.Read() 호출이 루프를 대체합니다.

문제 2: string[] 반환 유형

Spire.Barcode: Scan()string[]를 반환합니다. 이것을 string[] 변수에 할당하거나 string[]를 기대하는 메서드에 전달하는 하위 코드는 마이그레이션 후 컴파일에 실패합니다.

해결책: BarcodeResults과 함께 작동하도록 호출 위치를 업데이트하십시오. 일반 문자열 배열을 얻으려면 .Select(r => r.Value).ToArray()를 사용하십시오. 첫 번째 결과에 접근하려면 .First()?.Value를 사용하십시오. 하위 로직에서 감지된 형식이 필요하다면, 결과 객체의 .Format를 통해 제공됩니다 - 별도의 상태 변수가 필요하지 않습니다.

// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
    .Select(r => r.Value)
    .ToArray();

// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
    .Select(r => r.Value)
    .ToArray();

// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
Imports System.Linq

' If a plain string array is needed:
Dim texts As String() = BarcodeReader.Read("barcode.png") _
    .Select(Function(r) r.Value) _
    .ToArray()

' If only the first value is needed:
Dim first As String = BarcodeReader.Read("barcode.png").FirstOrDefault()?.Value
$vbLabelText   $csharpLabel

이슈 3: Spire.PDF 패키지 정리

Spire.Barcode: PDF 읽기 워크플로우는 페이지 액세스 및 이미지 추출에 Spire.PDF에 의존합니다. 프로젝트는 패키지를 참조하고 using Spire.Pdf; Import와 PdfDocument / PdfPageBase 사용을 여러 파일에 걸쳐 포함하고 있습니다.

해결책: 모든 PDF 바코드 추출 코드를 BarcodeReader.Read("file.pdf")로 대체한 후 패키지를 제거하기 전에 남아있는 Spire.Pdf 참조가 없는지 확인하기 위해 grep 감사(audit)를 실행하십시오.

grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
SHELL

모든 참조가 삭제된 후에만 패키지를 제거하십시오.

dotnet remove package Spire.PDF
dotnet remove package Spire.PDF
SHELL

이슈 4: 네임스페이스 변경

Spire.Barcode: Spire.Barcode 네임스페이스는 BarcodeScanner, BarcodeSettings, BarCodeGenerator, BarCodeType를 포함합니다. IronBarCode 네임스페이스는 BarcodeReader, BarcodeWriter, BarcodeEncoding, BarcodeReaderOptions를 포함합니다.

해결책: using Spire.Barcode;를 전역적으로 using IronBarCode;로 대체하십시오. 생성에서 사용된 BarCodeType 열거형이 BarcodeEncoding로 대체됩니다. 읽기에 사용된 BarCodeType 열거형은 IronBarcode에 해당하는 것이 없습니다 - 형식 감지가 자동으로 이루어지므로 단순히 제거됩니다.

Spire.Barcode 마이그레이션 체크리스트

이동 전 작업

변경 작업을 수행하기 전에 코드베이스를 검토하여 Spire.Barcode 사용 부분을 모두 확인하십시오.

grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
SHELL
  • BarCodeType 후보 배열(제거할 형식 추측 루프)을 포함하는 모든 파일을 문서화하십시오.
  • string[]의 결과를 수신하는 Scan() 변수를 식별하고 유형 업데이트가 필요한지 여부를 확인하십시오.
  • Spire.PDF가 바코드 추출 이외의 작업에 사용되는지 확인하십시오.

코드 업데이트 작업

  1. FreeSpire.Barcode 또는 Spire.Barcode NuGet 패키지를 제거합니다.
  2. 바코드 추출이 유일한 사용이었다면 Spire.PDF NuGet 패키지를 제거하십시오.
  3. IronBarcode NuGet 패키지를 설치하십시오.
  4. 모든 using Spire.Barcode;using IronBarCode;로 대체하십시오.
  5. 더 이상 필요하지 않은 모든 using Spire.Pdf; Import를 제거하십시오.
  6. 라이선스 초기화를 다음으로 대체하십시오: ApplyKey() 또는 SetLicenseKey()IronBarCode.License.LicenseKey = "key"
  7. 모든 new BarcodeScanner() 인스턴스화를 제거합니다.
  8. 모든 scanner.Scan(path, BarCodeType.X) 호출을 BarcodeReader.Read(path)로 대체합니다.
  9. 타입 추측을 사용하는 foreach 루프를 삭제하세요. 각각을 단일 BarcodeReader.Read() 호출로 대체하십시오.
  10. PDF 페이지 반복 및 이미지 추출 블록을 제거합니다. BarcodeReader.Read("file.pdf")로 대체하십시오.
  11. string[] 결과 할당을 .Value 또는 .Select(r => r.Value).ToArray()을 사용하도록 업데이트하십시오.
  12. new BarcodeSettings() 블록을 BarcodeWriter.CreateBarcode(data, encoding) 체인으로 대체하십시오.
  13. new BarCodeGenerator(settings) 인스턴스화를 제거하십시오.
  14. .GenerateImage() + image.Save().SaveAsPng() 또는 .SaveAsJpeg()로 대체하십시오.
  15. 생성에서 BarCodeType.X 열거형 값을 BarcodeEncoding.X로 대체하십시오.

마이그레이션 후 테스트

  • 후보기 루프를 통해 이전에 스캔된 모든 형식을 BarcodeReader.Read()로 정확하게 감지하는지 확인하십시오.
  • 배치 처리량을 측정하고 생산 요구 사항을 충족하는지 확인합니다.
  • PDF 바코드 추출 결과가 올바른 값과 페이지 번호를 생성하는지 확인합니다.
  • 생성된 바코드 출력 품질과 스캔 가능 여부를 물리적 또는 소프트웨어 스캐너로 확인합니다.
  • 모든 배포 환경(로컬, 스테이징, 프로덕션, CI/CD)에서 라이선스 키가 올바르게 로드되었는지 확인하십시오.
  • 마이그레이션 전 작업에서 grep 감사 명령을 실행하여 Spire 참조가 남아 있지 않은지 확인합니다.

IronBarcode로 마이그레이션할 때의 주요 이점

포맷 유지 관리 오버헤드 제거: 마이그레이션 후에는 유지 관리해야 할 후보 유형 목록이 없으며, 새로운 바코드 포맷이 워크플로에 추가될 때 업데이트해야 할 유형 추측 루프도 없습니다. BarcodeReader.Read()는 전체 심볼 세트를 자동으로 처리하며, 감지된 형식이 하위 라우팅을 위한 각 결과 객체에 포함됩니다.

구매 전 정확한 평가:IronBarcode평가판은 정식 라이선스 제품과 동일한 바이너리 파일을 사용하여 전체 읽기 속도와 모든 심볼 세트를 지원합니다. 시험 평가 중에 실시된 성능 벤치마크 및 포맷 커버리지 테스트 결과는 실제 제품에 그대로 적용됩니다. 팀은 평가된 동작이 실제로 배포되는 동작이라는 확신을 가지고 구매 결정을 내릴 수 있습니다.

단일 패키지 PDF 지원: 이미지에 사용된 BarcodeReader.Read() 호출로 PDF 파일의 바코드 추출을 처리합니다. 별도의 라이브러리, 추가 라이선스, 수동 페이지 반복 코드가 필요하지 않습니다. 이전에는 Spire.BarcodeSpire.PDF을 모두 유지하는 팀이 전체 바코드 워크플로를 위한 단일 의존성으로 줄어듭니다.

형식 메타데이터가 있는 결과 객체들: BarcodeResults 컬렉션의 각 항목은 디코딩된 값, 감지된 심볼 기호, PDF 입력의 소스 페이지 번호 및 소스 이미지 내의 경계 영역을 포함합니다. 형식별로 라우팅, 필터링 또는 로깅이 필요한 애플리케이션은 추가적인 상태 관리 없이 결과에서 해당 정보를 사용할 수 있습니다.

단순화된 생성 API: BarcodeWriter.CreateBarcode()의 정적 팩토리 패턴은 변경 가능한 BarcodeSettings 객체와 개별 BarCodeGenerator 인스턴스를 제거합니다. 각 세대 호출은 독립적이므로 동시 작업 간의 구성 중복 위험을 줄입니다.

향후 호환성:IronBarCode.NET 런타임 릴리스에 맞춰 정기적으로 업데이트됩니다. 2026년까지 .NET 10 도입이 증가함에 따라 호환성 업데이트를 통해 마이그레이션된 코드베이스가 새로운 .NET 버전이 나올 때마다 라이브러리를 변경할 필요 없이 계속 빌드 및 실행될 수 있도록 보장합니다.

참고해 주세요Spire는 각 소유자의 등록 상표입니다. 이 사이트는 e-iceblue와 관련이 없으며 승인 또는 후원받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

자주 묻는 질문

Spire.Barcode에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?

일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.

Spire.Barcode API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?

인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.

Spire.Barcode에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?

대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.

마이그레이션하는 동안 Spire.Barcode와 IronBarcode를 모두 설치해야 하나요?

아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.

IronBarcode의 NuGet 패키지 이름은 무엇인가요?

패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.

IronBarcode는 Spire.Barcode와 비교하여 Docker 배포를 어떻게 간소화하나요?

IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.

Spire.Barcode에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?

예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.

IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?

예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.

IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?

IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.

Spire.Barcode에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?

일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.

CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?

IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.

IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?

예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해