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

C#에서 QR 코드에 로고를 추가하고 사용자 지정하는 방법

Accusoft BarcodeXpress에서 IronBarcode로의 마이그레이션

이번 마이그레이션 작업의 대부분은 삭제 작업입니다. 2-키 라이선스 시스템 — SetSolutionName, SetSolutionKey, 및 SetOEMLicenseKey 런타임 — 완전히 사라집니다. 실제 바코드 작업(이미지 읽기, 파일에 바코드 쓰기)는IronBarcode등가로 더 짧게 변환됩니다. 코드베이스에 BarcodeXpress를 감싸는 BarcodeService 클래스가 있다면, 라이선스 코드는 종종 그 일부분을 차지합니다. 마이그레이션 후, 해당 클래스는 줄어듭니다.

Accusoft BarcodeXpress에서 마이그레이션해야 하는 이유는 무엇일까요?

BarcodeXpress에서 마이그레이션하는 팀들이 보고하는 주요 원인은 다음과 같습니다.

평가 모드가 정확한 벤치마킹을 방해합니다: 유효한 OEM/런타임 키가 없으면, BarcodeXpress는 해석된 결과에 "UNLICENSED accusoft.com" 문자열을 붙이고, 생성된 2D 바코드에도 동일한 도장을 적용합니다. 실제 문서에 대해 사전 구매 정확성 테스트를 수행하면 이러한 워터마크된 출력이 발생하므로, 구매 전에 라이브러리가 실제 스캔 유형을 올바르게 읽는지 확인할 수 없습니다.

2-키 라이선스가 운영 오버헤드를 증가시킴: BarcodeXpress는 SDK 라이선스(SetSolutionName + SetSolutionKey)와 OEM/런타임 라이선스(SetOEMLicenseKey)를 분리합니다. CI/CD 파이프라인, Docker 컨테이너 및 컨테이너 오케스트레이터는 각각 별도의 비밀 키로 관리되는 두 가지 핵심 시스템을 모두 필요로 합니다. 누락되거나 잘못된 런타임 키는 오류를 발생시키기보다는 워터마크된 출력으로 대체되어 자동 테스트에서 실패 모드가 통과할 수 있게끔 하며, 이는 비널(null)이 아닌 결과에만 확인하는 경우 문제가 될 수 있습니다.

모든 프로덕션 환경에 배포하려면 최소 5개의 런타임 라이선스가 필요합니다. 단일 서버 배포의 경우에도 최소 5개의 런타임 라이선스를 구매해야 합니다. 프로덕션 서버 1대와 스테이징 서버 1대를 운영하는 팀은 실제 사용량과 관계없이 최소 10개의 런타임 라이선스 비용을 지불해야 합니다.

표준 버전의 최대 처리 속도는 분당 40페이지입니다. 그 속도로 10만 건의 문서를 처리하는 데는 대략 41시간이 걸립니다. 사용 제한을 해제하려면 Professional 에디션으로 업그레이드해야 하며, 이는 이미 구매한 런타임 라이선스 비용 외에도 개발자당 더 높은 좌석 비용을 발생시킵니다.

PDF를 기본적으로 지원하지 않습니다. BarcodeXpress에서 PDF 파일을 읽으려면 별도의 라이브러리를 사용하여 이미지로 변환해야 합니다. 이러한 외부 종속성으로 인해 두 번째 라이선스 비용이 발생하고, 변환 단계가 추가되며, 렌더링된 페이지 이미지를 저장하는 데 필요한 메모리 용량이 늘어납니다.

스레드 안전성은 인스턴스 격리를 요구함: BarcodeXpress의 reader 객체는 상태를 가지며 동시에 접근하는 것이 안전하지 않습니다. 병렬 배치 처리는 각 스레드마다 완전 초기화된 BarcodeXpress 인스턴스를 필요로 하며, 각 스레드 컨텍스트에서 2-계층 라이선스 초기화가 반복됩니다.

근본적인 문제

BarcodeXpress는 멀티-스텝 초기화, 비트맵 로드, 및 바코드를 읽기 전에 BarcodeType[] 구성을 요구합니다:

using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");

barcodeXpress.reader.BarcodeTypes = new[]
{
    BarcodeType.Code128Barcode,
    BarcodeType.DataMatrixBarcode,
    BarcodeType.QRCodeBarcode
};

Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");

