푸터 콘텐츠로 바로가기
다른 구성 요소와 비교

.NET 개발에 어떤 C# 바코드 라이브러리를 사용해야 할까요?

Aspose.BarCode를 사용한 모든 개발자는 이 문장을 일부 버전으로 작성했습니다: new BarCodeReader(path, DecodeType.Code128). 이미지의 형식을 알고 있으면 제대로 작동합니다. 외부 시스템에서 문서가 온 경우, 라벨 형식을 변경한 공급자 또는 사용자가 업로드한 경우, 해독 유형 목록을 추측하거나 DecodeType.AllSupportedTypes을(를) 사용하여 최근 Aspose의 가이드에 따르면 일반적으로 더 느립니다. 형식 지정 요구 사항은 심각한 문제는 아니지만, 코드베이스의 모든 읽기 작업에서 매일같이 발생하는 불편함입니다.

PDF에 담긴 이야기는 예산에 관한 이야기입니다. PDF 문서에서 바코드를 처리하는 경우 Aspose.BarCode만으로는 처리할 수 없습니다. 먼저 페이지를 이미지로 렌더링하려면 Aspose.PDF for .NET가 필요합니다. Aspose.PDF는 이미 Aspose.BarCode에 지불한 것 이외에 별도의 구독 제품입니다. 대부분의 개발자가 하나의 작업으로 생각하는 워크플로에 대한 두 가지 구독 서비스입니다.

IronBarcode 바코드 형식을 자동으로 감지하고 PDF 파일을 기본적으로 읽는 기능을 하나의 패키지에 포함하며, 749달러부터 시작하는 영구 라이선스를 제공합니다. 이 비교 분석에서는 두 라이브러리를 자세히 살펴보고 현명한 선택을 할 수 있도록 도와드립니다.

Aspose.BarCode 이해하기

Aspose는 수년간 .NET, Java 및 기타 플랫폼용 문서 처리 라이브러리를 개발해 왔습니다. Aspose.BarCode는 Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides 등 약 12개 이상의 다른 제품군과 함께 Aspose 제품군에 속하는 여러 제품 중 하나입니다. Aspose.Total(모든 Aspose 제품이 포함된 번들)을 이미 구독 중인 팀의 경우 Aspose.BarCode는 추가 비용 없이 이용할 수 있습니다. 하지만 바코드 라이브러리만 필요한 팀의 경우 구독 모델은 정당화하기 어려울 수 있습니다.

Aspose.BarCode는 80개 이상의 바코드 심볼로지를 지원하며, 상업 for .NET 바코드 라이브러리 중 가장 완벽한 형식 목록 중 하나입니다. 그 폭넓은 자료 범위가 바로 도서관의 가장 큰 장점입니다. 그에 따라 API 표면적도 커지고, 기능이 많아질수록 API 설명의 상세함도 증가합니다. 기본 Code 128 바코드를 생성하려면 BarcodeGenerator을(를) 인스턴스화하고, XDimension, BarHeight 및 기타 매개 변수를 설정한 다음 명시적 형식 인수를 사용하여 Save을(를) 호출합니다. 읽기를 위해서는 탐색할 해독 유형을 지정한 다음 ReadBarCodes()이(가) 반환하는 결과를 반복해야 합니다. 두 작업 모두 올바르게 작동하지만, 필요 이상으로 장황합니다.

