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

Accusoft 바코드익스프레스와 IronBarcode: C# 바코드 라이브러리 비교

바코드 라이브러리를 평가할 때, 구매를 결정하기 전에 해당 라이브러리가 이미지에서 실제로 제대로 작동하는지 확인하고 싶어합니다. Accusoft BarcodeXpress는 해당 옵션을 제공하지 않습니다. 평가 모드에서 디코딩된 바코드 값은 부분적으로 가려집니다. 예를 들어 "1234567890"은 "1234...XXX"로 표시됩니다. 라이브러리가 바코드를 찾았다는 것은 확인할 수 있지만, 바코드를 정확하게 읽었는지 여부는 확인할 수 없습니다. 이는 검증 전에 확정하는 상황이며, 가격을 검토하기도 전에 상당한 마찰을 일으키는 요인입니다.

Accusoft 바코드 익스프레스이해하기

Accusoft는 수십 년 동안 Enterprise 환경을 위한 문서 이미지 처리 소프트웨어를 개발해 왔습니다. BarcodeXpress는 PrizmDoc, ImageGear 및 Accusoft Imaging을 포함하는 더 광범위한 제품군에 속합니다. 이미 해당 제품을 사용하고 있는 팀은 익숙한 API 인터페이스를 접하게 되며 기존 Accusoft 계정 관계를 활용할 수 있습니다. 하지만 독립형 바코드 사용의 경우 이러한 맥락은 큰 도움이 되지 않습니다.

핵심 SDK는 .NET Core 용 NuGet 패키지로 제공됩니다. API는 인스턴스 기반이므로 BarcodeXpress 객체를 생성하고 Licensing 속성을 구성한 다음 하위 readerwriter 객체를 사용하여 실제 작업을 수행합니다. 이중 키 라이선스 시스템은 BarcodeXpress를 대부분의 다른 대안과 차별화하는 요소입니다.

BarcodeXpress의 주요 아키텍처 특징:

  • 인스턴스 기반 API: 모든 작업에는 BarcodeXpress 인스턴스가 필요합니다; 정적 편의 방법은 설계의 일부가 아닙니다
  • 이중 라이선싱: SDK 라이선싱(SolutionName + SolutionKey) 및 런타임 라이선싱(UnlockRuntime)은 별도 구매가 필요한 별도의 시스템입니다
  • 평가 모드 변조: 평가 모드에서는 디코딩된 값이 의도적으로 저하됩니다. 예를 들어 "1234567890"은 "1234...XXX"로 반환되므로 구매 전 정확도 테스트가 불가능합니다.
  • 수동 형식 사양: 검색할 기호를 열거하려면 명시적인 BarcodeTypes 구성이 필요합니다; 지정되지 않은 형식이 감지되지 않음
  • 분당 40페이지 표준 처리 속도 제한: 표준 버전은 분당 40페이지로 처리 속도를 제한하는데, 이는 대부분의 팀이 배포 전이 아닌 배포 후에 직면하는 제한입니다.
  • PDF를 기본적으로 지원하지 않습니다. PDF 파일을 처리하려면 별도의 라이브러리를 사용하여 이미지로 사전 렌더링해야 합니다.
  • 최소 5개의 런타임 라이선스: 단일 서버 배포의 경우에도 최소 5개의 런타임 라이선스를 구매해야 합니다.

투키 시스템 설명

BarcodeXpress는 라이선스를 개념적으로 분리된 두 가지 계층으로 나눕니다.

// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk

Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
$vbLabelText   $csharpLabel

SolutionNameSolutionKey 쌍은 SDK 자체를 활성화합니다. 자체 키와 자체 솔루션 키를 별도의 인수로 사용하는 UnlockRuntime 호출은 프로덕션 배포 기능을 활성화합니다. 실제 운영 환경에서 바코드 값이 완전하고 가려지지 않게 반환되려면 두 가지 모두 존재하고 유효해야 합니다.