barcodeXpress.reader.BarcodeTypes = new[]
{
    BarcodeType.Code128Barcode,
    BarcodeType.DataMatrixBarcode,
    BarcodeType.QRCodeBarcode
};

Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk

Using bitmap As New Bitmap(imagePath)
    Dim barcodeXpress = New BarcodeXpress(".")
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
    barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")

    barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    }

    Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
    Dim value = results.FirstOrDefault()?.BarcodeValue
End Using
$vbLabelText   $csharpLabel

IronBarcode 이 전체 블록을 단일 정적 호출로 대체합니다.

var value = BarcodeReader.Read(imagePath).First().Value;
var value = BarcodeReader.Read(imagePath).First().Value;
Dim value = BarcodeReader.Read(imagePath).First().Value
$vbLabelText   $csharpLabel

IronBarcode와 Accusoft BarcodeXpress의 기능 비교

기능 Accusoft 바코드 익스프레스 IronBarcode
라이선스 모델 SDK 키 + OEM/런타임 키 (별도 구매) 단일 영구 키
최소 런타임 라이선스 5개 (서버 1개 기준) 런타임 라이선스 개념 없음
평가 모드 해석된 값 및 생성된 2D 바코드에 "UNLICENSED accusoft.com" 도장 전체 값이 반환됩니다. 생성된 출력물에만 워터마크 표시
처리량 제한 40 PPM (표준판) 어떤 등급에서도 제한 없음
형식 자동 감지 수동 — BarcodeType[] 배열을 BarcodeTypes에 할당해야 함 지원되는 모든 형식에서 자동으로 처리됩니다.
PDF 지원 외부 라이브러리가 페이지를 Bitmaps로 렌더링하는 것이 필요함 네이티브 — BarcodeReader.Read("doc.pdf")
API 스타일 인스턴스 기반; Bitmap 입력; 속성/메소드 설정 정적 팩토리 메서드, 플루언트 API
스레드 안전성 스레드당 인스턴스 필요 상태비저 static 메소드 — 스레드 안전
Docker 라이선스 구성 라이선스 파일 마운트 또는 라이선스 서버 단일 환경 변수
CI/CD 비밀 키가 필요합니다 SDK 키 쌍 + OEM/런타임 키 하나의 비밀
.NET Framework / .NET Core 별도 패키지: Accusoft.BarcodeXpress.NetAccusoft.BarcodeXpress.NetCore 단일 IronBarcode 패키지 (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5–8)
리눅스/macOS 예 (.NetCore 패키지를 통해) 예 — Windows x64/x86, Linux x64, macOS x64/ARM
로고가 포함된 QR 코드 수동 GDI+ 오버레이 필요 AddBrandLogo("logo.png") 내장
가격 진입점 $1,960+ SDK + 최소 5개의 런타임 라이선스 749달러 영구 라이선스 (Lite, 개발자 1명)
영구 라이선스 기본 사양이 아닙니다. 판매 담당자에게 문의하십시오. 네, 모든 등급이요.

빠른 시작: Accusoft BarcodeXpress에서IronBarcode로 마이그레이션

1단계: NuGet 패키지 교체

dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
SHELL

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

// Remove
using Accusoft.BarcodeXpressSdk;

// Add
using IronBarCode;
// Remove
using Accusoft.BarcodeXpressSdk;

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

단계 3: 라이선스 초기화

애플리케이션 시작 시 Program.cs, Startup.cs, 또는 의존성 주입 구성에 한번 라이선스 초기화를 추가하세요:

// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

실제 운영 환경에서는 환경 변수 또는 비밀 관리자에서 키를 읽어오세요.

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

SetSolutionKey 없음, SetOEMLicenseKey 없음, 서버별 런타임 활성화 없음. 이것으로 라이선스 설정이 완료되었습니다.

코드 마이그레이션 예제

라이선스 초기화

BarcodeXpress 접근 방식:

using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        // Constructor takes the path containing the Barcode Xpress runtime files.
        _barcodeXpress = new BarcodeXpress(".");

        // SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // OEM/runtime license — separate purchase, minimum 5 licenses required.
        // Without this call, decoded values and generated 2D barcodes are
        // stamped with " UNLICENSED accusoft.com ".
        _barcodeXpress.Licensing.SetOEMLicenseKey(
            "2.0.OEMLicenseStringFromAccusoft...");
    }
}
using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        // Constructor takes the path containing the Barcode Xpress runtime files.
        _barcodeXpress = new BarcodeXpress(".");

        // SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // OEM/runtime license — separate purchase, minimum 5 licenses required.
        // Without this call, decoded values and generated 2D barcodes are
        // stamped with " UNLICENSED accusoft.com ".
        _barcodeXpress.Licensing.SetOEMLicenseKey(
            "2.0.OEMLicenseStringFromAccusoft...");
    }
}
Imports Accusoft.BarcodeXpressSdk

Public Class BarcodeService
    Private ReadOnly _barcodeXpress As BarcodeXpress

    Public Sub New()
        ' Constructor takes the path containing the Barcode Xpress runtime files.
        _barcodeXpress = New BarcodeXpress(".")

        ' SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)

        ' OEM/runtime license — separate purchase, minimum 5 licenses required.
        ' Without this call, decoded values and generated 2D barcodes are
        ' stamped with " UNLICENSED accusoft.com ".
        _barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");

// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
    // Ready to use — no initialization needed
}
using IronBarCode;

// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");

// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
    // Ready to use — no initialization needed
}
Imports IronBarCode

' In Program.vb
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")

' BarcodeService no longer needs a constructor or any license management
Public Class BarcodeService
    ' Ready to use — no initialization needed
End Class
$vbLabelText   $csharpLabel

BarcodeXpress 생성자는 단지 두 개의 라이선스 키 시스템과 런타임 경로를 관리하기 위해 존재합니다. IronBarcode는 애플리케이션 시작 시 한 줄로 교체합니다. BarcodeService 클래스는 생성자가 전혀 필요하지 않습니다.

바코드 읽기

BarcodeXpress 접근 방식:

using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public string ReadFirstBarcode(string imagePath)
{
    // Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
    using var bitmap = new Bitmap(imagePath);

    _barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = _barcodeXpress.reader.Analyze(bitmap);

    return results.FirstOrDefault()?.BarcodeValue;
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public string ReadFirstBarcode(string imagePath)
{
    // Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
    using var bitmap = new Bitmap(imagePath);

    _barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = _barcodeXpress.reader.Analyze(bitmap);

    return results.FirstOrDefault()?.BarcodeValue;
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk

Public Function ReadFirstBarcode(imagePath As String) As String
    ' Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
    Using bitmap As New Bitmap(imagePath)
        _barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
            BarcodeType.Code128Barcode,
            BarcodeType.DataMatrixBarcode,
            BarcodeType.QRCodeBarcode
        }

        Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)

        Return results.FirstOrDefault()?.BarcodeValue
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

public string ReadFirstBarcode(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.First().Value;
}
using IronBarCode;

public string ReadFirstBarcode(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.First().Value;
}
Imports IronBarCode

Public Function ReadFirstBarcode(imagePath As String) As String
    Dim results = BarcodeReader.Read(imagePath)
    Return results.First().Value
End Function
$vbLabelText   $csharpLabel

BarcodeTypes 배열 필터와 new Bitmap(...) 로드 스텝 모두 사라집니다. IronBarcode는 모든 지원된 심볼로지에 걸쳐 형식을 자동으로 감지하고 파일 경로를 직접 허용합니다. 공급업체가 Code 128에서 DataMatrix로 전환하더라도IronBarcode코드 변경 없이 계속 작동합니다. 결과 속성 이름도 변경됩니다: BarcodeValueValue가 되고, BarcodeTypeFormat가 됩니다. 솔루션 전체에 적용되는 검색 및 바꾸기 기능은 이름 변경을 모두 처리합니다.

하나의 이미지에서 여러 개의 바코드를 읽는 방법

BarcodeXpress 접근 방식:

using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
    using var bitmap = new Bitmap(imagePath);
    _barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = _barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue).ToList();
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
    using var bitmap = new Bitmap(imagePath);
    _barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = _barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue).ToList();
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk

Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
    Using bitmap As New Bitmap(imagePath)
        _barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        }

        Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
        Return results.Select(Function(r) r.BarcodeValue).ToList()
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
    var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
    var results = BarcodeReader.Read(imagePath, options);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
    var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
    var results = BarcodeReader.Read(imagePath, options);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
    Dim options As New BarcodeReaderOptions With {.ExpectMultipleBarcodes = True}
    Dim results = BarcodeReader.Read(imagePath, options)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel

ExpectMultipleBarcodes는 IronBarcode에게 첫 번째 매칭 후에도 스캔을 계속할 것을 지시합니다. 이는 다른 지역에 여러 코드가 있는 문서에 유용합니다. 읽기 옵션에 대한 자세한 내용은 IronBarcode 읽기 설명서를 참조하십시오.

일괄 처리

BarcodeXpress는 인스턴스 기반이며, 그 reader 객체는 상태를 가지므로, 병렬 배치 처리는 각 스레드마다 인스턴스를 필요한데, 각 스레드에서 2-계층 라이선스 초기화가 반복되어야 합니다. IronBarcode의 정적 메소드는 상태가 없으므로, Parallel.ForEach는 인스턴스 관리를 필요로 하지 않습니다.

BarcodeXpress 접근 방식:

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

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

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);
        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

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

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

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

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);
        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

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

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

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
        Using bitmap As New Bitmap(path)
            _barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
                BarcodeType.Code128Barcode,
                BarcodeType.QRCodeBarcode
            }

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

    Return results
End Function
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

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

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

    Parallel.ForEach(imagePaths, file =>
    {
        var r = BarcodeReader.Read(file);
        var first = r.FirstOrDefault();
        if (first != null)
            results[file] = first.Value;
    });

    return new Dictionary<string, string>(results);
}
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

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

    Parallel.ForEach(imagePaths, file =>
    {
        var r = BarcodeReader.Read(file);
        var first = r.FirstOrDefault();
        if (first != null)
            results[file] = first.Value;
    });

    return new Dictionary<string, string>(results);
}
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

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

    Parallel.ForEach(imagePaths, Sub(file)
        Dim r = BarcodeReader.Read(file)
        Dim first = r.FirstOrDefault()
        If first IsNot Nothing Then
            results(file) = first.Value
        End If
    End Sub)

    Return New Dictionary(Of String, String)(results)
End Function
$vbLabelText   $csharpLabel

BarcodeXpress Standard Edition의 분당 40페이지 제한 때문에 40페이지 그룹 사이에 대기 시간을 두거나, 분당 카운터를 추적하거나, 지연 시간을 추가하는 등의 속도 제한 처리 코드를 추가했다면, 해당 코드를 완전히 제거하십시오.IronBarcode처리량에 제한이 없습니다.

PDF 지원 추가

BarcodeXpress는 PDF 파일에서 바코드를 직접 읽지 않습니다. 일반적인 해결 방법은 별도의 PDF 렌더링 라이브러리를 추가하고, 각 페이지를 메모리에 이미지로 렌더링한 다음, 해당 이미지를 바코드 판독기에 하나씩 전달하는 것입니다.

BarcodeXpress 접근 방식:

// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
    using (pageBitmap)
    {
        _barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
        Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
        // ... collect results
    }
}
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
    using (pageBitmap)
    {
        _barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
        Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
        // ... collect results
    }
}
Imports System
Imports System.Drawing

' Requires a separate PDF library (not shown — varies by team choice)
' Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
For Each pageBitmap As Bitmap In pdfRenderer.RenderPages("document.pdf")
    Using pageBitmap
        _barcodeXpress.reader.BarcodeTypes = [Enum].GetValues(GetType(BarcodeType))
        Dim barcodes As Result() = _barcodeXpress.reader.Analyze(pageBitmap)
        ' ... collect results
    End Using
Next
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");

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

// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");

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

' One call — no rendering step, no external dependency
Dim results = BarcodeReader.Read("document.pdf")

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

Aspose.PDF, PdfiumViewer, itext7 또는 다른 PDF 라이브러리가 BarcodeXpress 읽기 워크플로를 지원하기 위해 추가되었다면, 마이그레이션 후 제거할 수 있습니다. IronBarcode PDF 읽기 가이드를 참조하여 페이지 범위 선택을 포함한 추가 옵션을 얻으십시오.

바코드 생성

BarcodeXpress 접근 방식:

using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public void GenerateBarcode(string data, string outputPath)
{
    _barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
    _barcodeXpress.writer.BarcodeValue = data;

    // CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
    using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
    bitmap.Save(outputPath);
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;

public void GenerateBarcode(string data, string outputPath)
{
    _barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
    _barcodeXpress.writer.BarcodeValue = data;

    // CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
    using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
    bitmap.Save(outputPath);
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk

Public Sub GenerateBarcode(data As String, outputPath As String)
    _barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode
    _barcodeXpress.writer.BarcodeValue = data

    ' CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
    Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
        bitmap.Save(outputPath)
    End Using
End Sub
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

public void GenerateBarcode(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(400, 100)
        .SaveAsPng(outputPath);
}
using IronBarCode;

public void GenerateBarcode(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(400, 100)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub GenerateBarcode(data As String, outputPath As String)
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(400, 100) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

유창한 체인은 속성 할당, CreateBitmap 호출, 그리고 Bitmap.Save 스텝을 대체합니다. 데이터베이스에 저장하거나 API에서 반환하기 위해 이진 데이터로 바코드를 얻으려면:

byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ToPngBinaryData();
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ToPngBinaryData();
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128).ToPngBinaryData()
$vbLabelText   $csharpLabel

QR 코드 생성

BarcodeXpress 접근 방식:

_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;

using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;

using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
Imports System.Drawing

_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode
_barcodeXpress.writer.BarcodeValue = data

Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
    bitmap.Save("qr.png")
    ' Logo overlay required manual GDI+ drawing on the returned Bitmap
End Using
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;
using IronSoftware.Drawing;

// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (for logo overlays)
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;

// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (for logo overlays)
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

' Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .SaveAsPng("qr.png")

' With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (for logo overlays)
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

로고 삽입, 오류 수정 수준 및 색상 사용자 지정은 모두 Fluent API에 내장되어 있습니다. BarcodeXpress는 이러한 기능을 사용하려면 초기 파일 작성 후 수동으로 GDI+ 도면을 그려야 합니다. 더 많은 QR 코드 옵션에 대해서는 QR 코드 생성 가이드를 참조하십시오.

Accusoft 바코드 익스프레스API와IronBarcode매핑 참조

Accusoft 바코드 익스프레스 IronBarcode
new BarcodeXpress(".") 정적 메서드 - 인스턴스가 필요하지 않습니다.
Licensing.SetSolutionName("...") IronBarCode.License.LicenseKey = "key"
Licensing.SetSolutionKey(a, b, c, d) (removed — not needed)
Licensing.SetOEMLicenseKey(string) (removed — no OEM/runtime key concept)
new Bitmap(path) + reader.Analyze(bitmap) BarcodeReader.Read(path)
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } (removed — auto-detection handles all formats)
result.BarcodeValue result.Value
result.BarcodeType result.Format
writer.BarcodeType = BarcodeType.Code128Barcode BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
writer.BarcodeValue = "data" (first argument to CreateBarcode)
writer.CreateBitmap() + bitmap.Save(path) .SaveAsPng(path)
writer.BarcodeType = BarcodeType.QRCodeBarcode QRCodeWriter.CreateQrCode(data, size)
40 PPM 표준 한계치 어떤 등급에서도 처리량 제한이 없습니다.

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

문제 1: 속성 이름 컴파일 오류

BarcodeXpress: 결과 객체는 IronBarcode에는 없는 BarcodeValueBarcodeType을 노출합니다.

해결 방법: 빌드하기 전에 솔루션 전체에서 찾기 및 바꾸기를 실행합니다.

grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
SHELL

모든 파일에서 result.BarcodeValueresult.Value로, result.BarcodeTyperesult.Format로 교체하세요.

문제 2: 고립된 라이선스 구성 호출

BarcodeXpress: SetSolutionName, SetSolutionKey, 및 SetOEMLicenseKey 호출 — 디코딩된 출력에서 " UNLICENSED accusoft.com " 워터마크를 감지하는 사용자 정의 assertions이 있는 경우 — 많은 코드베이스에서 워터마크가 있는 출력 실패 모드를 방어하기 위해 존재합니다.

해결책: 모든 호출 위치를 찾아서 삭제하십시오 — IronBarcode에는 해당 상태가 없습니다. 라이선스 키가 유효하지 않으면, 시험 제한이 적용되며 개별 해독된 값을 약화시키기보다는 균일하게 적용됩니다:

grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
SHELL

이러한 통화 사이트는 모두 삭제할 수 있습니다.

문제 3: Docker 라이선스 파일을 환경 변수에 마운트하는 방법

BarcodeXpress: Docker 배포는 통상적으로 BarcodeXpress 라이선스 구성 파일을 COPY 이나 볼륨 마운트 명령을 사용하여 컨테이너에 알려진 경로로 마운트합니다.

해결 방법: 설정 파일 복사본을 제거하고 환경 변수로 대체하십시오.

# Remove this
COPY accusoft-license.lic /app/license/

# Add this
ENV IRONBARCODE_LICENSE=YOUR-LICENSE-KEY

애플리케이션 시작 시:

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

Kubernetes에서 라이선스 키는 Pod 사양의 비밀 참조가 됩니다.

env:
  - name: IRONBARCODE_LICENSE
    valueFrom:
      secretKeyRef:
        name: ironbarcode-secrets
        key: license-key
env:
  - name: IRONBARCODE_LICENSE
    valueFrom:
      secretKeyRef:
        name: ironbarcode-secrets
        key: license-key
YAML

문제 4: 속도 제한 처리 코드

BarcodeXpress: 표준 에디션의 분당 40건(PPM) 처리량 제한 내에서 대량 배치를 처리하는 팀은 종종 문서 그룹 사이에 대기 시간을 추가하거나, 분당 처리량을 추적하거나, 지연 시간을 도입하여 제한을 준수했습니다.

해결 방법: 모든 속도 제한 코드를 제거하십시오. 다음 방법을 사용하여 찾으세요:

grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
SHELL

IronBarcode 처리량 제한이 없습니다. 인프라가 지원하는 속도로 처리하십시오.

이슈 5: 스레드 안전성 — 인스턴스 풀 제거

BarcodeXpress: 동시 처리를 지원하는 코드베이스는 종종 BarcodeXpress 인스턴스를 유지하거나 스레드당 상태 저장 리더를 격리하기 위해 ThreadLocal<BarcodeXpress> 패턴을 사용합니다.

해결책: 풀링 로직을 완전히 제거합니다. IronBarcode의 BarcodeReader.ReadBarcodeWriter.CreateBarcode는 상태가 없는 정적 메소드입니다. 여러 스레드에서 동시에 호출하더라도 서로 간섭하지 않습니다.

Accusoft 바코드 익스프레스마이그레이션 체크리스트

이동 전 작업

코드 변경을 하기 전에 코드베이스를 감사하여 BarcodeXpress 사용 사례를 모두 파악하십시오.

grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
SHELL
  • BarcodeTypes 할당에 명시적으로 나열된 바코드 형식을 주목하세요 — 이는 모두 IronBarcode에서 자동 감지됩니다.
  • 제거할 수 있는 속도 제한 처리 코드를 모두 식별하십시오.
  • BarcodeXpress 읽기를 지원하기 위해 추가된 PDF 렌더링 라이브러리를 식별하고 제거할 수 있습니다. -IronBarcode라이선스 키를 발급받아 비밀 관리자에 추가하세요.

코드 업데이트 작업

  1. 모든 Accusoft.BarcodeXpress.NetCore 파일에서 .csproj을 제거하세요.
  2. 바코드 기능이 필요한 모든 IronBarcode 파일에 추가하세요.
  3. 모든 파일에서 using Accusoft.BarcodeXpressSdk;using IronBarCode;로 교체하세요.
  4. 애플리케이션 시작에 IronBarCode.License.LicenseKey = ...을 추가하세요.
  5. 모든 BarcodeXpress 생성자 호출 및 인스턴스 필드를 삭제하세요.
  6. 모든 SetSolutionName, SetSolutionKey, 및 SetOEMLicenseKey 호출을 삭제하세요.
  7. 해독된 출력에서 'UNLICENSED accusoft.com' 워터마크를 스캔하는 모든 사용자 정의 확인 삭제
  8. new Bitmap(path) + reader.Analyze(bitmap)BarcodeReader.Read(path)로 교체하세요.
  9. 모든 reader.BarcodeTypes = ... 할당을 제거하세요.
  10. result.BarcodeValueresult.Value로 교체하세요.
  11. result.BarcodeTyperesult.Format로 교체하세요.
  12. writer.CreateBitmap() + bitmap.Save(path)BarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path)로 교체하세요.
  13. 속도 제한 스로틀링 코드 제거
  14. PDF 렌더링 중간 코드가 있는 경우 제거합니다.
  15. BarcodeXpress 인스턴스를 위한 인스턴스 풀링 또는 ThreadLocal 패턴을 제거하세요.
  16. Dockerfile 및 docker-compose 파일에서 라이선스 파일 마운트를 제거합니다.
  17. Docker 및 컨테이너 구성에 IRONBARCODE_LICENSE 환경 변수를 추가하세요.
  18. Kubernetes 시크릿 및 Pod 사양 업데이트
  19. CI/CD 파이프라인 비밀을 업데이트하세요 — ACCUSOFT_SOLUTION_KEYACCUSOFT_RUNTIME_KEY를 제거하세요; IRONBARCODE_LICENSE를 추가하세요.