Aspose.BarCode의 주요 아키텍처 특징:

  • 형식 우선 읽기 모델: 모든 읽기 작업은 명시적으로 DecodeType을(를) 지정해야 합니다. 대체 DecodeType.AllSupportedTypes은(는) 일반적으로 초점이 맞춰진 목록보다 느리며, 디코더가 모든 알려진 기호를 순차적으로 실행하기 때문입니다.
  • 인스턴스 기반 API: BarCodeReaderBarcodeGenerator은(는) IDisposable을(를) 구현하는 인스턴스화된 객체입니다. 이들은 네이티브 리소스를 해제하기 위해 using 블록으로 래핑되어야 합니다.
  • PDF를 직접 지원하지 않습니다: Aspose.BarCode는 PDF 문서를 직접 열거나 렌더링할 수 없습니다. PDF에서 바코드를 읽으려면 별도의 구독 제품인 Aspose.PDF가 필요합니다.
  • 심층 매개변수 계층 구조: 맞춤 설정은 generator.Parameters.Barcode.* 속성 체인을 통해 처리되며, 이는 암기해야 하는 다단계 개체 계층 구조입니다.
  • 구독 라이선싱: Aspose가 게시한 가격에 따라, 개발자당 및 사이트 별 수준은 연간 구독입니다; 독립형 영구 옵션은 나열되지 않았습니다.
  • 파일 기반 라이선스 활성화: 프로덕션 배포에는 알려진 경로에서 접근할 수 있는 .lic 파일이 필요하며, 이는 Docker및 Kubernetes 환경에 배포 단계를 추가합니다.

형식 우선 읽기 모델

Aspose.BarCode의 읽기 API는 호출자가 바코드 형식을 알고 있다는 가정하에 설계되었습니다.

using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

형식을 알고 있다면 이 패턴은 괜찮습니다. 문제는 "형식을 알고 있을 때"라는 점입니다. 공급업체 송장을 처리하는 구매 시스템은 모든 공급업체가 동일한 바코드 유형을 사용한다고 보장할 수 없습니다. 사용자 업로드를 허용하는 문서 관리 시스템은 스캐너가 사용한 파일 형식을 예측할 수 없습니다. 그러한 경우, DecodeType.AllSupportedTypes이(가) 대체 역할을 하며, 이는 특정 해독 유형 목록보다 일반적으로 느립니다.

디코더도 폐기해야 합니다.

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

using을(를) 사용하지 않으면 리소스를 유출하게 됩니다. BarcodeGenerator은(는) 또한 IDisposable을(를) 구현하지만, 이를 처분하지 않을 때의 결과는 덜 심각합니다. 두 경우 모두 정적 팩토리 API가 자동으로 처리하는 객체 수명 주기를 직접 관리하고 있는 것입니다.

IronBarcode이해하기

IronBarcode 읽기 및 쓰기 모두에 정적 팩토리 메서드를 사용합니다. 생성, 구성 또는 폐기할 인스턴스가 없습니다. 읽기 API는 기본적으로 형식에 구애받지 않으며, 소스 파일이 PNG, JPEG, TIFF 또는 PDF인지 여부에 관계없이 동일한 호출이 작동합니다.

IronBarcode은 .NET 개발자 도구에 중점을 둔 Iron Software에 의해 개발되고 유지됩니다. 이 라이브러리는 바코드 판독에 바코드 형식에 대한 사전 지식이 필요하지 않아야 한다는 원칙을 기반으로 설계되었습니다. 라이브러리의 감지 엔진이 이미지 내용에서 형식을 자동으로 판단합니다. 생성 과정에서 다른 라이브러리에서 흔히 볼 수 있는 다단계 매개변수 계층 구조 대신 유창한 메서드 체인이 사용됩니다.

IronBarcode 의 주요 특징:

  • 자동 형식 감지: BarcodeReader.Read()은(는) 호출자가 DecodeType에 해당하는 것을 지정할 필요 없이 이미지 내용을 통해 바코드 기호를 식별합니다.
  • 정적 상태 비저장 API: 모든 읽기 및 쓰기 작업은 정적 메서드입니다. 관리해야 할 일회용 인스턴스가 없으며, API는 동시 사용을 위해 기본적으로 스레드 안전합니다.
  • 네이티브 PDF 지원: BarcodeReader.Read("doc.pdf")은(는) 추가 패키지나 렌더링 단계 없이 PDF 파일에서 직접 읽습니다. 결과에는 result.PageNumber이(가) 포함됩니다.
  • 유창한 생성 API: BarcodeWriter.CreateBarcode()은(는) 체이너블 객체를 반환합니다. 사용자 정의는 속성 계층 구조 대신 메서드 체이닝을 사용합니다.
  • 영구 라이선스 모델: 모든 등급은 일회성 구매로 연간 갱신이 필요 없습니다.
  • 문자열 기반 라이선스 활성화: 라이선스 키는 환경 변수 및 CI/CD 비밀 관리자와 호환되는 IronBarCode.License.LicenseKey를 통해 설정됩니다.