코드 리뷰에서 이러한 패턴은 예측 가능한 질문을 만들어냅니다: "왜 두 개의 다른 키를 사용하여 UnlockRuntime를 호출하는가?" Accusoft는 SDK 라이선싱과 배포 라이선싱을 별도의 과금이 적용되는 별도의 제품으로 취급한다는 대답은 API 자체에서 항상 명확하게 드러나지 않습니다. 초기 설정 후 6개월이 지난 시점에도 이 코드를 유지 관리하는 팀은 어떤 키가 어떤 용도인지 이해하기 위해 문서를 참조해야 하는 경우가 많습니다.

IsRuntimeUnlocked 속성을 사용하면 런타임 계층이 활성화되어 있는지 확인할 수 있습니다:

if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
    // In this state, barcode values are partially obscured
    // "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
    // In this state, barcode values are partially obscured
    // "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
    ' In this state, barcode values are partially obscured
    ' "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active")
End If
$vbLabelText   $csharpLabel

이 검사는 평가 모드 출력에서 ​​예외를 발생시키거나 명확하게 실패를 알리는 대신 부분적인 데이터를 조용히 반환하는 것을 발견했을 때 팀이 추가하는 안전장치입니다.

IronBarcode이해하기

IronBarcode 는 NuGet 패키지 외에는 외부 종속성이 없는 독립형 .NET 바코드 라이브러리입니다. 이 방식은 정적 팩토리 메서드를 통해 생성과 읽기를 모두 처리하므로 인스턴스 수명 주기를 관리할 필요가 없고 애플리케이션 코드 전체에 생성자 호출이 흩어져 있지 않습니다.

단일 키 라이선스 모델은 평가판 모드에서 테스트하는 내용이 실제 운영 환경에서도 그대로 실행된다는 것을 의미합니다. 유일한 차이점은 평가판 실행 중에 생성되는 바코드 이미지에 워터마크가 표시된다는 점입니다. 디코딩된 값은 항상 완전하므로 구매 여부를 결정하기 전에 실제 문서에서 읽기 정확도를 벤치마킹할 수 있습니다.

IronBarcode 의 주요 특징:

  • 정적 API 설계: BarcodeReader.Read()BarcodeWriter.CreateBarcode()는 인스턴스 관리가 필요 없는 상태 비저장 정적 메서드입니다
  • 단일 라이선스 키: 하나의 키로 개발 및 운영 환경 배포 모두에 사용할 수 있습니다. 별도의 런타임 라이선스 계층이 없습니다
  • 전체 시험 값: 시험 모드는 디코딩된 모든 값을 반환합니다. 워터마크는 생성된 출력 이미지에만 적용되며, 읽기 결과에는 적용되지 않습니다.
  • 자동 형식 감지:IronBarcode지원되는 모든 형식에서 심볼을 자동으로 감지합니다. BarcodeTypes 열거가 필요하지 않습니다
  • 네이티브 PDF 지원: BarcodeReader.Read("document.pdf")는 별도의 렌더링 단계 없이 PDF 파일을 직접 처리합니다
  • 처리량 제한 없음: 처리 속도는 소프트웨어에 의한 제한이 아닌 하드웨어 및 네트워크 용량에 의해서만 제한됩니다.
  • 설계상 스레드 안전성 보장: 상태를 저장하지 않는 정적 메서드는 인스턴스 격리 없이도 여러 스레드에서 동시에 호출할 수 있습니다.

기능 비교

기능 Accusoft 바코드 익스프레스 IronBarcode
라이선스 모델 SDK 라이선스 + 별도 런타임 라이선스 단일 영구 키
평가 모드 동작 바코드 값이 부분적으로 가려져 있습니다("1234...XXX"). 전체 값이 반환되며, 생성된 출력에만 워터마크가 표시됩니다.
처리량 제한(표준) 분당 40페이지 처리량 제한 없음
PDF 지원 이미지 추출을 위해 외부 PDF 라이브러리가 필요합니다. 네이티브 - BarcodeReader.Read("doc.pdf")
API 스타일 인스턴스 기반의 상세 구성 정적 팩토리 메서드, 플루언트 API
스레드 안전성 스레드당 인스턴스 필요 상태 비저장 정적 메서드 — 본질적으로 스레드 안전함
가격 진입점 SDK 비용 $1,960 이상 + 런타임 비용 $2,500 이상 (최소 5개 구매 시) 749달러 영구 라이선스 (Lite, 개발자 1명)