마이그레이션 후 테스트

  • 솔루션을 빌드하고, 이름 변경으로 인해 발생한 컴파일 오류를 수정합니다.
  • 모든 바코드 읽기 작업에 대해 단위 테스트를 실행합니다.
  • 모든 바코드 생성 작업에 대해 단위 테스트를 실행합니다.
  • 가능한 경우 PDF 입력으로 테스트하십시오.
  • 일괄 처리 테스트를 실행하여 처리량 제한 현상이 발생하지 않는지 확인합니다.
  • 스테이징 환경에 배포하고 환경 변수에서 라이선스 키가 올바르게 인식되는지 확인합니다.

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

두-키 라이선스 복잡성 제거: SetSolutionName, SetSolutionKey, 및 SetOEMLicenseKey 설정이 완전히 사라집니다. 하나의 키가 개발부터 프로덕션까지의 모든 환경을 포괄하며, 시험 모드는 각 값을 'UNLICENSED accusoft.com'이라는 도장을 찍기보다는 전체 해석된 값을 반환하여 실제 문서에서 사전 구매 벤치마킹이 가능합니다.

런타임 라이선스 최소 구매 수량 없음: BarcodeXpress는 모든 프로덕션 배포에 최소 5개의 런타임 라이선스가 필요합니다.IronBarcode런타임 라이선스 개념이 없습니다. 단일 영구 키로 해당 등급 내에서 원하는 만큼의 프로덕션 배포가 가능합니다.