기능 비교

기능 Aspose.BarCode IronBarcode
형식 감지 수동 — DecodeType을(를) 지정하거나 느린 AllSupportedTypes을(를) 사용해야 합니다. 지원되는 모든 형식에서 자동으로 처리됩니다.
기호 개수 80+ 50세 이상
PDF 지원 기본 지원되지 않으며, Aspose.PDF 라이선스가 별도로 필요합니다. 네이티브 — 패키지에 내장된 BarcodeReader.Read("doc.pdf")
가격 모델 구독 전용 — 연간 수준은 $999부터 시작 영구 보증은 749달러(일회성)부터 시작합니다.
영구 라이선스 사용 불가 네, 모든 등급이요.
API 스타일 인스턴스 기반의 상세 구성 정적 팩토리 메서드, 플루언트 API
일회용품 요구 사항 예 — BarCodeReaderBarcodeGenerator 아니요 — 상태를 저장하지 않는 정적 메서드
스레드 안전성 스레드당 별도의 인스턴스가 필요합니다. 정적 API —IronBarcode문서를 통해 스레드 관련 지침을 확인하세요

상세 기능 비교

기능 Aspose.BarCode IronBarcode
세대
API 스타일 new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
맞춤형 모델 generator.Parameters.Barcode.* 속성 계층 구조 유창한 메서드 체인 (.ResizeTo(), .ChangeBarCodeColor())
로고가 포함된 QR 코드 생성 후 수동 GDI+ 오버레이 내장된 .AddBrandLogo("logo.png")
바이트 단위로 출력 generator.GenerateBarCodeImage() .ToPngBinaryData()
컬러 바코드 generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
독서
형식 사양 필수 (DecodeType) 필요 없음 — 자동
알 수 없는 형식 대체 DecodeType.AllSupportedTypes (느림) 동일한 호출이므로 대체 모드가 필요하지 않습니다.
성능 튜닝 QualitySettings 매개변수 설정 ReadingSpeed 열거형 — 세 수준
일회용 리더기 예 — using var reader = new BarCodeReader(...) 아니요 — 정적 호출이므로 해제할 객체가 없습니다.
결과 접근 reader.ReadBarCodes() 반복 BarcodeReader.Read()의 반환 값
바코드 값 속성 result.CodeText result.Value
형식 이름 속성 result.CodeTypeName result.Format.ToString()
PDF 지원
네이티브 PDF 읽기 아니요
PDF에 필요합니다 Aspose.PDF (별도 구독) 추가 패키지 없음
검색 결과의 페이지 번호 해당 없음 result.PageNumber
라이선스
라이선스 모델 구독 전용이며, 매년 갱신됩니다. 영구적, 일회성 구매
단일 개발자 연간 999달러 $749 (한 번)
개발자 10명 연간 4,995달러(사이트 라이선스) 2,999달러 일회성 (Professional)
무제한 배포(10명의 개발자) $13,986/년(사이트 OEM) 5,999달러 일회성 요금 (무제한)
PDF 지원 포함 아니요, Aspose.PDF 구독은 별도입니다.
플랫폼 및 배포
라이선스 활성화 .lic 파일 경로 문자열 키 — 환경 변수
Docker 배포 .lic 파일을 이미지에 복사하거나 마운트해야 합니다 환경 변수 — 파일 필요 없음
.NET Framework 예 (4.6.2+)
.NET Core / .NET 5 이상 예 (.NET Core 3.1+, .NET 5/6/7/8)
Windows 예 (x64/x86)
Linux 예 (x64)
macOS 예 (x64/ARM)
Docker
Azure / AWS Lambda

생성 API