상세 기능 비교

기능 Accusoft 바코드 익스프레스 IronBarcode
라이선스
라이선스 모델 SDK 키 + 런타임 키 단일 영구 키
최소 런타임 라이선스 5개 (서버 1개 기준) 런타임 라이선스 개념 없음
평가 모드 값은 "1234...XXX"로 가려져 있습니다. 전체 값, 출력 이미지에만 워터마크 표시
영구 라이선스 기본 사양이 아닙니다. 판매 담당자에게 문의하십시오. 네, 모든 등급이요.
연간 갱신 지원에 필요합니다 선택적
독서
형식 자동 감지 수동 모드 - 바코드 유형을 지정해야 합니다. 지원되는 모든 형식에서 자동으로 처리됩니다.
PDF 읽기 외부 PDF 라이브러리가 필요합니다. 내부 지원
이미지당 여러 개의 바코드 예, BarcodeTypes 구성 사용 예, ExpectMultipleBarcodes 옵션 포함
결과 속성 BarcodeValue, BarcodeType @@--코드-50515--@@, @@--코드-50516--@@, @@--코드-50517--@@, @@--코드-50518--@@
처리량 제한 40 PPM (표준판) 어떤 등급에서도 제한 없음
세대
코드 128 생성 예, writer.BarcodeType를 통해 전송하세요 예, BarcodeWriter.CreateBarcode()를 통해
QR 코드 생성 예, QRCodeWriter.CreateQrCode()을 통해
로고가 포함된 QR 코드 수동 이미지 오버레이 필요 AddBrandLogo("logo.png") 빌트인
출력 형식 파일 저장 PNG, JPG, PDF, 바이너리 데이터, 스트림
플랫폼 및 배포
.NET Framework 별도의 레거시 SDK .NET Framework4.6.2 이상
.NET Core / .NET 5 이상 예 (.NET Core SDK) .NET Core 3.1 이상, .NET 5/6/7/8/9
Linux/Docker 예 — Windows x64/x86, Linux x64, macOS x64/ARM
Docker 라이선스 구성 라이선스 파일 또는 라이선스 서버 환경 변수
CI/CD 통합 SDK 키와 런타임 키 모두 필요합니다. 하나의 비밀
배치 처리
나사 안전 스레드당 인스턴스 필요 상태 비저장 — 병렬.ForEach 안전
병렬 배치 스레드별 인스턴스 관리가 필요합니다. 직접 병렬.ForEach 지원

라이선스 아키텍처

BarcodeXpress와IronBarcode의 라이선스 복잡성 차이는 실제 운영 환경에서 실행될 초기화 코드를 작성할 때 가장 두드러지게 나타납니다.

BarcodeXpress 접근 방식

using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress();

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SolutionName = "AcmeCorp";
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");

        // Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime(
            "RuntimeKey-XXXXXX",
            Convert.ToInt64("98765432109876"));

        // Guard against partial-value mode
        if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
        {
            throw new InvalidOperationException(
                "Runtime license not active — barcode values will be obscured");
        }
    }
}
using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress();

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SolutionName = "AcmeCorp";
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");

        // Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime(
            "RuntimeKey-XXXXXX",
            Convert.ToInt64("98765432109876"));

        // Guard against partial-value mode
        if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
        {
            throw new InvalidOperationException(
                "Runtime license not active — barcode values will be obscured");
        }
    }
}
Imports Accusoft.BarcodeXpressSdk

Public Class BarcodeService
    Private ReadOnly _barcodeXpress As BarcodeXpress

    Public Sub New()
        _barcodeXpress = New BarcodeXpress()

        ' Layer 1: SDK license
        _barcodeXpress.Licensing.SolutionName = "AcmeCorp"
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")

        ' Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))

        ' Guard against partial-value mode
        If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
            Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
        End If
    End Sub
