C#에서 이미지에서 바코드를 읽는 방법
Barcoder에서 IronBarcode로의 마이그레이션
이 가이드는 .NET 개발자를 위한 Barcoder에서IronBarcode로의 전체 마이그레이션 경로를 다룹니다. 마이그레이션은 두 패키지를 하나로 통합하고, 인코더-렌더러 파이프라인을 하나의 메서드 호출로 대체하며 모든 형식별 네임스페이스 임포트를 — using Barcoder.Code128, using Barcoder.Qr, using Barcoder.DataMatrix — 하나의 using IronBarCode; 으로 통합합니다. IBarcode 타입과 ImageRenderer / ImageRendererOptions 타입은 완전히 제거되었습니다. 읽기가 Barcoder와 함께 두 번째 라이브러리를 추가하게 만든 누락된 기능이었다면, IronBarcode는 BarcodeReader.Read()을 통해 본래적으로 읽기를 지원합니다.
바코드에서 마이그레이션해야 하는 이유
Barcoder에서 마이그레이션하는 팀들이 보고하는 주요 원인은 다음과 같습니다.
참고 사항 추가: Barcoder는 디코딩 기능이 없는 바코드 생성 전용 라이브러리입니다. 애플리케이션이 수신되는 바코드를 검증하거나, 스캔한 문서를 처리하거나, 업로드된 PDF에서 바코드를 읽어야 할 때, Barcoder는 이러한 작업을 수행할 수 있는 방법을 제공하지 않습니다. 읽기용 라이브러리를 하나 더 추가하면 코드베이스가 분할되어 NuGet 종속성이 두 개가 되고, 유지 관리해야 할 API도 두 개가 되며, 추적해야 할 버전 기록도 두 개가 됩니다.IronBarcode동일한 패키지를 통해 바코드 생성과 읽기를 모두 처리합니다.
.NET Framework 호환성 손상: Barcoder.Renderer.Image 이 .NET Framework 지원을 중단했습니다. .NET Framework 4.x에서 서비스 또는 데스크톱 애플리케이션을 실행하는 팀이 정기적인 종속성 유지 관리 중에 이미지 렌더러 패키지를 업데이트하면 빌드 오류가 발생합니다.IronBarCode.NET Framework 4.6.2부터 .NET 9까지 지원하며, 대상에 따라 조건부 패키징을 사용할 필요가 없습니다.
패키지 버전 드리프트: Barcoder 와 Barcoder.Renderer.Image 는 독립적으로 버전이 관리되는 NuGet 패키지입니다. 종속성 새로 고침 중에 둘 중 하나만 업데이트하면 호환성 문제가 발생할 수 있습니다. 여러 프로젝트가 있는 저장소에서 각 렌더러의 버전이 모든 프로젝트에서 일관되게 유지되도록 하는 것은 팀 규모가 커질수록 조정 부담이 커지는 문제입니다.
여러 형식이 추가되는 경우: Code128로 시작하여 나중에 QR 코드, DataMatrix를 추가하는 프로젝트는 새 네임스페이스를 가져오고 각 형식에 대해 서로 다른 메서드 매개변수를 가진 다른 인코더 클래스를 학습해야 합니다. IronBarcode는 BarcodeEncoding 열거형을 사용합니다 — 형식을 추가하는 것은 기존 호출에 한 단어의 변경입니다. 새로운 네임스페이스도, 새로운 클래스도, 메서드 시그니처도 변경되지 않았습니다.
MAUI 및 클라우드 배포 요구 사항: Barcoder는 MAUI, Docker, AWS Lambda 또는 Azure 배포에 대한 지원을 문서화하지 않습니다. 크로스 플랫폼 모바일 애플리케이션이나 서버리스 바코드 처리 파이프라인을 구축하는 팀은 Barcoder의 공식 지원 대상이 이러한 시나리오를 지원하지 않는다는 것을 알게 됩니다.
근본적인 문제
Barcoder는 형식 선택을 네임스페이스 가져오기와 연동시키고 모든 출력 작업에 대해 렌더러 파이프라인을 강제합니다. 형식이나 출력 유형을 변경하려면 코드의 구조를 수정해야 합니다.
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode 동일한 작업을 단일 연결된 호출로 표현합니다.
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
IronBarcode와 Barcoder의 기능 비교
| 기능 | 바코드 | IronBarcode |
|---|---|---|
| NuGet 패키지가 필요합니다. | 최소 2개 (바코더 + 바코드.렌더러.이미지) | 1 (IronBarcode) |
| 바코드 생성 | 예 | 예 |
| 바코드 판독/디코딩 | 아니요 | 예 |
| 형식별 인코더 클래스 | 네 — Code128Encoder, QrEncoder, DataMatrixEncoder 등 |
아니요 — BarcodeEncoding 열거형 |
| 형식별 네임스페이스 가져오기 | 네 — Barcoder.Code128, Barcoder.Qr, Barcoder.DataMatrix |
아니요 — using IronBarCode 만 |
| 결과 객체의 출력 메서드 | 아니요 — IBarcode 에는 저장 메서드가 없습니다 |
네 — GeneratedBarcode 에는 SaveAsPng, ToPngBinaryData, ToStream 가 있습니다 |
| PDF 읽기 | 아니요 | 네 — BarcodeReader.Read(path) |
| 로고가 포함된 QR 코드 | 아니요 | 네 — .AddBrandLogo(path) |
| .NET Framework 지원 | 이미지 렌더러에 드롭됨 | .NET Framework 4.6.2 이상 |
| .NET 9 지원 | 불분명/활동 제한적 | 예 |
| MAUI 지원 | 아니요 | 예 — iOS, Android, Windows, macOS |
| Docker / Azure / AWS Lambda | 문서화되지 않음 | 예 |
| 라이선스 | MIT (오픈 소스) | Commercial — Lite $999, Plus $1,499, Professional $2,999, Unlimited $5,999 |
| 읽기 속도 제어 | 아니요 | 네 — ReadingSpeed 열거형 |
| 다중 바코드 감지 | 아니요 | 네 — ExpectMultipleBarcodes 옵션 |
빠른 시작: Barcoder에서IronBarcode로 마이그레이션
1단계: NuGet 패키지 교체
프로젝트에서 모든 바코드 패키지를 제거하세요.
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
SVG 렌더러도 추가했다면:
dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
IronBarcode 설치하세요:
dotnet add package IronBarcode
dotnet add package IronBarcode
단계 2: 네임스페이스 업데이트
프로젝트의 모든 파일에서 using Barcoder.* 명령문을 모두 제거하세요:
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
이 모든 것을 하나의 using 지시문으로 바꾸세요:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
단계 3: 라이선스 초기화
애플리케이션 시작 시 라이선스 초기화 추가 — Program.cs, Startup.cs, 또는 MauiProgram.cs:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
ironsoftware.com 에서 무료 평가판 키를 다운로드할 수 있습니다.
코드 마이그레이션 예제
코드128 생성
바코드 기반 접근 방식:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode 접근 방식:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
Code128Encoder, ImageRenderer, ImageRendererOptions, 및 스트림 관리가 완전히 제거되었습니다. 형식은 통합된 BarcodeWriter 클래스의 BarcodeEncoding.Code128 로 지정됩니다. 출력 메서드는 반환된 GeneratedBarcode 객체에 직접 존재합니다. IronBarcode 바코드 생성 문서에는 스타일, 여백 및 색상 사용자 지정에 대한 내용이 포함되어 있습니다.
QR 코드 생성
바코드 기반 접근 방식:
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers
Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 4
})
Using stream = File.OpenWrite("qr.png")
renderer.Render(barcode, stream)
End Using
IronBarcode 접근 방식:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
CreateQrCode의 두 번째 매개변수는 픽셀 단위의 출력 차원입니다. 오류 수정 수준은 기본적으로 적절한 값으로 설정되며 필요한 경우 구성할 수 있습니다.IronBarcode Barcoder에서는 불가능한 작업, 즉 QR 코드 중앙에 브랜드 로고를 삽입하는 기능을 지원합니다.
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
데이터매트릭스 생성
바코드 기반 접근 방식:
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 5
})
Using stream As FileStream = File.OpenWrite("datamatrix.png")
renderer.Render(barcode, stream)
End Using
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
.SaveAsPng("datamatrix.png")
패턴은 Code128과 동일합니다 — 변경되는 것은 BarcodeEncoding 값뿐입니다. 새로운 네임스페이스를 가져오거나, 다른 클래스를 만들거나, 다른 메서드 시그니처를 사용하지 않았습니다.
출력 크기 제어
Barcoder는 바코드 모듈 크기에 대한 배율 배수로 PixelSize 를 사용하고 BarHeightFor1DBarcode 는 1D 높이에 사용합니다 — 너비/높이에 직접 접근하는 API가 없습니다.
바코드 기반 접근 방식:
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 3,
.BarHeightFor1DBarcode = 80
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
.ResizeTo(width, height) 은 명시적인 픽셀 차원을 사용합니다. 이것은 동일한 GeneratedBarcode 객체에서 다른 출력 메서드와 연결됩니다.
파일 대신 바이너리 데이터를 얻는 경우
바코드 기반 접근 방식:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2
})
Using ms As New MemoryStream()
renderer.Render(barcode, ms)
Dim pngBytes As Byte() = ms.ToArray()
End Using
IronBarcode 접근 방식:
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
MemoryStream 과 ToArray() 패턴이 GeneratedBarcode 에 대한 단일 체인 메서드 호출로 대체됩니다.
바코드 판독 (새로운 기능)
Barcoder에는 읽기 API가 없습니다. 이전에 읽기용으로 두 번째 라이브러리를 추가했다면 삭제할 수 있습니다.IronBarcode생성에 사용된 것과 동일한 패키지를 사용하여 파일, 바이트 배열, 스트림 및 PDF에서 데이터를 읽습니다.
IronBarcode 접근 방식:
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode
' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
Console.WriteLine(result.Value)
Next
' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
Dim streamResults = BarcodeReader.Read(fileStream)
End Using
IronBarcode 바코드 판독 관련 문서 에는 여러 페이지로 구성된 PDF, 관심 영역 판독 및 성능 조정 옵션이 포함되어 있습니다.
SVG 출력
바코드 기반 접근 방식:
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers
Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
svgRenderer.Render(barcode, stream)
End Using
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.SaveAsSvg("barcode.svg")
모든 SVG 렌더링 사이트가 마이그레이션되면 Barcoder.Renderer.Svg 패키지를 제거할 수 있습니다.
바코드 API와IronBarcode매핑 참조
| 바코드 | IronBarcode |
|---|---|
Code128Encoder.Encode("data", false) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
QrEncoder.Encode("data", ErrorCorrectionLevel.M) |
QRCodeWriter.CreateQrCode("data", 500) |
DataMatrixEncoder.Encode("data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new ImageRenderer(new ImageRendererOptions { ... }) |
필요 없음 |
renderer.Render(barcode, fileStream) |
.SaveAsPng(path) |
renderer.Render(barcode, memoryStream) + ms.ToArray() |
.ToPngBinaryData() |
IBarcode |
GeneratedBarcode |
PixelSize = 2, BarHeightFor1DBarcode = 50 |
.ResizeTo(width, height) |
SvgRenderer + renderer.Render(barcode, stream) |
.SaveAsSvg(path) |
| 읽기 API 없음 | BarcodeReader.Read(path / stream / bytes / pdf) |
2개의 패키지 — Barcoder + Barcoder.Renderer.Image |
1개의 패키지 — IronBarcode |
인코더당 형식 네임스페이스 (Barcoder.Code128, Barcoder.Qr 등) |
BarcodeEncoding 열거형, 단일 네임스페이스 |
일반적인 마이그레이션 문제와 해결책
문제 1: IBarcode에는 저장 메서드가 없습니다.
Barcoder: IBarcode 변수를 저장하고 나중에 렌더러에 전달하는 코드는 지연 렌더링 패턴을 따릅니다. IBarcode 을 받아 renderer.Render() 을 호출하는 모든 헬퍼 메서드는 리팩터링되어야 합니다.
해결책: IBarcode 타입 참조를 GeneratedBarcode 으로 변경하세요. GeneratedBarcode 객체는 자신의 출력 메서드를 가지고 있으며, 결과를 저장하거나 직렬화해야 하는 모든 메서드에 전달하세요:
//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")
Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
barcode.SaveAsPng(path)
End Sub
솔루션 전체에서 renderer.Render( 를 검색하여 모든 지연 렌더링 사이트를 찾을 수 있습니다.
문제 2: PixelSize에는 직접적인 대응값이 없습니다.
Barcoder: PixelSize 는 바코드의 자연 모듈 크기에 대한 배율 배수입니다. 출력 차원은 콘텐츠 길이, 형식, 배율 배수의 조합에 따라 달라집니다. BarHeightFor1DBarcode 는 1D 높이를 독립적으로 제어합니다. 너비/높이에 대한 직접적인 사양은 없습니다.
해결책: 기존 바코드 코드가 생성하는 실제 픽셀 출력을 측정하고 해당 값을 .ResizeTo(width, height) 에 전달하세요:
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.ResizeTo(300, 80) _
.SaveAsPng("barcode.png")
문제 3: 형식 네임스페이스 가져오기 누적
Barcoder: 프로젝트에서 사용되는 각 바코드 형식은 그것을 사용하는 각 파일에 using Barcoder.[Format] 지시문을 추가합니다. Code128, QR, DataMatrix를 사용하는 프로젝트에는 파일당 형식별로 세 가지 임포트가 있으며, using Barcoder 와 using Barcoder.Renderers 가 있습니다.
해결책: 모든 using Barcoder 명령문을 검색하여 모두 using IronBarCode; 으로 교체하세요:
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
모든 결과는 제거해야 할 줄이며, 파일당 단일 using IronBarCode; 지시문으로 대체됩니다.
문제 4: 패키지 버전 동기화 오류
Barcoder: Barcoder 또는 Barcoder.Renderer.Image 중 하나만 업데이트한 후 빌딩하면 두 패키지의 버전 조합이 호환되지 않을 수 있기 때문에 타입 해상도 오류가 발생할 수 있습니다.
해결책: 두 바코드 패키지를 모두 제거하고 IronBarcode 을 설치한 후, 단일 패키지 및 버전이 있습니다. 이 범주에서 패키지 잠금 충돌이 해결되었습니다. .csproj 파일에 단일 IronBarcode 참조만 포함되어 있고 남은 Barcoder.* 참조가 없는지 확인한 후 빌드하세요.
바코드 마이그레이션 체크리스트
이동 전 작업
변경 작업을 하기 전에 코드베이스를 감사하여 모든 바코드 사용 사례를 파악하십시오.
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
IBarcode 이 변수 형식으로 저장되거나 메서드 매개변수로 전달되는 모든 위치를 문서화하세요 — 이것들은 가장 주의가 필요한 지연 렌더링 사이트입니다. PixelSize 와 BarHeightFor1DBarcode 값을 모두 기록하고 해당하는 출력 차원을 측정하세요.
코드 업데이트 작업
- 모든 프로젝트에서
BarcoderNuGet 패키지 제거 - 모든 프로젝트에서
Barcoder.Renderer.ImageNuGet 패키지 제거 - 존재한다면
Barcoder.Renderer.SvgNuGet 패키지 제거 IronBarcodeNuGet Install-Package- 애플리케이션 시작 시
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";추가 - 모든
using Barcoder.*명령문을using IronBarCode;으로 교체 Code128Encoder.Encode(...)를BarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128)으로 교체QrEncoder.Encode(...)를QRCodeWriter.CreateQrCode(..., size)으로 교체DataMatrixEncoder.Encode(...)를BarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix)으로 교체- 모든
new ImageRenderer(new ImageRendererOptions {...})구성 요소 제거 GeneratedBarcode에서renderer.Render(barcode, fileStream)를.SaveAsPng(path)으로 교체 12.renderer.Render(barcode, memoryStream)+ms.ToArray()를.ToPngBinaryData()으로 교체SvgRenderer사용을.SaveAsSvg(path)으로 교체IBarcode타입 참조를GeneratedBarcode으로 변경PixelSize/BarHeightFor1DBarcode옵션을.ResizeTo(width, height)으로 교체
마이그레이션 후 테스트
- 생성된 각 바코드 형식이 표준 스캐너 또는IronBarcode자체 리더기를 사용하여 올바르게 스캔되는지 확인하십시오.
- 시각적 출력 차원을 마이그레이션 전 출력과 비교하세요 —
.ResizeTo()값이 동일한 크기를 생성함을 확인 - QR 코드 출력 결과를 휴대폰 스캐너로 테스트하여 오류 수정 수준이 적절한지 확인합니다.
- 프로젝트에서 SVG를 사용하는 경우 브라우저 및 인쇄 환경에서 SVG 출력이 올바르게 렌더링되는지 확인하십시오.
- 두 번째 읽기 라이브러리를 제거했다면, 동일한 입력에 대해
BarcodeReader.Read()이 동일한 디코딩된 값을 생성함을 확인하세요 - 프로젝트에서 PDF 문서를 처리하는 경우 PDF 읽기 테스트를 수행하여 여러 페이지로 구성된 PDF 파일이 모든 페이지를 올바르게 읽는지 확인하십시오.
- 모든
Barcoder.*참조가 남아 있지 않은 상태에서 빌드를 실행하세요 — 컴파일 오류는 마이그레이션되지 않은 사이트를 나타냅니다
IronBarcode로 마이그레이션할 때의 주요 이점
통합 패키지 종속성: 하나의 NuGet 패키지로 두 개(SVG 렌더러도 사용한 경우 세 개)의 패키지를 대체할 수 있습니다. 추적할 버전도 하나뿐이고, 모니터링할 변경 로그도 하나뿐이며, 종속성 업데이트 중에 패키지 간 호환성 문제도 발생하지 않습니다. .csproj 와 packages.lock.json 복잡성은 즉시 감소합니다.
네이티브 읽기 기능: 이전에는 바코드 읽기를 위해 별도의 라이브러리가 필요했던 애플리케이션이 이제IronBarcode하나로 통합될 수 있습니다. BarcodeReader.Read() 은 이미지 파일, 바이트 배열, 스트림, PDF를 동일한 API로 수락하며, 멀티 바코드 감지 및 읽기 속도 조정이 내장되어 있습니다.
구성으로서의 형식 선택: 기존 프로젝트에 새로운 바코드 형식을 추가하는 것은 기존 CreateBarcode 호출의 BarcodeEncoding 열거형 값에 한 단어의 변경입니다. 새로운 네임스페이스 가져오기, 새로운 인코더 클래스, 새로운 패키지가 없습니다. 이러한 특징 덕분에 제품 요구 사항이 변화함에 따라 포맷 확장이 수월해집니다.
명시적인 출력 차원: .ResizeTo(width, height) 은 명시적 픽셀 사양으로 간접적인 PixelSize 배수 시스템을 대체합니다. 코드와 출력 간의 관계는 바코드 내용 길이 또는 형식별 모듈 크기와 관계없이 직접적이고 예측 가능합니다.
확장된 플랫폼 지원 범위:IronBarCode.NET Framework 4.6.2부터 .NET 9까지 지원하며, iOS, Android, Windows 및 macOS용 MAUI 배포를 지원하고 Docker, AWS Lambda 및 Azure Functions에 대한 배포 방법도 문서화되어 있습니다. .NET Core를 넘어서 플랫폼 요구사항이 확장되는 팀은 Barcoder.Renderer.Imageに 영향을 미치는 프레임워크 지원 갭을 만나지 않을 것입니다.
활발한 유지 관리 및 향후 호환성:IronBarCode.NET 호환성 일정을 문서화하여 정기적으로 업데이트를 출시합니다. 활성 출시 주기는 라이브러리를 최신 .NET 버전과 정렬된 상태로 유지합니다. 이는 최근 출시 활동이 제한된 라이브러리에서는 보장되지 않습니다.
자주 묻는 질문
Barcoder에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
바코드 API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
Barcoder에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션하는 동안 Barcoder와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
IronBarcode는 Barcoder와 비교하여 Docker 배포를 어떻게 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
Barcoder에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
Barcoder에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