두 라이브러리 간의 코드 상세도 차이가 일상적인 코드 작성에서 가장 두드러지게 나타나는 부분은 바로 생성 API입니다.

Aspose.BarCode 접근 방식

Aspose.BarCode는 구성을 위해 Parameters 계층 구조가 있는 BarcodeGenerator 클래스를 사용합니다. 최소한의 생성 호출은 인스턴스화, 저장 호출 및 형식 지정의 세 단계로 구성됩니다. 실제 사용에는 일반적으로 generator.Parameters.Barcode.*로 이동해야 합니다:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

모든 맞춤 설정은 암기해야 하는 다단계 개체 계층 구조인 generator.Parameters.Barcode.*로 이동합니다. 일단 외우고 나면 복잡하지 않지만, 암기가 필요하다.

IronBarcode접근법

IronBarcode 매개변수 계층 구조를 유연한 메서드 체인으로 대체합니다. 기본 설정은 대부분의 사용 사례에서 올바른 결과를 제공하며, 사용자 지정은 코드 내에 직접 표현할 수 있습니다.

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

QR 코드의 경우, IronBarcode의 QR 코드 생성 API는 수동 이미지 합성 없이 브랜드 로고를 지원합니다.

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode는 QR 코드용 원콜 브랜드 로고 도우미를 제공하지 않습니다; 문서화된 접근 방식은 바코드 이미지를 생성한 다음 (예: System.Drawing.Graphics와 함께) 로고를 합성하는 것입니다. IronBarcode의 AddBrandLogo은(는) 한 번의 호출로 합성을 처리하고 오류 수정을 적절하게 자동 설정합니다.

PDF 바코드 읽기

많은 팀에게 있어 이것이 가장 중요한 비교입니다. PDF 문서에서 바코드를 읽는 것은 일반적인 워크플로입니다. 예를 들어, 수신 송장, PDF로 저장된 배송 라벨, 스캔한 문서 보관함 등이 있습니다.

Aspose.BarCode 접근 방식

Aspose.BarCode는 PDF를 기본적으로 지원하지 않습니다. Aspose를 사용하여 PDF에서 바코드를 읽으려면 PDF를 로드하고 페이지를 이미지로 렌더링하는 Aspose.PDF와 렌더링된 이미지를 스캔하는 Aspose.BarCode가 필요합니다. 둘 다 구독 상품입니다. 두 제품 모두 라이선스 활성화가 필요합니다. 개발자 대부분이 단일 기능으로 생각하는 것에 대해 두 개의 연간 구독을 지불하고 있습니다.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

이는 두 번의 라이선스 설정, 두 번의 네임스페이스에서의 사용 구문, 렌더링 파이프라인, 메모리 스트림 관리 및 중첩 루프가 필요합니다. 또한 이미지 추출 시점에 바코드가 어떤 형식을 사용하는지 일반적으로 알 수 없기 때문에 DecodeType.AllSupportedTypes를 사용합니다.

IronBarcode접근법

IronBarcode PDF 구문 분석, 페이지 렌더링 및 바코드 감지를 자체적으로 처리합니다. Read을(를) 호출하여 .pdf로 끝나는 경로를 지정하면 바코드 결과가 반환되어 각 결과가 어느 페이지에서 생성되었는지 알 수 있는 result.PageNumber이(가) 포함됩니다. 추가 패키지, 추가 라이선스, 렌더링 코드는 필요하지 않습니다.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode PDF 읽기 문서에는 여러 페이지를 일괄 처리하고 페이지 범위 필터링 옵션을 사용하는 방법이 설명되어 있습니다.

알 수 없는 바코드 형식 읽기

이미지에 어떤 바코드 형식이 포함되어 있는지 모를 때, 두 라이브러리는 상황을 다르게 처리합니다.

Aspose.BarCode 접근 방식