End Class
$vbLabelText   $csharpLabel

이 코드는 바코드 작업이 시작되기 전에 두 개의 서로 다른 라이선스 키 시스템을 관리하기 위해 만들어진 15줄짜리 생성자입니다. 코드 50523--@@ 가드는 선택 사항이 아니며, 이 가드가 없으면 런타임 키가 누락되거나 잘못 구성된 모든 환경에서 서비스가 성능 저하된 값을 자동으로 반환합니다.

IronBarcode접근법

using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode

' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY"
$vbLabelText   $csharpLabel

이것이 완전한 라이선스 설정입니다. 별도의 런타임 잠금 해제, 솔루션 이름, 두 개의 인수 UnlockRuntime 호출이 필요하지 않습니다. Docker에서는 이 값이 시작 시 읽히는 환경 변수가 됩니다. CI/CD 파이프라인에서는 하나의 비밀 값으로 사용됩니다. 컨테이너 오케스트레이터에서 이는 파드에 주입되는 하나의 환경 변수입니다.

바코드 읽기

바코드 판독을 통해 두 라이브러리의 구성 방식 차이를 확인할 수 있습니다. BarcodeXpress는 명시적인 형식 열거와 속성 기반 설정 API를 요구하는 반면,IronBarcode단 하나의 메서드 호출로 모든 것을 자동으로 감지합니다.

BarcodeXpress 접근 방식

바코드익스프레스로 판독하려면 상수와 값을 취하는 SetPropertyValue를 통해 리더기를 구성한 다음 Analyze()를 호출하여 결과를 검색해야 합니다:

using Accusoft.BarcodeXpressSdk;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress();
    barcodeXpress.Licensing.SolutionName = "AcmeCorp";
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
    barcodeXpress.reader.BarcodeTypes =
        BarcodeType.LinearBarcode |
        BarcodeType.DataMatrixBarcode |
        BarcodeType.QRCodeBarcode;

    var results = barcodeXpress.reader.Analyze();
    return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress();
    barcodeXpress.Licensing.SolutionName = "AcmeCorp";
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
    barcodeXpress.reader.BarcodeTypes =
        BarcodeType.LinearBarcode |
        BarcodeType.DataMatrixBarcode |
        BarcodeType.QRCodeBarcode;

    var results = barcodeXpress.reader.Analyze();
    return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim barcodeXpress = New BarcodeXpress()
    barcodeXpress.Licensing.SolutionName = "AcmeCorp"
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
    barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode

    Dim results = barcodeXpress.reader.Analyze()
    Return results.Select(Function(r) r.BarcodeValue)
End Function
$vbLabelText   $csharpLabel

cycBxeSetFilename 상수는 처리할 파일을 지정하는 API의 방식입니다. 상수 식별자와 값을 일반 SetPropertyValue 메서드에 전달하는 이 패턴은 구형 COM 기반 API를 연상시킵니다. 문서에 BarcodeTypes에 나열되지 않은 형식이 포함되어 있으면 해당 문서를 찾을 수 없습니다. 이는 문서 소스가 변경될 때 유지 관리 부담으로 작용합니다.

IronBarcode접근법

using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
Imports IronBarCode

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim results = BarcodeReader.Read(imagePath)
    Return results.Select(Function(r) r.Value)
End Function
$vbLabelText   $csharpLabel

IronBarcode 지원되는 모든 심볼 체계에서 형식을 자동으로 감지합니다. 이미지에 Code 128, QR 코드 및 DataMatrix가 모두 포함된 경우, 구성 변경 없이 세 가지 모두 결과 모음에 표시됩니다. 읽기 동작을 더욱 세밀하게 제어하기 위해 BarcodeReaderOptions 클래스는 속도, 스레드 수 및 다중 바코드 설정을 제공합니다.

PDF 원본 파일 읽기도 동일한 방법으로 가능합니다.

using IronBarCode;

// 내부 지원 PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

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

// 내부 지원 PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

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

' 내부 지원 PDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")

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