처리량 상한선 없음: 표준 버전의 40PPM 제한 및 해당 제한을 준수하도록 작성된 모든 속도 제한 코드를 제거할 수 있습니다.IronBarcode하드웨어 및 네트워크 지원 수준에 따라 처리 속도가 달라지며, 어떤 가격대에서도 소프트웨어적으로 속도 제한이 없습니다.

네이티브 PDF 읽기: BarcodeReader.Read("document.pdf")는 PDF 파일을 바로 처리하여 페이지 번호, 형식, 값, 신뢰 점수와 함께 페이지당 결과를 반환합니다. BarcodeXpress를 지원하기 위해 추가된 PDF 렌더링 라이브러리는 제거할 수 있으므로 종속성 및 라이선스 비용을 줄일 수 있습니다.

상태 없는 스레드 안전성: BarcodeReader.ReadBarcodeWriter.CreateBarcode는 상태가 없는 정적 메소드입니다. 인스턴스 풀, ThreadLocal 패턴, 및 스레드별 초기화 블록은 모두 제거될 수 있습니다. Parallel.ForEach로의 동시 처리는 스레드 작업 회피를 제거하는 것 외에는 구조적 변화를 필요로 하지 않습니다.

간소화된 컨테이너 배포: Docker 및 Kubernetes 배포는 라이선스 구성을 위해 단일 환경 변수를 사용합니다. 라이선스 파일 배포, 라이선스 서버 인프라 및 구성 파일 마운트가 모두 제거됩니다.

자주 묻는 질문

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

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

Accusoft BarcodeXpress API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?

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

Accusoft 바코드익스프레스에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?

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

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

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

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

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

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

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

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

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

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

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

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

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

Accusoft BarcodeXpress에서 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시간 온라인으로 운영합니다.
채팅
이메일
전화해