DecodeType.AllSupportedTypes은(는) 형식을 모르는 시나리오에 대한 Aspose의 솔루션입니다. Aspose 자체 문서에서도 디코더가 알려진 모든 심볼을 순차적으로 실행하기 때문에 대상 목록을 지정하는 것보다 속도가 느리다는 점을 인정하고 있습니다. 대량 처리 환경, 즉 분당 수천 개의 라벨을 스캔하는 창고의 경우 이러한 성능 차이는 결코 사소하지 않습니다.

using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

IronBarcode접근법

포맷 지식에 기반한 "느린 모드"와 "빠른 모드"는 없습니다. IronBarcode의 감지 알고리즘은 이미지에 Code 128이 포함되어 있든 DataMatrix가 포함되어 있든 동일한 알고리즘을 실행합니다. 성능과 정확성 간의 트레이드오프를 조정하고 싶다면, ReadingSpeed 옵션을 사용하여 형식 지식 없이 조정할 수 있습니다.

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster은(는) 처리량을 우선시합니다. ReadingSpeed.Detailed은(는) 손상되거나 저대비 이미지에 대한 정확성을 우선시합니다. 두 방법 모두 형식을 미리 알 필요가 없습니다. 전체 튜닝 매개변수 세트는 IronBarcode 읽기 옵션을 참조하십시오.

API 매핑 참조

Aspose.BarCode IronBarcode
new BarcodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (느리고 철저한 스캔) 자동 — 항상 빠르고 모든 형식에 대해 동일한 호출을 사용합니다.
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
reader.ReadBarCodes() 반복 BarcodeReader.Read의 반환 값
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") — 하나의 패키지
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData() 또는 .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + 수동 로고 오버레이 QRCodeWriter.CreateQrCode().AddBrandLogo()

팀이 Aspose.BarCode에서IronBarcode로 마이그레이션을 고려할 때

일반적으로 개발팀이 Aspose.BarCode의 대안으로IronBarcode고려하게 되는 시나리오는 여러 가지가 있습니다.

구독 갱신 알림이 도착했습니다

연간 구독 갱신 시점은 팀에서 라이브러리 관련 결정을 재검토하는 경우가 가장 많은 시점입니다. Aspose.BarCode가 스택에서 유일한 Aspose 제품인 경우, 개발자당 연간 $999를 지불하거나(Site 티어에서 연간 $4,995) 바코드 기능을 비교해 보세요. 대화는 대개 이렇게 흘러갑니다. "우리는 이걸 매년 영원히 내야 해."IronBarcode일회성 비용은 얼마인가요? Professional 등급(개발자 10명 기준 2,999달러)의 경우, 사이트 라이선스 비용을 고려하면IronBarcode첫 해 안에 투자 비용을 회수할 수 있습니다.

Aspose.Total을 사용하는 팀 — Aspose.BarCode가 많은 다른 Aspose 제품과 번들된 경우 — 계산이 다릅니다. 해당 번들 내에서 Aspose.BarCode의 한계 비용은 거의 0에 가깝습니다. 그 팀들은 굳이 팀을 바꿀 이유가 적다.

PDF 지원이 필수 사항이 되었습니다

많은 프로젝트는 이미지에서 바코드를 읽는 것으로 시작하여, 이해관계자가 수신 문서가 이미지 파일이 아닌 PDF 파일임을 알게 되면 나중에 PDF 지원 기능을 추가합니다. 이 시점에서 Aspose.BarCode 팀은 Aspose.PDF(별도의 구독)를 추가하거나, 타사 PDF 렌더러를 찾거나, 바코드 라이브러리를 재평가하는 세 가지 결정에 직면하게 됩니다.

Aspose.PDF를 추가하면 즉각적인 요구 사항이 해결되지만 두 번째 연간 구독이 필요합니다. 타사 렌더러를 발견하면 종속성을 추가하고 통합 노력이 필요합니다. 바코드 라이브러리를 재평가하고IronBarcode일회성 비용으로 PDF를 기본적으로 읽을 수 있다는 사실을 발견하는 것이 종종 그 결과입니다.

포맷 미확인 프로덕션 시나리오

