C#에서 바코드 자르기 영역을 설정하는 방법
NetBarcode에서 IronBarcode로의 마이그레이션
이 가이드는 NetBarcode에서 IronBarcode 로의 전체 마이그레이션 경로를 다룹니다. 패키지 제거 단계, 네임스페이스 업데이트, API 변환 예제, 그리고 마이그레이션 시작 전에 모든 호출 위치를 확인하기 위한 체크리스트가 포함되어 있습니다. 이 가이드는 일반적인 시나리오를 다룹니다. 프로젝트가 NetBarcode로부터 1D 바코드 생성을 시작하고 나중에 2D 형식, 읽기 기능 또는 SixLabors.ImageSharp 라이선스 의무의 명확성을 요구하게 될 때 모두 NetBarcode의 범위를 넘어섭니다.
NetBarcode에서 마이그레이션해야 하는 이유는 무엇일까요?
포맷 한도: NetBarcode의 Type 열거형은 정확히 11개의 바코드 포맷을 정의하며, 모두 일차원입니다. QR 코드, DataMatrix, PDF417 또는 Aztec에 대한 항목이 없습니다. 프로젝트에 QR 코드 요구 사항이 추가될 경우(예: 비접촉식 배송 링크, 모바일 딥 링크 또는 제약 회사의 DataMatrix 의무 사항) NetBarcode는 이를 충족할 수 없습니다. 라이브러리 설계 내에서 유일한 해결책은 해당 형식에 대한 사용을 중단하고 별도의 패키지를 도입하는 것입니다. 11개 엔트리 enum을 넘어서는 추가 형식 요건은 종속성 트리에 또 다른 라이브러리를 추가합니다.
읽기 API 없음: NetBarcode는 바코드 이미지를 생성하지만 이를 디코딩하는 메서드를 제공하지 않습니다. 반품 배송 라벨을 스캔하거나, 공급업체 송장에서 바코드 값을 추출하거나, 인쇄된 바코드가 원본 데이터와 일치하는지 검증해야 하는 프로젝트는 별도의 판독 라이브러리를 추가해야 합니다. ZXing .NET 은 가장 일반적인 선택으로, 이미 NetBarcode와 일반적으로 QR 코드 전용 라이브러리를 포함하고 있는 코드베이스에 세 번째 API 인터페이스를 도입합니다.
ImageSharp 상업용 라이선스: NetBarcode는 SixLabors.ImageSharp에 의존하며, 이는 분리된 상업용 라이선스를 사용합니다. 무료 이용권은 오픈소스 프로젝트 및 일정 연간 매출 기준치 미만의 기업에 적용됩니다. 그 임계값을 넘으면 상업용 라이선스가 필요합니다. 이 조건은 전이적 종속성 체인에 포함되어 있으며 NuGet 설치 중에 표시되지 않습니다. 대규모로 바코드를 처리하는 소매 또는 물류 회사(NetBarcode가 목표로 하는 사용 사례)는 의무 사항을 평가하지 않고도 기준치를 초과하여 운영하고 있을 수 있습니다.
다중 라이브러리 누적: QR 코드가 필요할 때 QRCoder를 사용하고, 읽기가 필요할 때 ZXing .NET 을 사용하는 프로젝트는 바코드 관련 종속성을 세 개씩 누적하게 됩니다. 각 제품은 고유한 출시 일정, ImageSharp 버전 기대치 및 유지 관리해야 할 자체 API를 가지고 있습니다. 생성, 읽기, 1D 및 2D를 모두 포괄하는 단일 라이브러리로 통합하면 라이브러리 간 버전 관리 문제를 해결할 수 있습니다.
근본적인 문제
NetBarcode만으로 시작해서 2D 형식이 필요하게 되는 프로젝트는 결국 이런 식으로 가져오기를 분할하게 됩니다.
// 넷바코드 for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
// 넷바코드 for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
IronBarcode 로 마이그레이션한 후에는 단일 가져오기에서 동일한 두 가지 출력이 생성됩니다.
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
IronBarcode와 NetBarcode의 기능 비교
| 기능 | 넷바코드 | IronBarcode |
|---|---|---|
| 1D 바코드 생성 | 예 | 예 |
| 2D 바코드 생성 (QR, DataMatrix, PDF417, Aztec) | 아니요 | 예 |
| 이미지에서 바코드 읽기 | 아니요 | 예 |
| PDF 문서에서 바코드 읽기 | 아니요 | 예 |
| 1D 포맷 개수 | 11 | 30세 이상 |
| 2D 포맷 개수 | 0 | 8세 이상 |
| 전체 기호 체계 | 11 | 50세 이상 |
| GS1-128, GS1 데이터바 | 아니요 | 예 |
| 우편 형식 | 아니요 | 예 |
| SVG 출력 | 아니요 | 예 |
| 일괄 처리 | 수동 | 내장형 |
| ImageSharp 종속성 | 예 (분리된 라이선스) | 아니요 |
| 상업적 지원 | Community | Professional |
| 라이선스 모델 | MIT (+ ImageSharp 조건) | 상업적 |
빠른 시작: NetBarcode에서IronBarcode로 마이그레이션
1단계: NuGet 패키지 교체
NetBarcode와 그에 따른 ImageSharp 종속성을 제거하세요.
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SixLabors.ImageSharp는 프로젝트의 다른 패키지에서도 전이적으로 참조할 경우 복원된 패키지 목록에 다시 나타날 수 있습니다. 삭제 후, dotnet list package --include-transitive을 실행하여 ImageSharp이 남아 있는지 및 상업적 라이선스 조건이 여전히 프로젝트에 적용되는지를 확인하십시오.
2단계:IronBarcode추가
dotnet add package IronBarcode
dotnet add package IronBarcode
NuGet 패키지 이름은 IronBarcode; 코드에서 사용하는 네임스페이스는 IronBarCode (대문자 C에 주의하십시오).
3단계: 네임스페이스 업데이트 및 라이선스 초기화
NetBarcode 호출이 포함된 모든 파일에서 기존의 using 지시문을 다음과 같이 교체하십시오.
// 제거하다 these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
// 제거하다 these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
Imports IronBarCode
응용 프로그램 시작 시 Program.cs, Startup.cs 또는 프로젝트의 진입 지점에서 라이선스 초기화를 추가하십시오:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
평가를 위해 무료 체험판 키를 사용할 수 있습니다. 라이선스를 구매하면 생성된 바코드 이미지에서 체험판 워터마크가 제거됩니다.
코드 마이그레이션 예제
코드128 생성
가장 일반적인 넷바코드 사용 패턴은 생성자를 정적 메서드로 변경하고 메서드 이름을 바꾸는 것만으로IronBarcode에 그대로 적용됩니다.
넷바코드 접근법:
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode
Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
new Barcode(data, Type.X) 생성자는 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)이 됩니다. SaveImageFile() 메서드는 필요한 출력 포맷에 따라 SaveAsPng(), SaveAsJpeg(), 또는 SaveAsWindowsBitmap()로 변환됩니다. 사용 가능한 모든 1D 바코드 생성 옵션은IronBarcode사용 설명서에 자세히 설명되어 있습니다.
EAN-13
소매 제품 바코드 유형은 상수 이름 변경 및 메서드 이름 변경을 통해 라이브러리 간에 직접 매핑됩니다.
넷바코드 접근법:
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode
Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
IronBarcode 접근 방식:
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("product-ean.png")
인코딩 상수 이름은 직접 대응이 존재하는 경우 NetBarcode의 Type 열거형 멤버 이름과 일치합니다. UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF), MSI (Type.MSI) 등은 NetBarcode의 Type 열거형에 포함되지 않습니다 — 해당 포맷이 필요한 경우 IronBarcode는 BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF, BarcodeEncoding.MSI를 통해 네이티브로 지원합니다.
GetImage()를 ToPngBinaryData()로 변환
NetBarcode의 GetImage() 메서드는 SixLabors.ImageSharp.Image<Rgba32>을 반환하며, 호출 코드에서 명시적인 ImageSharp 가져오기와 하위 로직을 ImageSharp API에 연결합니다. IronBarcode는 GeneratedBarcode 객체에서 이진 및 스트림 출력 메서드를 직접 노출하여 호출 코드에서 ImageSharp 의존성을 완전히 제거합니다.
넷바코드 접근법:
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO
Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()
Using stream As New MemoryStream()
image.SaveAsPng(stream)
Dim bytes As Byte() = stream.ToArray()
End Using
IronBarcode 접근 방식:
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()
' Or write to a stream directly
Using stream As New MemoryStream()
barcode.SaveAsPng(stream)
End Using
Image<Rgba32> 결과에 대해 추가 ImageSharp 조작을 수행했던 코드 — 크기 조정, 합성, 포맷 변환 —는 IronBarcode가 ImageSharp 객체를 노출하지 않기 때문에 개별적으로 평가가 필요합니다.
NetBarcode와 QRCoder를 하나로 통합하여 대체
NetBarcode와 QRCoder를 함께 사용하는 프로젝트는 두 프로그램을 한 번에 교체할 수 있습니다. IronBarcode의 2D 생성은 1D 생성과 동일한 BarcodeWriter.CreateBarcode 메서드를 사용합니다; 단지 BarcodeEncoding 상수만 다릅니다. 인코딩 옵션 및 구성에 대한 자세한 내용은 2D 바코드 생성 가이드를 참조하십시오.
넷바코드 및 QR코더 접근 방식:
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder
' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
IronBarcode 접근 방식:
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
Imports IronBarCode
' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
.SaveAsPng("pharma-label.png")
읽기 기능 추가
프로젝트에서 읽기 작업에 ZXing .NET 을 사용하는 경우, NetBarcode와 함께 해당 종속성도 제거할 수 있습니다. IronBarcode의 BarcodeReader는 이미지 및 PDF 문서를 자동 포맷 탐지로 처리합니다.
ZXing .NET 접근 방식:
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering
Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}
' Bitmap loading and format-specific handling required before decode call
IronBarcode 접근 방식:
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode
' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
Console.WriteLine($"{r.Format}: {r.Value}")
Next
' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
바코드 이미지 판독 옵션에 대한 전체 문서는 속도 조정, 다중 바코드 감지 및 이미지 보정 설정 등을 다루는 "이미지에서 바코드 판독" 가이드에서 확인할 수 있습니다.
넷바코드 API와IronBarcode매핑 참조
| 넷바코드 | IronBarcode | 노트 |
|---|---|---|
new Barcode(data, Type.Code128) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
생성자 → 정적 메소드 |
new Barcode(data, Type.EAN13) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) |
직접 매핑 |
new Barcode(data, Type.Code39) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) |
직접 매핑 |
new Barcode(data, Type.EAN8) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) |
직접 매핑 |
new Barcode(data, Type.Codabar) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) |
직접 매핑 |
new Barcode(data, Type.Code93) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) |
직접 매핑 |
barcode.SaveImageFile("x.png") |
.SaveAsPng("x.png") |
메서드 이름 변경 |
barcode.SaveImageFile("x.jpg") |
.SaveAsJpeg("x.jpg") |
메서드 이름 변경 |
barcode.GetImage() → Image<Rgba32> |
.ToPngBinaryData() 또는 .SaveAsPng() |
ImageSharp 유형이 노출되지 않았습니다. |
No Type.QRCode |
BarcodeEncoding.QRCode |
새로운 기능 |
No Type.DataMatrix |
BarcodeEncoding.DataMatrix |
새로운 기능 |
No Type.PDF417 |
BarcodeEncoding.PDF417 |
새로운 기능 |
No Type.Aztec |
BarcodeEncoding.Aztec |
새로운 기능 |
| 읽기 API 없음 | BarcodeReader.Read(path) |
새로운 기능 |
using NetBarcode; |
using IronBarCode; |
네임스페이스 교체 |
using SixLabors.ImageSharp; |
제거하다 | 더 이상 필요하지 않음 |
using SixLabors.ImageSharp.PixelFormats; |
제거하다 | 더 이상 필요하지 않음 |
using SixLabors.Fonts; |
제거하다 | 더 이상 필요하지 않음 |
인코딩 상수 전체 목록은 지원되는 바코드 형식 참조에서 확인할 수 있습니다.
일반적인 마이그레이션 문제와 해결책
문제 1: 패키지 제거 후에도 ImageSharp의 전이적 종속성이 남아 있음
문제: dotnet remove package NetBarcode 실행 후, dotnet restore에서 다른 패키지가 참조 중이기 때문에 SixLabors.ImageSharp이 종속성 트리에 여전히 존재하는 것으로 나타납니다.
해결책: dotnet list package --include-transitive을 실행하여 여전히 ImageSharp을 가져오는 패키지를 식별하십시오. 만약 NetBarcode만 참조하는 경우, 명시적인 패키지 참조를 제거하고 복원하면 이를 해결할 수 있습니다. 다른 패키지가 책임인 경우, 해당 패키지의 ImageSharp 종속성 및 상업적 라이선스 조건은 넷바코드 제거와 독립적으로 적용됩니다.
dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
문제 2: 이미지 삭제 후 유형을 확인할 수 없습니다.
문제: SixLabors.ImageSharp 패키지를 제거한 후, Image<Rgba32>로 선언된 변수나 SixLabors.ImageSharp.Image<Rgba32>로 타이핑된 매개변수에 대해 타입이 더 이상 사용 불가능하여 컴파일 오류가 발생합니다.
해결 방법: 각 사용 부분을 적절한IronBarcode출력 방식으로 대체하십시오. 변수가 바이트를 얻기 위해 사용된 경우 .ToPngBinaryData()으로 대체하십시오. 스트림에 기록된 경우 .SaveAsPng(stream)로 대체하십시오. 파일에 저장된 경우 .SaveAsPng(path)으로 대체하십시오.
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)
' After — no external image type required
barcode.SaveAsPng(stream)
이슈 3: v1.8 호환성 파괴 변경 사항 컨텍스트
문제: v1.8 이전의 NetBarcode를 기반으로 작성된 코드베이스에서 명시적인 타이핑 없이 결과를 저장한 GetImage() 호출이 있을 수 있습니다. 이러한 호출은IronBarcode마이그레이션과는 별개로 넷바코드 업데이트 이후 이미 작동하지 않을 수 있습니다.
해결책: v1.8 이전에 발생한 문제를 해결할 기회로 IronBarcode로의 마이그레이션을 활용하십시오. 모든 GetImage() 호출 지점을 프로젝트 전체 검색으로 찾아서 마이그레이션 진행 중에 적절한IronBarcode출력 메서드로 교체하십시오. 아래 마이그레이션 체크리스트의 grep 명령어는 이러한 위치를 식별합니다.
넷바코드 마이그레이션 체크리스트
사전 마이그레이션
변경 사항을 적용하기 전에 모든 넷바코드 사용 내역을 감사하십시오.
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
- using 지시문 변경이 필요한 모든 파일을 식별합니다.
- 모든
GetImage()호출 지점과 반환된Image<Rgba32>객체가 하위에서 어떻게 사용되는지 기록하십시오. - QRCoder 또는 ZXing .NET 이 설치되어 있는지 확인하고, 설치되어 있다면 같은 과정에서 제거할 수 있는지 확인합니다.
- 제거 전에 현재 ImageSharp 종속성 상태를 문서화하기 위해
dotnet list package --include-transitive을 실행하십시오. -IronBarcode라이선스 키를 받으세요 (구매 없이 무료 평가판 키를 사용할 수 있습니다).
코드 업데이트
dotnet remove package NetBarcode실행- 다른 패키지에서 사용되지 않는 경우
dotnet remove package SixLabors.ImageSharp실행 dotnet add package IronBarcode실행- 응용 프로그램 시작 시
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";추가 - 각 영향을 받는 파일에서
using NetBarcode;을(를)using IronBarCode;으로 교체 - 모든 파일에서
using SixLabors.ImageSharp;,using SixLabors.ImageSharp.PixelFormats;, 및using SixLabors.Fonts;을(를) 제거 new Barcode(data, Type.X)호출을 API 맵핑 테이블을 사용하여BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)으로 변환SaveImageFile()을(를)SaveAsPng()또는 적절한 포맷별 메서드로 교체GetImage()호출을 필요에 따라ToPngBinaryData(),SaveAsPng(), 또는SaveAsPng(stream)으로 교체- QR코더 제거 시:
QRCodeGenerator+PngByteQRCode체인을BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)으로 교체 - ZXing.Net 제거 시: 리더 설정을
BarcodeReader.Read(path)으로 교체
마이그레이션 후 테스트
- 프로젝트를 빌드하고 컴파일 오류가 없는지 확인합니다.
- 생성된 바코드 출력에 대해 기존 단위 테스트를 실행합니다.
- 바코드 이미지의 심볼이 올바르고 내용이 읽기 쉬운지 육안으로 확인합니다.
- 마이그레이션 중에 QR 코드 형식이 추가된 경우 QR 코드 출력 결과를 확인합니다.
- 바코드 스캔 기능이 추가된 경우 읽기 기능을 테스트합니다.
- ImageSharp이 제거되었는지 확인하기 위해
dotnet list package --include-transitive을 실행합니다. - 첫 번째 바코드 작업 전에 라이선스 키 초기화가 실행되는지 확인합니다.
IronBarcode로 마이그레이션할 때의 주요 이점
통합 포맷 지원 범위: 마이그레이션 후, QR 코드, DataMatrix, PDF417, Aztec 및 모든 다른 2D 포맷은 Code128 및 EAN-13에 사용된 동일한 API 호출을 통해 사용할 수 있습니다. 포맷 요구 사항이 확장될 때 두 번째 라이브러리가 필요하지 않으며, BarcodeEncoding 상수만 포맷 타입 간에 변화합니다.
내장된 읽기 기능: BarcodeReader.Read()는 자동 포맷 탐지로 이미지 파일과 PDF 문서를 처리합니다. 이전에는 바코드 읽기를 위해 .NET 용 ZXing 라이브러리가 필요했던 프로젝트에서 이제 해당 종속성을 제거하고 단일 바코드 라이브러리로 통합할 수 있으므로 프로젝트 개발자가 학습해야 하는 API 영역을 줄일 수 있습니다.
ImageSharp 필수 사용 안 함:IronBarcode는 SixLabors.ImageSharp에 의존하지 않습니다. 마이그레이션 후, NetBarcode의 전이 종속성에 내장된 분리된 상업적 라이선스 조건은 더 이상 프로젝트에 적용되지 않습니다. 바코드 라이브러리의 의무가 직접적으로 명시되므로 라이선스 준수 검토가 간소화되며, 타사 이미지 처리 라이브러리의 수입 임계치에 의존하지 않습니다.
안정적인 공개 API:IronBarcode공개 API 표면에 타사 유형을 노출하지 않습니다. GeneratedBarcode의 반환 타입은 IronBarcode의 자체 타입으로, 이는 IronBarcode의 내장 렌더링의 향후 업데이트가 NetBarcode의 v1.8 GetImage() 타입 변경이 했던 방식으로 호출 코드에 단절을 일으키지 않음을 의미합니다.
유지 관리해야 할 종속성 하나만 남습니다. NetBarcode, QRCoder 및 ZXing .NET 을IronBarcode로 교체하면 업그레이드 주기 3회, 릴리스 노트 3세트, 잠재적인 버전 충돌 3건을 하나로 줄일 수 있습니다. .NET 버전이 발전하고 종속성 업데이트가 필요해짐에 따라 유지 관리 작업은 세 개의 라이브러리 대신 하나의 라이브러리로 확장할 수 있습니다.
자주 묻는 질문
NetBarcode에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
NetBarcode API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
NetBarcode에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션하는 동안 NetBarcode와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
IronBarcode는 NetBarcode와 비교하여 어떻게 Docker 배포를 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
NetBarcode에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
NetBarcode에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

