C#에서 데이터를 이용해 바코드를 생성하는 방법
리드툴즈 바코드에서 IronBarcode로의 마이그레이션
이 가이드는 .NET 개발자를 위한 리드툴즈 Barcode에서 IronBarcode로의 전체 마이그레이션 과정을 다룹니다. 리드툴즈 NuGet 패키지 및 하나의 네이티브 런타임 종속성 제거, 파일 기반 리드툴즈 라이선스 초기화 시퀀스를 문자열 키로 교체, 리드툴즈 읽기 및 쓰기 패턴을 IronBarcode의 정적 유창 API로 변환합니다. 모든 주요 마이그레이션 시나리오에 대한 코드 예제와 함께 API 매핑 표, 구조화된 체크리스트, 전환 중에 발생하는 문제에 대한 지침이 제공됩니다.
리드툴즈 바코드에서 마이그레이션해야 하는 이유는 무엇일까요?
파일 기반 라이선스 배포: 리드툴즈 라이선스는 응용 프로그램이 실행되는 모든 머신에서 디스크의 알려진 경로에 물리적으로 존재하는 .LIC 파일을 필요로 합니다. 개발자 워크스테이션, CI 빌드 에이전트, 스테이징 서버 및 프로덕션 컨테이너는 모두 애플리케이션이 초기화되기 전에 해당 파일을 프로비저닝해야 합니다. 이는 환경 변수, 시크릿 관리자 및 CI/CD 파이프라인 구성에 깔끔하게 통합되는 문자열 기반 시크릿과는 근본적으로 다른 운영 모델입니다. 배포 토폴로지에 새로운 환경(새로운 클라우드 지역, 새로운 Kubernetes 노드 풀, 새로운 개발자 온보딩 등)이 추가될 때마다 문자열 기반 라이선스에는 없는 파일 프로비저닝 단계가 필요합니다.
SDK 발자국: 리드툴즈 바코드 설치는 Leadtools.Barcode NuGet 패키지(이는 Leadtools, Leadtools.Codecs 및 관련 종속성을 가져옴)를 요구합니다. PDF 바코드 추출은 Leadtools.Pdf을 추가합니다. Windows에서 MSVC++ 2017 런타임은 별도의 네이티브 종속성입니다. 리드툴즈 바코드 애플리케이션의 출력 파일 크기는 약 148MB입니다. 바코드 읽기 또는 생성만 필요한 애플리케이션이라도 해당 기능 사용 여부와 관계없이 OCR 인프라, 포맷 코덱 아키텍처 및 문서 보기 기능과 같은 포괄적인 이미징 플랫폼의 모든 기능을 활용해야 합니다.
기존 API 설계: 리드툴즈 바코드 작업은 작업을 시작하기 전에 특정 순서대로 여러 객체를 구성해야 합니다. 바코드를 읽으려면 이미지를 로드하는 RasterCodecs 인스턴스와 이를 스캔하는 BarcodeEngine 인스턴스가 필요하며, 어떤 형식을 찾을지 선언하는 명시적인 BarcodeSymbology 배열이 필요합니다. 바코드를 생성하려면 BarcodeData 객체를 구성하고, 명시적인 픽셀 매개변수로 빈 RasterImage을 생성하고, FillCommand를 사용하여 배경 색으로 채우고, 바코드를 그 위에 작성한 후 RasterCodecs로 저장하는 과정이 필요합니다. 해당 API는 그 시대의 디자인 패턴을 반영합니다. IronBarcode는 파일 경로를 직접 인수로 받는 정적 메서드 호출을 통해 동일한 작업을 수행합니다.
가격 투명성: 리드툴즈 배포 라이선스는 리드툴즈 판매를 통해 별도로 견적되며 웹사이트에 게시되지 않습니다. 개발 시작 전에 완전한 비용을 알아야 하는 팀은 LEADTOOLS가 예산에 맞는지 확인하기 위해 판매와 상의해야 합니다. IronBarcode는 개발 및 배포를 함께 포함하는 영구적인 일회성 라이선스를 제공하며 별도의 생산 라이선스가 필요하지 않습니다.
근본적인 문제
LEADTOOLS 초기화 순서는 20줄 이상의 코드와 네 가지 검증 단계를 거쳐야 BarcodeEngine을 생성할 수 있습니다. IronBarcode는 전체 시퀀스를 단일 할당으로 대체합니다.
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;
RasterSupport.SetLicense(
@"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
"your-developer-key-here");
if (RasterSupport.KernelExpired)
throw new InvalidOperationException("LEADTOOLS license has expired");
if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
throw new InvalidOperationException("1D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
throw new InvalidOperationException("2D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
throw new InvalidOperationException("Barcode writing is locked");
var engine = new BarcodeEngine();
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;
RasterSupport.SetLicense(
@"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
"your-developer-key-here");
if (RasterSupport.KernelExpired)
throw new InvalidOperationException("LEADTOOLS license has expired");
if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
throw new InvalidOperationException("1D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
throw new InvalidOperationException("2D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
throw new InvalidOperationException("Barcode writing is locked");
var engine = new BarcodeEngine();
Imports Leadtools
Imports Leadtools.Barcode
' LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
RasterSupport.SetLicense("C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC", "your-developer-key-here")
If RasterSupport.KernelExpired Then
Throw New InvalidOperationException("LEADTOOLS license has expired")
End If
If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) Then
Throw New InvalidOperationException("1D barcode reading is locked")
End If
If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) Then
Throw New InvalidOperationException("2D barcode reading is locked")
End If
If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) Then
Throw New InvalidOperationException("Barcode writing is locked")
End If
Dim engine As New BarcodeEngine()
// IronBarcode: one line, no file required
using IronBarCode;
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// IronBarcode: one line, no file required
using IronBarCode;
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports IronBarCode
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
IronBarcode와 리드툴즈 바코드: 기능 비교
| 기능 | 리드툴즈 바코드 | IronBarcode |
|---|---|---|
| 라이선스 모델 | 파일 + 개발자 키 | 문자열 키만 |
| NuGet 패키지가 필요합니다. | 5세 이상 | 1 |
| 네이티브 런타임 종속성 | MSVC++ 2017 (윈도우) | None |
| 게시된 출력 크기 | 약 148MB | 약 39MB |
| 지원되는 전체 기호 체계 | 40세 이상 | 50세 이상 |
| 바코드 형식 자동 감지 | 제한적 | 예 |
| PDF 바코드 추출 | 별도 포장 필요 | 내장형 |
| 머신러닝 오류 수정 | 아니요 | 예 |
| QR 코드 로고 브랜딩 | 아니요 | 예 |
| Docker 배포 | 파일 마운트 필요 | 환경 변수 |
| 초기화 코드 | 20줄 이상 | 1줄 |
| API 스타일 | 레거시 객체 그래프 | 정적 유창함 |
| 크로스 플랫폼 | 부분적(네이티브 종속성) | 정식 버전 (.NET Standard) |
| 배포 라이선스 가격 | 영업 담당자에게 문의하세요 (공개되지 않음). | 영구 구매에 포함됨 |
빠른 시작: 리드툴즈 바코드에서 IronBarcode로 마이그레이션
1단계: 리드툴즈 포장재를 제거합니다.
프로젝트에서 모든 리드툴즈 패키지를 제거하십시오.
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
PDF 파일에서 바코드를 추출하기 위해 PDF 코덱이 추가된 경우:
dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
Windows Server 배포 환경에서는 마이그레이션이 완료된 후 프로비저닝 스크립트에서 MSVC++ 2017 런타임을 제거할 수 있습니다. IronBarcode는 어떤 플랫폼에서도 네이티브 런타임에 대한 종속성이 없습니다.
2단계: IronBarcode 설치
dotnet add package IronBarcode
dotnet add package IronBarcode
이 단일 패키지에는 모든 이미지 형식 지원, PDF 바코드 추출 기능, 머신러닝 오류 수정 기능, 그리고 50개 이상의 심볼 형식이 모두 포함되어 있습니다. 별도의 코덱 패키지는 필요하지 않습니다.
3단계: 라이선스 초기화
LEADTOOLS 초기화 블록을 한 줄로 보완하세요. 코드베이스에서 RasterSupport.SetLicense에 대한 호출을 모두 찾으세요 — 일반적으로 응용 프로그램 시작 시점에 딱 한 번 있습니다 — 그리고 주변 초기화 순서를 모두 바꾸세요.
// Before: entire 리드툴즈 initialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entire 리드툴즈 initialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
라이선스 키는 환경 변수, appsettings.json, Azure Key Vault, AWS Secrets Manager 또는 Kubernetes 비밀과 같은 문자열 저장 가능 구성 메커니즘에서 얻을 수 있습니다. 환경 기반 라이선스 구성, Docker 배포 패턴 및 지원되는 모든 구성 방식에 대한 자세한 내용은 라이선스 키 설정 문서를 참조하십시오.
코드 마이그레이션 예제
이미지에서 바코드 읽기
LEADTOOLS는 이미지 로딩과 바코드 스캔을 두 개의 별개의 객체 레이어로 분리합니다. RasterCodecs 인스턴스가 이미지 파일을 RasterImage에 로드하고, BarcodeEngine 인스턴스가 이를 스캔합니다. 호출자는 또한 명시적인 BarcodeSymbology 값 배열을 제공해야 합니다; 배열에 나열되지 않은 형식은 감지되지 않습니다.
LEADTOOLS 접근 방식:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
foreach (var barcode in barcodes)
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
foreach (var barcode in barcodes)
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim codecs As New RasterCodecs()
Using codecs
Dim image = codecs.Load("scan.png")
Using image
Dim engine As New BarcodeEngine()
Dim symbologies = New BarcodeSymbology() {
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
}
Dim barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies)
For Each barcode In barcodes
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}")
Next
End Using
End Using
IronBarcode 접근 방식:
using IronBarCode;
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
IronBarcode 파일 경로를 직접 받아 이미지를 내부적으로 로드하고, 호출자가 예상되는 형식을 열거할 필요 없이 50개 이상의 지원되는 심볼 체계에서 형식을 자동으로 감지합니다. 고급 구성(읽기 속도 조정, 다중 바코드 감지 및 저품질 이미지 처리)에 대해서는 이미지에서 바코드 읽기 가이드를 참조하십시오.
코드 128 바코드 생성
LEADTOOLS 생성을 위해서는 BarcodeData 객체를 구성하고, 명시적인 메모리 플래그, 픽셀 깊이 및 바이트 순서로 빈 RasterImage을 할당하고, 이미지를 배경 색으로 채운 다음, 바코드를 그 위에 작성하고, RasterCodecs로 저장해야 합니다. IronBarcode는 단일 플루언트 메서드 체인을 통해 이러한 모든 단계를 수행합니다.
LEADTOOLS 접근 방식:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData()
{
Symbology = BarcodeSymbology.Code128,
Value = "ITEM-98765",
Bounds = new LeadRect(0, 0, 500, 120)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData()
{
Symbology = BarcodeSymbology.Code128,
Value = "ITEM-98765",
Bounds = new LeadRect(0, 0, 500, 120)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim engine As New BarcodeEngine()
Dim barcodeData As New BarcodeData() With {
.Symbology = BarcodeSymbology.Code128,
.Value = "ITEM-98765",
.Bounds = New LeadRect(0, 0, 500, 120)
}
Using image As New RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
Nothing, IntPtr.Zero, 0)
Dim fillCommand As New FillCommand(RasterColor.White)
fillCommand.Run(image)
engine.Writer.WriteBarcode(image, barcodeData, Nothing)
Using codecs As New RasterCodecs()
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0)
End Using
End Using
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(500, 120)
.SaveAsPng("item-barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(500, 120)
.SaveAsPng("item-barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
.ResizeTo(500, 120) _
.SaveAsPng("item-barcode.png")
크기 조정, 스타일 지정, 여백 제어 및 지원되는 출력 형식에 대한 자세한 내용은 바코드 이미지 만들기 문서를 참조하세요.
로고 브랜딩이 포함된 QR 코드 생성
LEADTOOLS QR 코드 생성은 다른 바코드 유형과 동일한 다단계 RasterImage 구성 패턴을 따릅니다. IronBarcode는 QR 코드의 중앙에 로고를 삽입하기 위한 전용 AddBrandLogo 메소드를 함께 QRCodeWriter를 제공합니다.
LEADTOOLS 접근 방식:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var qrData = new BarcodeData()
{
Symbology = BarcodeSymbology.QR,
Value = "https://example.com/product/12345",
Bounds = new LeadRect(0, 0, 400, 400)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var qrData = new BarcodeData()
{
Symbology = BarcodeSymbology.QR,
Value = "https://example.com/product/12345",
Bounds = new LeadRect(0, 0, 400, 400)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim engine As New BarcodeEngine()
Dim qrData As New BarcodeData() With {
.Symbology = BarcodeSymbology.QR,
.Value = "https://example.com/product/12345",
.Bounds = New LeadRect(0, 0, 400, 400)
}
Using image As New RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
Nothing, IntPtr.Zero, 0)
Dim fillCommand As New FillCommand(RasterColor.White)
fillCommand.Run(image)
engine.Writer.WriteBarcode(image, qrData, Nothing)
Using codecs As New RasterCodecs()
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0)
End Using
End Using
IronBarcode 접근 방식:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("brand-logo.png")
.SaveAsPng("product-qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("brand-logo.png")
.SaveAsPng("product-qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("brand-logo.png") _
.SaveAsPng("product-qr.png")
PDF 문서에서 바코드 추출하기
LEADTOOLS PDF 바코드 추출은 별도의 Leadtools.Pdf 패키지, 명시적인 PDF 로딩 구성, 수동 페이지 수 쿼리 및 각 페이지 반복을 필요로 합니다. 각 페이지는 스캔 전에 RasterImage로 개별적으로 로드되어야 합니다. IronBarcode는 기본 패키지에 PDF 지원 기능을 포함하고 있으며 페이지 반복 처리를 내부적으로 수행합니다.
LEADTOOLS 접근 방식:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;
var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");
for (int page = 1; page <= pageCount; page++)
{
using var image = codecs.Load(
"shipment.pdf", 0,
CodecsLoadByteOrder.BgrOrGray,
page, page);
var barcodes = engine.Reader.ReadBarcodes(
image, LogicalRectangle.Empty, 0, null);
foreach (var barcode in barcodes)
results.Add($"Page {page}: {barcode.Value}");
}
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;
var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");
for (int page = 1; page <= pageCount; page++)
{
using var image = codecs.Load(
"shipment.pdf", 0,
CodecsLoadByteOrder.BgrOrGray,
page, page);
var barcodes = engine.Reader.ReadBarcodes(
image, LogicalRectangle.Empty, 0, null);
foreach (var barcode in barcodes)
results.Add($"Page {page}: {barcode.Value}");
}
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
' Requires: dotnet add package Leadtools.Pdf
Using codecs As New RasterCodecs()
codecs.Options.Pdf.Load.Resolution = 300
codecs.Options.Pdf.Load.DisplayDepth = 24
Dim engine As New BarcodeEngine()
Dim results As New List(Of String)()
Dim pageCount As Integer = codecs.GetTotalPages("shipment.pdf")
For page As Integer = 1 To pageCount
Using image = codecs.Load("shipment.pdf", 0, CodecsLoadByteOrder.BgrOrGray, page, page)
Dim barcodes = engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing)
For Each barcode In barcodes
results.Add($"Page {page}: {barcode.Value}")
Next
End Using
Next
End Using
IronBarcode 접근 방식:
using IronBarCode;
var results = BarcodeReader.Read("shipment.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("shipment.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("shipment.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
Docker 배포
LEADTOOLS Docker 배포를 정의하는 파일 관리 요구 사항은 IronBarcode로 마이그레이션하면 완전히 사라집니다.
LEADTOOLS 접근 방식:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
# License file must be physically present in the container image
COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC
ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
ENV LEADTOOLS_DEVELOPER_KEY=your-developer-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
IronBarcode 접근 방식:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
ENV IRONBARCODE_LICENSE=your-license-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
라이선스 키는 Docker 시크릿, Kubernetes 시크릿 또는 기타 환경 변수 메커니즘을 통해 컨테이너 런타임에 주입됩니다. 파일 프로비저닝 단계는 필요하지 않습니다. Docker 및 Linux 배포 가이드는 Alpine 및 Debian 기본 이미지, 다단계 빌드, Kubernetes 배포 패턴을 다룹니다.
리드툴즈 바코드 API와 IronBarcode 매핑 참조
| 리드툴즈 | IronBarcode | 노트 |
|---|---|---|
RasterSupport.SetLicense(path, key) |
IronBarCode.License.LicenseKey = "key" |
키만 제공됩니다 - 파일은 없습니다 |
RasterSupport.KernelExpired |
(removed) | 유효기간 확인이 필요 없습니다. |
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) |
(removed) | 모든 기능 포함 |
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) |
(removed) | 모든 기능 포함 |
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) |
(removed) | 모든 기능 포함 |
new BarcodeEngine() |
정적 — 인스턴스 없음 | BarcodeReader, BarcodeWriter은 정적입니다 |
new RasterCodecs() |
(removed) | 파일 경로를 직접 전달하세요 |
codecs.Load(imagePath) |
(removed) | 파일 경로를 직접 전달하세요 |
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) |
BarcodeReader.Read(imagePath) |
심볼을 자동으로 감지합니다. |
BarcodeData.Value |
result.Value |
동일한 속성 이름 |
BarcodeData.Symbology |
result.Format |
부동산 이름 변경됨 |
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
유창한 창작 |
BarcodeSymbology.Code128 |
BarcodeEncoding.Code128 |
네임스페이스 변경 |
BarcodeSymbology.QR |
BarcodeEncoding.QRCode |
이름 변경 |
BarcodeSymbology.DataMatrix |
BarcodeEncoding.DataMatrix |
같은 이름 |
BarcodeSymbology.PDF417 |
BarcodeEncoding.PDF417 |
같은 이름 |
BarcodeSymbology.EAN13 |
BarcodeEncoding.EAN13 |
같은 이름 |
BarcodeSymbology.UPCA |
BarcodeEncoding.UPCA |
같은 이름 |
BarcodeSymbology.Interleaved2of5 |
BarcodeEncoding.Interleaved2of5 |
같은 이름 |
BarcodeSymbology.Codabar |
BarcodeEncoding.Codabar |
같은 이름 |
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) |
.SaveAsPng(path) |
하나의 방법 체인 |
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) |
(removed) | IronBarcode 내부 |
일반적인 마이그레이션 문제와 해결책
문제 1: CI/CD 환경에서 .LIC 파일 참조
LEADTOOLS: 리드툴즈 응용 프로그램을 구축하거나 배포하는 CI/CD 파이프라인은 .LIC 파일을 준비해야 합니다 — 소스 제어에 체크인하거나, base64 비밀에서 디코딩하거나, 볼륨 인공물로 마운트하여 가능합니다. 애플리케이션을 실행하는 각 파이프라인 단계는 해당 파일에 접근할 수 있어야 합니다.
해결책: 파이프라인에서 모든 .LIC 파일 처리를 제거하세요. 문자열 비밀로 대체하세요:
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
해당 문자열 값은 다른 문자열 값 자격 증명과 함께 CI/CD 비밀 저장소에 저장됩니다. 파일 디코딩, 아티팩트 프로비저닝, 볼륨 구성이 필요하지 않습니다.
문제 2: Windows에서 MSVC++ 런타임 종속성 문제
LEADTOOLS: Windows Server 배포에는 호스트에 MSVC++ 2017 런타임이 설치되어 있어야 합니다. 리드툴즈 배포에 사용되는 프로비저닝 스크립트, 컨테이너 기반 이미지 및 Windows AMI에는 일반적으로 이 런타임을 설치하는 단계가 포함되어 있습니다.
해결 방법: 모든 Windows 프로비저닝 스크립트 및 컨테이너 이미지에서 MSVC++ 2017 런타임 설치 단계를 제거하십시오. IronBarcode는 네이티브 런타임에 대한 종속성이 없습니다. dotnet/aspnet 기본 이미지로 추가 런타임 패키지가 필요 없습니다.
문제 3: RasterSupportType 기능 잠금 검사
LEADTOOLS: 초기화 순서에는 RasterSupport.IsLocked()가 각 바코드 기능 - Barcodes1D, Barcodes2D, 및 BarcodeWrite에 대해 포함됩니다. 이러한 검사는 리드툴즈 아키텍처에서 라이선스 파일이 필요한 모든 기능을 포함하는지 확인하기 위해 요구되는 방어 코드입니다.
해결책: 모든 RasterSupport.IsLocked() 호출을 제거하세요. IronBarcode는 단일 라이선스에 모든 읽기 및 쓰기 기능을 포함합니다. 기능별 잠금 상태가 없으며 기능 검증 단계도 필요하지 않습니다.
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
' Remove these lines entirely:
' If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) ...
문제 4: 바코드 심볼 배열 제거
LEADTOOLS: engine.Reader.ReadBarcodes()에 대한 모든 호출은 명시적인 BarcodeSymbology[] 매개변수를 필요로 합니다. 배열에 나열되지 않은 심볼을 사용하는 바코드는 감지되지 않으므로 입력 문서에 새로운 바코드 유형이 도입될 때 감지되지 않는 오류가 발생할 수 있습니다.
해결 방법: 심볼 배열을 제거합니다. BarcodeReader.Read()는 지원되는 모든 형식을 자동으로 감지합니다. 알려진 형식 세트를 위한 성능 조정이 필요하면 BarcodeReaderOptions는 철저한 열거 없이 선택적 힌트를 제공합니다:
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
Imports System
' Optional: hint the reader for performance in format-known scenarios
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("scan.png", options)
리드툴즈 바코드 마이그레이션 체크리스트
이동 전 작업
변경 작업을 수행하기 전에 코드베이스 내의 모든 리드툴즈 사용 부분을 감사하십시오.
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
코드 변경을 시작하기 전에 초기화 블록의 개수와 위치, 읽기 호출 위치, 쓰기 호출 위치 및 Dockerfile 참조를 문서화하십시오.
코드 업데이트 작업
- 리드툴즈 NuGet 패키지 5개를 모두 제거합니다(PDF 코덱이 있는 경우 함께 제거).
dotnet add package IronBarcode를 통해IronBarcode를 설치하세요- 모든
using Leadtools.*네임스페이스 가져오기를using IronBarCode로 바꾸세요 - 전체
RasterSupport.SetLicense초기화 블록을IronBarCode.License.LicenseKey = "key"로 바꾸세요 - 모든
RasterSupport.KernelExpired체크를 제거하세요 - 모든
RasterSupport.IsLocked(RasterSupportType.*)체크를 제거하세요 - 모든
new BarcodeEngine()인스턴스화를 제거하세요 - 바코드 코드 경로에서 모든
new RasterCodecs()인스턴스화를 제거하세요 codecs.Load(path)+engine.Reader.ReadBarcodes(image, ...)을BarcodeReader.Read(path)로 대체하세요new BarcodeData(...)+new RasterImage(...)+FillCommand+WriteBarcode+codecs.Save()을BarcodeWriter.CreateBarcode(...).SaveAsPng(path)로 대체하세요BarcodeSymbology.*열거형 참조를BarcodeEncoding.*로 대체하세요 (참고:QR는QRCode로 바뀝니다)- 모든 Dockerfile에서
COPY LEADTOOLS.LIC라인을 제거하세요 - Dockerfile 및 배포 설정에서
LEADTOOLS_LICENSE_PATH및LEADTOOLS_DEVELOPER_KEY환경 변수 선언을 제거하세요 - Dockerfile과 비밀 구성에
IRONBARCODE_LICENSE환경 변수를 추가하세요 - Windows 프로비저닝 스크립트에서 MSVC++ 2017 런타임 설치를 제거합니다.
마이그레이션 후 테스트
- 모든 바코드 읽기 작업이 이전에
BarcodeSymbology[]배열로 포함된 모든 심볼 분류 유형에 대한 예상 값을 반환하는지 확인하세요 - Code 128, QR 코드 및 기타 생성된 바코드 유형이 유효하고 스캔 가능한 출력을 생성하는지 확인합니다.
Leadtools.Pdf없이 PDF 바코드 추출이 올바르게 작동하는지 확인하세요.LIC파일을 마운트하지 않고 컨테이너 이미지를 빌드하고 시작하여 응용 프로그램이 올바르게 초기화되는지 확인하세요.LIC파일 준비 단계 없이 CI/CD 파이프라인을 실행하고 모든 단계가 성공적으로 완료되는지 확인하세요- 게시된 출력 크기와 컨테이너 이미지 다운로드 시간이 개선되었는지 확인합니다.
IronBarcode로 마이그레이션할 때의 주요 이점
간소화된 배포 아키텍처: 마이그레이션 후 개발, CI, 스테이징, 프로덕션 등 모든 환경은 API 키, 데이터베이스 암호 및 기타 자격 증명에 사용되는 동일한 문자열 값 비밀 메커니즘을 통해 라이선스를 받습니다. 파일 프로비저닝, 아티팩트 처리, 볼륨 마운트가 필요하지 않습니다. 새로운 배포 환경을 추가하는 작업은 다른 비밀 키를 추가하는 작업과 동일합니다.
종속성 감소: 하나의 NuGet 패키지로 5개의 패키지가 대체되었으며, MSVC++ 2017 런타임 요구 사항이 제거되었습니다. 바코드 서비스의 공개 출력 파일 크기가 약 148MB에서 약 39MB로 줄어듭니다. 이미지 크기가 작아지면 컨테이너 다운로드 속도가 빨라지고, 컨테이너 레지스트리의 스토리지 비용이 절감되며, 서버리스 및 자동 확장 환경에서 콜드 스타트 시간이 단축됩니다.
간소화된 애플리케이션 시작: 기존 LEADTOOLS의 20줄에 달하는 초기화 시퀀스(파일 경로 확인, 만료 검증, 기능별 잠금 검사 3회)가 단 한 줄로 대체되었습니다. 애플리케이션 시작 속도가 향상되었으며, 초기화 코드 경로에 새로운 환경에서 발생할 수 있는 파일 시스템 종속성이 없어졌습니다.
포괄적인 형식 감지: IronBarcode는 호출자가 예상 형식을 지정할 필요 없이 50개 이상의 지원되는 모든 심볼을 읽습니다. 리드툴즈 BarcodeSymbology[] 배열에서 심볼 분류를 생략하여 발생하는 조용한 누락 읽기의 위험이 제거됩니다. 입력 문서에 새로운 바코드 유형이 나타나면 IronBarcode는 코드 변경 없이 이를 감지합니다.
예측 가능한 총 비용: 영구 라이선스 한 번 구매로 개발, 테스트 및 무제한 프로덕션 배포가 가능하며, 배포 추적, 연간 갱신 요구 사항, 별도의 프로덕션 라이선스 취득이 필요 없습니다. 팀은 영업 담당자와의 상담 없이 개발을 시작하기 전에 라이브러리의 전체 비용을 확인할 수 있습니다.
현대 API 설계: BarcodeReader.Read() 및 BarcodeWriter.CreateBarcode()은 파일 경로를 직접 수락하는 정적 진입점입니다. LEADTOOLS의 읽기 및 쓰기에 필요한 다층 객체 구성(코덱 인스턴스, 엔진 인스턴스, 이미지 할당, 배경 채우기)은 내부적으로 처리됩니다. 바코드를 읽고 생성하는 코드는 더 짧고, 검토하기 쉽고, 테스트하기도 쉽습니다.
자주 묻는 질문
리드툴즈 바코드에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
LEADTOOLS API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
리드툴즈 바코드에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션하는 동안 LEADTOOLS Barcode와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
IronBarcode는 리드툴즈 바코드와 비교했을 때 어떻게 Docker 배포를 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
LEADTOOLS에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
리드툴즈 바코드에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