문서 업로드를 허용하는 고객 대면 애플리케이션은 업로드된 문서에서 사용하는 바코드 형식을 제어할 수 없습니다. 애플리케이션이 Code 128 입력을 가정하고 빌드되었고 고객이 DataMatrix 라벨을 업로드한 경우, 하드코딩된 DecodeType.Code128은(는) 결과를 조용히 반환하지 않습니다. DecodeType.AllSupportedTypes으로의 변경은 정확성을 고치지만 성능 비용을 초래합니다.

이 문제를 겪은 팀 — 프로덕션에서 새로운 형식이 나타날 때마다 리더 구성에 점차 더 많은 DecodeType 값을 추가하게 되지만, 새 형식 소스가 추가될 때마다 업데이트해야 하는 목록을 유지하기도 합니다. IronBarcode의 자동 감지 기능 덕분에 해당 목록은 필요하지 않습니다.

클라우드 및 컨테이너 기반 배포

Aspose.BarCode의 파일 기반 라이선스는 배포 단계를 추가합니다. 라이선스 파일은 애플리케이션이 읽을 수 있는 경로에서 런타임 시 액세스할 수 있어야 합니다. GitOps 워크플로에서 라이선스 파일은 소스 제어 시스템에 포함되거나(보안 위험) 마운트된 비밀 볼륨을 통해 삽입되어야 합니다. IronBarcode의 키 기반 접근 방식은 컨테이너 이미지에서 관리해야 할 파일이 없으므로 Kubernetes 시크릿 및 CI/CD 시크릿 변수에 깔끔하게 통합됩니다.

일반적인 마이그레이션 고려사항

Aspose.BarCode에서IronBarcode로 전환하는 팀은 몇 가지 예측 가능한 기술적 조정 작업을 거치게 됩니다.

속성 이름 매핑

패키지 전환 후 가장 일반적인 컴파일 오류는 result.CodeText에서 result.Value로의 이름 변경입니다. 코드베이스 전체 검색을 통해 이 문제를 신속하게 해결할 수 있습니다.

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText이(가) result.Value으로 변환됩니다. result.CodeTypeName이(가) result.Format.ToString()으로 변환됩니다. result.Format 속성은 BarcodeEncoding 열거형 값이며, 필요한 경우 형식 비교도 가능합니다.

디코드타입 제거

코드 베이스의 모든 DecodeType.* 참조를 제거할 수 있습니다:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

알려진 형식에서 성능을 개선하기 위해 특정 DecodeType이(가) 나열된 경우, 형식 지식 요구 없이 BarcodeReaderOptionsReadingSpeed.Faster이(가) 유사한 혜택을 제공합니다.

라이선스 초기화 변경

Aspose.BarCode는 license.SetLicense()을(를) 통해 로드된 .lic 파일을 사용합니다.IronBarcode문자열 키를 사용합니다.

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

저장소와 빌드 아티팩트에서 .lic 파일을 제거합니다. Docker에서, COPY Aspose.BarCode.lic 줄을 제거하고 ENV IRONBARCODE_LICENSE 항목으로 교체합니다.

EncodeTypes와 BarcodeEncoding 매핑

EncodeTypes.QR은(는) BarcodeEncoding.QRCode에 매핑되며, 이는 코드 생성 마이그레이션 후 팀이 처음으로 컴파일 오류를 가장 자주 마주치는 차이입니다. 다른 대부분의 매핑은 일관된 명명으로 직접 등가물입니다.

IronBarcode추가 기능

핵심 비교 항목 외에도IronBarcode적용 맥락에 따라 유용할 수 있는 다음과 같은 기능을 제공합니다.

.NET 호환성 및 미래 준비

IronBarcode는.NET Framework4.6.2+, .NET Core 3.1+, .NET 5, 6, 7, 8을 지원합니다. 라이브러리는 Microsoft의 .NET 릴리스 사이클과 맞춰 정기적인 업데이트를 받습니다. Aspose.BarCode는 비교 가능한 .NET 버전 범위를 지원하여, 현재 버전에는 두 라이브러리 모두 호환성 이점이 없습니다. 미래 대비 측면에서 중요한 차이점은 라이선스입니다. 오늘 구매한 영구IronBarcode라이선스는 추가 비용 없이 향후 .NET 버전을 지원하는 반면, Aspose.BarCode 구독은 업데이트된 빌드에 액세스하려면 지속적인 갱신이 필요합니다.