BarcodeXpress는 PDF 파일을 기본적으로 읽지 않습니다. 먼저 별도의 라이브러리를 사용하여 각 페이지를 이미지로 렌더링한 다음, 해당 이미지를 BarcodeXpress 리더기에 전달해야 합니다. 이는 종속성을 추가하고, 변환 단계를 추가하며, 선택한 PDF 라이브러리에 따라 추가 라이선스 비용을 발생시킵니다.

일괄 처리 및 나사산 안전성

대용량 바코드 처리 환경에서는 BarcodeXpress의 상태 유지형 인스턴스 모델과 IronBarcode의 상태 비저장형 정적 API 간의 아키텍처적 차이가 드러납니다.

BarcodeXpress 접근 방식

BarcodeXpress는 인스턴스 기반이며 reader 객체는 상태 저장형입니다. 병렬 처리를 위해서는 스레드당 하나의 인스턴스가 필요하며, 각 스레드 컨텍스트에서 2계층 라이선스 초기화가 반복됩니다.

using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
    var results = new Dictionary<string, string>();

    foreach (var path in imagePaths)
    {
        _barcodeXpress.reader.SetPropertyValue(
            BarcodeXpress.cycBxeSetFilename, path);
        _barcodeXpress.reader.BarcodeTypes =
            BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;

        var barcodes = _barcodeXpress.reader.Analyze();
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
    var results = new Dictionary<string, string>();

    foreach (var path in imagePaths)
    {
        _barcodeXpress.reader.SetPropertyValue(
            BarcodeXpress.cycBxeSetFilename, path);
        _barcodeXpress.reader.BarcodeTypes =
            BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;

        var barcodes = _barcodeXpress.reader.Analyze();
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic

Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
    Dim results As New Dictionary(Of String, String)()

    For Each path In imagePaths
        _barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
        _barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode

        Dim barcodes = _barcodeXpress.reader.Analyze()
        If barcodes.Length > 0 Then
            results(path) = barcodes(0).BarcodeValue
        End If
    Next

    Return results
End Function
$vbLabelText   $csharpLabel

표준판은 또한 분당 40페이지라는 속도 제한을 적용합니다. 10만 건의 문서를 분당 40건의 속도로 처리하는 데는 대략 41시간이 소요됩니다. Professional 에디션은 이러한 제한을 없애지만, 개발자당 비용이 더 높으며, 이미 구매한 런타임 라이선스 비용도 추가됩니다.

IronBarcode접근법

using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

'IronBarcode— parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()

Parallel.ForEach(files, Sub(file)
    Dim r = BarcodeReader.Read(file)
    For Each barcode In r
        allResults.Add($"{file}: {barcode.Value}")
    Next
End Sub)
$vbLabelText   $csharpLabel

IronBarcode의 정적 메서드는 상태 저장소가 없으므로 인스턴스 격리 없이 Parallel.ForEach를 통해 안전하게 사용할 수 있습니다.IronBarcode어떤 가격대에서도 처리량 제한을 두지 않습니다. 읽기 성능 조정을 위해 BarcodeReaderOptions 클래스는 ReadingSpeedMaxParallelThreads 설정을 제공합니다:

using IronBarCode;

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

var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;

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

var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode

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

Dim results = BarcodeReader.Read("warehouse-scan.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Balanced가 기본값입니다. 바코드가 깨끗한 고처리량 파이프라인의 경우 ReadingSpeed.Faster를 사용하고, 손상되었거나 대비가 낮은 이미지의 경우 ReadingSpeed.Detailed를 사용합니다.

API 매핑 참조

Accusoft 바코드 익스프레스 IronBarcode
@@--코드-50537--@@ 정적 메서드 - 인스턴스가 필요하지 않습니다.
@@--코드-50538--@@ @@--코드-50539--@@
@@--코드-50540--@@ (removed — not needed)
@@--코드-50541--@@ (removed — no runtime license concept)
@@--코드-50542--@@ (removed — license is always either valid or not)
@@--코드-50543--@@ @@--코드-50544--@@
reader.바코드 유형 = 바코드 유형 = 리니어바코드 \| ... (removed — auto-detection handles all formats)
@@--코드-50545--@@ (part of BarcodeReader.Read)
@@--코드-50547--@@ @@--코드-50548--@@
@@--코드-50549--@@ @@--코드-50550--@@
@@--코드-50551--@@ @@--코드-50552--@@
@@--코드-50553--@@ (first argument to CreateBarcode)
@@--코드-50555--@@ @@--코드-50556--@@
40 PPM 표준 한계치 어떤 등급에서도 처리량 제한이 없습니다.
평가: 값은 "1234...XXX"로 가려져 있습니다. 시험 버전: 전체 값 제공, 출력 이미지에만 워터마크 표시

팀에서 Accusoft BarcodeXpress에서IronBarcode로 마이그레이션을 고려할 때

40 PPM 장벽을 넘어 확장하기

표준 버전의 분당 40페이지 처리 속도 제한은 넉넉해 보이지만, 비즈니스 팀에서 1년 치 보관된 송장을 일괄 처리하기 시작하면 그 제한이 얼마나 심각한지 깨닫게 됩니다. 그 속도로 10만 건의 문서를 처리하는 데는 대략 41시간이 걸립니다. Professional 에디션으로 업그레이드하면 사용량 제한은 사라지지만, 개발자당 사용권 가격이 인상되며, 이미 구매한 런타임 라이선스 비용도 추가로 발생합니다. 구매 계약서에 서명한 후에 처리량 한계를 발견한 팀은 해당 한계를 제거하는 데 드는 총비용이 초기 예상치를 훨씬 초과하는 경우가 많습니다.

CI/CD 파이프라인 라이선스 복잡성

일반적인 CI/CD 설정에서는 임시 컨테이너에서 빌드를 실행합니다. BarcodeXpress를 사용하려면 모든 빌드 환경에 SDK 키 쌍과 런타임 잠금 해제 키가 모두 필요하며, 이 두 키는 별도의 비밀 키로 관리됩니다. 런타임 키가 없거나 잘못 구성된 경우 빌드는 성공할 수 있지만 통합 테스트에서 모호한 값이 반환될 수 있습니다. 이는 테스트 파이프라인에서 테스트 어설션을 실제 바코드 콘텐츠에 맞춰 신중하게 작성하지 않으면 쉽게 간과할 수 있는 오류 모드입니다.

에어갭 및 보안 배포 요구 사항

환자 기록을 처리하는 의료 시스템, 정부 문서 워크플로, 금융 기관 백오피스 처리와 같은 일부 환경에서는 외부 네트워크 통화를 할 때 라이선스 유효성 검사가 불가능합니다. BarcodeXpress의 런타임 라이선스 시스템은 Accusoft의 라이선스 인프라를 사용하므로 네트워크 송출 제한이 엄격한 환경에서는 규정 준수 문제가 발생할 수 있습니다. 그러한 환경에서 작업하는 팀은 라이선스 유효성 검사가 전적으로 로컬에서 이루어지는 라이브러리를 선택하는 경우가 많습니다.

Docker 및 컨테이너 배포

Docker에서 BarcodeXpress를 사용하려면 일반적으로 라이선스 파일을 컨테이너의 알려진 경로에 마운트하거나 라이선스 서버를 구성하고 컨테이너가 해당 서버를 가리키도록 설정해야 합니다. 두 접근 방식 모두 배포 복잡성을 증가시킵니다. 라이선스 파일을 배포하고 동기화해야 하며, 라이선스 서버는 유지 관리해야 할 추가 인프라 요소입니다. 마이크로서비스 아키텍처나 서버리스 배포 패턴으로 전환하는 팀들은 구성 파일 방식이 변경 불가능한 컨테이너 이미지로 깔끔하게 변환되지 않는다는 것을 알게 됩니다.

평가 정확도 요구 사항

구매를 결정하기 전에 자체 문서에서 판독 정확도를 검증해야 하는 팀은 BarcodeXpress의 평가 모드가 근본적으로 제한적이라고 생각합니다. 실제 문서 스캔 데이터를 사용하여 테스트하려면(라이브러리가 저대비 바코드, 기울어진 이미지 또는 여러 바코드가 있는 페이지를 처리하는지 확인하기 위해) 디코딩된 모든 값이 필요합니다. 일부 가려진 출력 내용은 라이브러리가 바코드를 발견했다는 사실만 보여줄 뿐, 바코드를 정확하게 읽었는지 여부는 알려주지 않습니다.

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

인스턴스 관리에서 정적 호출로

BarcodeXpress를 사용하려면 작업 전에 BarcodeXpress 인스턴스를 생성하고 라이선스를 받아야 합니다. IronBarcode의 정적 메서드는 인스턴스를 필요로 하지 않습니다. 마이그레이션하는 팀에는 일반적으로 생성자가 대부분 라이선스 상용구인 BarcodeService 클래스가 있으며, 마이그레이션 후에는 해당 생성자를 완전히 제거하거나 단일 라이선스 키 할당으로 줄일 수 있습니다.

BarcodeTypes 열거형 제거

모든 BarcodeXpress 판독 작업에는 검색할 기호를 열거하기 위해 BarcodeTypes 플래그 할당이 필요합니다.IronBarcode기본적으로 지원되는 모든 형식을 자동으로 감지합니다. 마이그레이션하는 동안 모든 reader.BarcodeTypes = ...과제는 교체 없이 삭제할 수 있습니다. 검색 공간을 제한해야 하는 성능상의 이유가 있는 경우 BarcodeReaderOptions에서는 형식 필터링을 필수 기본값이 아닌 명시적 옵트인(선택 사항)으로 지원합니다.

결과 속성 이름 변경

두 가지 속성 이름 변경은 모든 결과 처리 코드에 영향을 미칩니다: result.BarcodeValueresult.Value로, result.BarcodeTyperesult.Format로 바뀝니다. 솔루션 전체에 적용되는 검색 및 바꾸기 기능은 두 가지 모두를 처리합니다.IronBarcode결과에는 result.Confidenceresult.PageNumber도 노출되는데, 이는 BarcodeXpress와 동등한 기능이 없으며 기존 결과 처리에 대한 코드 변경 없이 추가 필터링에 사용할 수 있습니다.

Docker 라이선스 구성

BarcodeXpress Docker 배포는 일반적으로 마운트된 라이선스 구성 파일을 사용합니다.IronBarcode환경 변수를 사용합니다. 마이그레이션에는 구성 파일에 대한 COPY 명령어를 제거하고 단일 환경 변수 할당을 추가하는 작업이 포함됩니다. 쿠버네티스에서 라이선스 키는 마운트된 볼륨이 아니라 파드 스펙의 비밀 참조가 됩니다.

IronBarcode추가 기능

이 비교에서 다룬 핵심 기능 외에도IronBarcodeBarcodeXpress에서 제공하지 않는 기능을 제공합니다.

  • 로고가 있는 QR코드: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 스캔 안정성을 유지하기 위해 구성 가능한 오류 수정 수준과 함께 브랜드 이미지를 QR코드에 기본적으로 임베드합니다
  • PDF에 바코드 삽입 : 별도의 PDF 라이브러리 없이 기존 PDF 문서에 직접 바코드를 삽입할 수 있습니다.
  • 일괄 내보내기 : 전체 PDF 문서를 한 번에 처리하고 페이지 번호, 형식, 값 및 신뢰도 점수를 포함한 페이지별 결과를 받아볼 수 있습니다.

.NET 호환성 및 미래 준비

IronBarCode.NET Framework4.6.2 이상, .NET Core 3.1, 그리고 .NET 5, 6, 7, 8, 9를 지원합니다. 지원 플랫폼은 Windows x64 및 x86, Linux x64, macOS x64 및 ARM입니다. .NET Core 용 BarcodeXpress는 기존.NET Framework버전과 별도의 SDK입니다. 따라서 애플리케이션의 대상 프레임워크를 업그레이드하는 팀은 이 점을 고려해야 합니다. IronBarcode의 단일 패키지는 지원되는 모든 런타임을 포함합니다. 정기적인 업데이트를 통해 2026년 말 출시 예정인 .NET 10 및 향후 출시될 .NET 버전과의 호환성을 보장합니다.

결론

BarcodeXpress와IronBarcode상용 .NET 바코드 라이브러리에 대한 서로 다른 두 가지 설계 철학을 나타냅니다. BarcodeXpress는 SDK 접근 권한과 실제 운영 환경 배포를 별도의 라이선스 제품으로 취급하며, 청구 방식, 키 시스템, 최소 구매 금액 요건을 별도로 관리합니다.IronBarcode라이브러리를 개발 환경부터 운영 환경까지 모든 환경을 포괄하는 단일 제품으로 취급하며, 하나의 키로 관리합니다.

BarcodeXpress는 이미 Accusoft 제품 생태계에 익숙한 팀에게 적합한 선택입니다. PrizmDoc 또는 ImageGear를 사용하는 조직은 BarcodeXpress의 API가 친숙하고 Accusoft 계정 관계를 통해 통합 지원을 받을 수 있다는 점에서 유용할 것입니다. 해당 팀들에게 있어 두 가지 키 라이선스 시스템은 새로운 마찰 요소가 아니라 이미 확립된 운영 방식입니다. 또한 문서 소스가 잘 제어되고 형식 요구 사항이 안정적인 환경에 적합하므로 지속적인 유지 관리보다는 @@-CODE-50570--@@ 매뉴얼 사양을 한 번만 구성하는 것이 좋습니다.

IronBarcode 라이선스 관리의 복잡성이 운영 오버헤드에 직접적인 영향을 미치는 컨테이너, CI/CD 파이프라인 및 클라우드 환경에 배포하는 팀에 더 적합합니다. 자동 감지 모델, 정적 API 및 네이티브 PDF 지원은 통합 코드의 표면적을 줄여주고, 단일 키 라이선스 모델은 개발, 테스트 및 프로덕션 환경 전반에 걸쳐 비밀 관리를 간소화합니다. 구매 전에 판독 정확도를 평가해야 하는 팀의 경우, 생성된 이미지에 워터마크가 표시되고 판독 결과에는 워터마크가 표시되지 않는 전체 시험 결과물을 통해 구매 전 진정한 벤치마킹이 가능합니다.

가격 차이는 모든 등급에서 상당합니다. 개인 개발자 수준에서 볼 때, BarcodeXpress SDK Plus 최소 런타임 라이선스 비용과 IronBarcode의 Lite 등급 간의 격차는 상당합니다. 비용 차이가 Accusoft 생태계 통합보다 중요하지 않은 팀의 경우 BarcodeXpress는 여전히 합리적인 선택입니다. 하지만 바코드 라이브러리 자체의 장점을 평가하는 팀의 경우, 평가 모드 제한, 두 개의 키 라이선스, 처리량 제한 등을 고려할 때IronBarcode더 간편한 옵션입니다.

자주 묻는 질문

Accusoft 바코드익스프레스란 무엇인가요?

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

Accusoft BarcodeXpress와 IronBarcode의 주요 차이점은 무엇인가요?

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

IronBarcode가 Accusoft BarcodeXpress보다 라이선스 취득이 더 쉬운가요?

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

IronBarcode는 Accusoft BarcodeXpress가 지원하는 모든 바코드 형식을 지원하나요?

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

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

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

IronBarcode는 Accusoft BarcodeXpress와 비교하여 일괄 처리를 어떻게 처리하나요?

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 인스톨러나 런타임 파일은 필요하지 않습니다.

Accusoft BarcodeXpress와 달리 구매 전에 IronBarcode를 평가할 수 있나요?

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

Accusoft BarcodeXpress와 IronBarcode의 가격 차이는 무엇인가요?

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

Accusoft 바코드익스프레스에서 아이언바코드로 마이그레이션하는 것은 간단합니까?

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

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

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

커티스 차우
기술 문서 작성자

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

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

아이언 서포트 팀

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