결론

Aspose.BarCode와IronBarcode바코드 라이브러리 설계에 있어 서로 다른 두 가지 철학을 나타냅니다. Aspose.BarCode는 호출자가 형식을 지정하고, 객체 수명을 관리하며, 속성 계층 구조를 통해 각 작업을 구성하는 명시적인 인스턴스 기반 API를 기반으로 구축되었습니다.IronBarcode는 정적이고 형식에 구애받지 않는 API를 기반으로 구축되었으며, 라이브러리가 자체적으로 감지, 객체 수명 주기 및 PDF 렌더링을 처리합니다. 어느 접근 방식도 본질적으로 옳지 않으며, 올바른 선택은 애플리케이션의 요구 사항에 따라 달라집니다.

Aspose.BarCode는 이미 Aspose 생태계 내에서 운영 중인 팀에게 더 나은 선택입니다. Aspose.Total이 이미 라이선스된 경우, Aspose.BarCode에서 마진 비용이 추가되지 않으며, 80개 이상의 심볼로지 목록은 상업 for .NET 바코드 라이브러리에서 가장 넓은 범위 중 하나입니다. MaxiCode, DotCode 또는 IronBarcode의 50개 이상 목록에 없는 특정 우편 기호와 같이 특이한 형식이 필요한 애플리케이션의 경우 Aspose.BarCode가 유일한 실행 가능한 옵션일 수 있습니다. 완성도와 다양한 형식을 아우르는 점은 진정한 강점입니다.

Aspose.BarCode를 단독 구매 제품으로 평가하는 팀의 경우, 가치 계산을 하기가 더 어렵습니다. 형식 지정 요구 사항은 모든 읽기 작업에 불편함을 더합니다. PDF를 기본적으로 지원하지 않는다는 점 때문에IronBarcode의 기본 패키지에 포함된 기능을 사용하기 위해 구독료가 두 배로 늘어납니다. 또한 구독 모델은 비용이 매년 복리로 증가한다는 것을 의미합니다. 10명의 개발자로 구성된 팀의 경우 연간 4,995달러를 지불하게 되므로 5년 동안 총 24,975달러가 소요됩니다. 반면IronBarcode Professional 일회성으로 구매할 경우 2,999달러입니다. IronBarcode의 자동 감지, 기본 PDF 읽기 기능 및 영구 라이선스는 이러한 세 가지 문제를 하나의 패키지로 해결합니다.

최종 결정은 생태계 적합성과 상징적 요구 사항에 달려 있습니다. Aspose 제품과 긴밀하게 통합된 팀이나 IronBarcode에서 지원하는 형식 외의 형식이 필요한 팀은 Aspose.BarCode를 사용하는 것이 좋습니다. 독립형 영구 라이선스, 기본 PDF 읽기 기능, 그리고 읽을 때마다 형식 정보를 알 필요가 없는 API를 원하는 팀에게는IronBarcode더 실용적인 선택이 될 것입니다.

자주 묻는 질문

.NET용 Aspose.BarCode란 무엇인가요?

.NET용 Aspose.BarCode는 C# 애플리케이션에서 바코드를 생성하고 판독하기 위한 .NET 바코드 라이브러리입니다. 개발자가 .NET 프로젝트용 바코드 솔루션을 선택할 때 평가하는 여러 대안 중 하나입니다.

.NET용 Aspose.BarCode와 IronBarcode의 주요 차이점은 무엇인가요?

일반적으로 인스턴스 관리가 필요 없는 정적 상태 비저장 API를 사용하는 반면, .NET용 Aspose.BarCode는 사용 전에 인스턴스 생성 및 구성이 필요합니다. 또한 IronBarcode는 모든 환경에서 기본 PDF 지원, 자동 형식 감지, 단일 키 라이선싱을 제공합니다.

IronBarcode가 Aspose.BarCode for .NET보다 라이선스 취득이 더 쉬운가요?

IronBarcode는 개발 및 프로덕션 배포를 모두 포괄하는 단일 라이선스 키를 사용합니다. 따라서 SDK 키와 런타임 키를 분리하는 라이선싱 시스템에 비해 CI/CD 파이프라인 및 Docker 구성이 간소화됩니다.

IronBarcode는 .NET용 Aspose.BarCode가 지원하는 모든 바코드 형식을 지원하나요?

IronBarcode는 QR코드, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 등 30개 이상의 바코드 심볼로지를 지원합니다. 형식 자동 감지 기능은 명시적인 형식 열거가 필요하지 않음을 의미합니다.

IronBarcode는 네이티브 PDF 바코드 판독을 지원하나요?

예. IronBarcode는 별도의 PDF 렌더링 라이브러리가 필요 없이 BarcodeReader.Read("document.pdf")를 사용하여 PDF 파일에서 직접 바코드를 판독합니다. 페이지별 결과에는 페이지 번호, 바코드 형식, 값 및 신뢰도 점수가 포함됩니다.

.NET용 Aspose.BarCode와 비교하여 IronBarcode는 일괄 처리를 어떻게 처리하나요?

IronBarcode의 정적 메서드는 상태 저장소가 없고 자연스럽게 스레드에 안전하므로 스레드별 인스턴스 관리 없이 Parallel.ForEach를 직접 사용할 수 있습니다. 어떤 가격대에서도 처리량 상한선이 없습니다.

IronBarcode 어떤 .NET 버전을 지원하나요?

IronBarcode는 단일 NuGet 패키지로 .NET Framework 4.6.2+, .NET Core 3.1 및 .NET 5, 6, 7, 8, 9를 지원합니다. 플랫폼 대상에는 Windows x64/x86, Linux x64, macOS x64/ARM이 포함됩니다.

.NET 프로젝트에 IronBarcode를 설치하려면 어떻게 해야 하나요?

NuGet을 통해 IronBarcode 설치: 패키지 관리자 콘솔에서 'Install-Package IronBarCode'를 실행하거나 CLI에서 '닷넷 추가 패키지 IronBarCode'를 실행합니다. 추가 SDK 인스톨러나 런타임 파일은 필요하지 않습니다.

Aspose.BarCode와 달리 구매하기 전에 IronBarcode를 평가할 수 있나요?

예. IronBarcode의 평가판 모드는 완전한 디코딩된 바코드 값을 반환하며 생성된 출력 이미지에만 워터마크가 표시됩니다. 구매를 결정하기 전에 자신의 문서에서 판독 정확도를 벤치마킹할 수 있습니다.

Aspose.BarCode for .NET과 IronBarcode의 가격 차이는 무엇인가요?

개발 및 프로덕션을 포함하는 단일 개발자 영구 라이선스의 IronBarcode 가격은 $749부터 시작합니다. 가격 세부 정보 및 볼륨 옵션은 IronBarcode 라이선스 페이지에서 확인할 수 있습니다. 별도의 런타임 라이선스 요구 사항은 없습니다.

.NET용 Aspose.BarCode에서 IronBarcode로 마이그레이션하는 것은 간단하나요?

.NET용 Aspose.BarCode에서 IronBarcode로의 마이그레이션에는 주로 인스턴스 기반 API 호출을 IronBarcode의 정적 메서드로 대체하고, 라이선스 상용구를 제거하고, 결과 속성 이름을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션에는 코드를 추가하기보다는 줄이는 작업이 포함됩니다.

IronBarcode는 로고가 있는 QR 코드를 생성하나요?

예. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 구성 가능한 오류 수정을 통해 기본적으로 브랜드 이미지를 QR코드에 임베드합니다. ChangeBarCodeColor()를 통해 컬러 QR 코드도 지원됩니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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