.NET용 Aspose.BarCode와 IronBarcode: C# 바코드 라이브러리 비교
Aspose.BarCode를 사용해 본 모든 개발자는 이 줄의 일부 버전을 작성했습니다: @@--코드-50571--@@. 이미지의 형식을 알고 있으면 제대로 작동합니다. 그렇지 않은 경우(외부 시스템에서 온 문서, 라벨 형식을 변경한 공급업체 또는 사용자가 업로드한 문서)에는 디코딩 유형 목록을 추측하거나 DecodeType.AllSupportedTypes에 도달하게 되는데, 이는 눈에 띄게 느립니다. 형식 지정 요구 사항은 심각한 문제는 아니지만, 코드베이스의 모든 읽기 작업에서 매일같이 발생하는 불편함입니다.
PDF에 담긴 이야기는 예산에 관한 이야기입니다. PDF 문서에서 바코드를 처리하는 경우 Aspose.BarCode만으로는 처리할 수 없습니다. 먼저 페이지를 이미지로 렌더링하려면 Aspose.PDF for .NET 이 필요합니다. Aspose.PDF는 Aspose.BarCode 구독료 외에 연간 $999~$4,995의 추가 비용이 발생하는 구독 서비스입니다. 대부분의 개발자가 하나의 작업으로 생각하는 워크플로에 대한 두 가지 구독 서비스입니다.
IronBarcode 바코드 형식을 자동으로 감지하고 PDF 파일을 기본적으로 읽는 기능을 하나의 패키지에 포함하며, 749달러부터 시작하는 영구 라이선스를 제공합니다. 이 비교 분석에서는 두 라이브러리를 자세히 살펴보고 현명한 선택을 할 수 있도록 도와드립니다.
Aspose.BarCode 이해하기
Aspose는 수년간 .NET, Java 및 기타 플랫폼용 문서 처리 라이브러리를 개발해 왔습니다. Aspose.BarCode는 Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides 등 약 12개 이상의 다른 제품군과 함께 Aspose 제품군에 속하는 여러 제품 중 하나입니다. Aspose.Total(모든 Aspose 제품이 포함된 번들)을 이미 구독 중인 팀의 경우 Aspose.BarCode는 추가 비용 없이 이용할 수 있습니다. 하지만 바코드 라이브러리만 필요한 팀의 경우 구독 모델은 정당화하기 어려울 수 있습니다.
Aspose.BarCode는 60개 이상의 바코드 심볼을 지원하며, 이는 시중에서 판매되는 .NET 바코드 라이브러리 중 가장 완벽한 형식 목록입니다. 그 폭넓은 자료 범위가 바로 도서관의 가장 큰 장점입니다. 그에 따라 API 표면적도 커지고, 기능이 많아질수록 API 설명의 상세함도 증가합니다. 기본 Code 128 바코드를 생성하려면 BarcodeGenerator를 인스턴스화하고 XDimension, BarHeight 및 기타 파라미터를 설정한 다음 명시적 형식 인수로 Save를 호출해야 합니다. 읽으려면 검색할 디코딩 유형을 지정하고 ReadBarCodes()을 호출한 다음 FoundBarCodes을 반복해야 합니다. 두 작업 모두 올바르게 작동하지만, 필요 이상으로 장황합니다.
Aspose.BarCode의 주요 아키텍처 특징:
- 형식 우선 읽기 모델: 모든 읽기 작업에는
DecodeType를 명시적으로 지정해야 합니다. 폴백DecodeType.AllSupportedTypes은 디코더가 알려진 모든 기호를 순차적으로 실행하기 때문에 타깃 목록보다 훨씬 느립니다. - 인스턴스 기반 API:
BarCodeReader와BarcodeGenerator는 모두IDisposable을 구현하는 인스턴스화된 객체입니다.using블록으로 감싸지 않으면 리소스 누수가 발생할 수 있습니다. - PDF를 직접 지원하지 않습니다: Aspose.BarCode는 PDF 문서를 직접 열거나 렌더링할 수 없습니다. PDF에서 바코드를 읽으려면 Aspose.PDF라는 별도 구독 제품이 필요하며, 가격은 연간 999달러에서 4,995달러입니다.
- 심층 매개변수 계층 구조: 사용자 지정은
generator.Parameters.Barcode.*속성 체인(암기가 필요한 다단계 객체 계층 구조)을 통해 처리됩니다. - 구독 라이선스만 해당: 모든 등급은 연간 구독 방식입니다. 영구 투자 옵션은 단독 상품으로 제공되지 않습니다.
- 파일 기반 라이선스 활성화: 프로덕션 배포에는 알려진 경로에서 액세스할 수 있는
.lic파일이 필요하며, 이는 Docker및 Kubernetes 환경에 대한 배포 단계를 추가합니다.
형식 우선 읽기 모델
Aspose.BarCode의 읽기 API는 호출자가 바코드 형식을 알고 있다는 가정하에 설계되었습니다.
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
형식을 알고 있다면 이 패턴은 괜찮습니다. 문제는 "형식을 알고 있을 때"라는 점입니다. 공급업체 송장을 처리하는 구매 시스템은 모든 공급업체가 동일한 바코드 유형을 사용한다고 보장할 수 없습니다. 사용자 업로드를 허용하는 문서 관리 시스템은 스캐너가 사용한 파일 형식을 예측할 수 없습니다. 이러한 경우 DecodeType.AllSupportedTypes이 대안으로 사용되며, 타겟 디코딩 유형 목록보다 훨씬 느립니다.
디코더도 폐기해야 합니다.
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using을 사용하지 않으면 리소스가 유출됩니다. 코드 50589--@@는 @@--코드 50590--@@도 구현하지만, 폐기하지 않을 경우의 결과는 덜 심각합니다. 두 경우 모두 정적 팩토리 API가 자동으로 처리하는 객체 수명 주기를 직접 관리하고 있는 것입니다.
IronBarcode이해하기
IronBarcode 읽기 및 쓰기 모두에 정적 팩토리 메서드를 사용합니다. 생성, 구성 또는 폐기할 인스턴스가 없습니다. 읽기 API는 기본적으로 형식에 구애받지 않으며, 소스 파일이 PNG, JPEG, TIFF 또는 PDF인지 여부에 관계없이 동일한 호출이 작동합니다.
IronBarcode 는 .NET 개발자 도구에만 집중하는 회사인 Iron Software 에서 개발 및 유지 관리합니다. 이 라이브러리는 바코드 판독에 바코드 형식에 대한 사전 지식이 필요하지 않아야 한다는 원칙을 기반으로 설계되었습니다. 라이브러리의 감지 엔진이 이미지 내용에서 형식을 자동으로 판단합니다. 생성 과정에서 다른 라이브러리에서 흔히 볼 수 있는 다단계 매개변수 계층 구조 대신 유창한 메서드 체인이 사용됩니다.
IronBarcode 의 주요 특징:
- 자동 형식 감지:
BarcodeReader.Read()는 호출자가DecodeType에 해당하는 것을 지정할 필요 없이 이미지 콘텐츠에서 바코드 기호를 식별합니다. - 정적 상태 비저장 API: 모든 읽기 및 쓰기 작업은 정적 메서드입니다. 관리해야 할 일회용 인스턴스가 없으며, API는 동시 사용을 위해 기본적으로 스레드 안전합니다.
- 네이티브 PDF 지원:
BarcodeReader.Read("doc.pdf")는 추가 패키지나 렌더링 단계 없이 PDF 파일에서 직접 읽습니다. 결과는result.PageNumber입니다. - 플루언트 생성 API:
BarcodeWriter.CreateBarcode()는 체인 가능한 객체를 반환합니다. 사용자 정의는 속성 계층 구조 대신 메서드 체이닝을 사용합니다. - 영구 라이선스 모델: 모든 등급은 일회성 구매로 연간 갱신이 필요 없습니다.
- 문자열 기반 라이선스 활성화: 라이선스 키는
IronBarCode.License.LicenseKey를 통해 설정되며, 환경 변수 및 CI/CD 비밀 관리자와 호환됩니다.
기능 비교
| 기능 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 형식 감지 | 수동 - DecodeType을 지정하거나 느린 AllSupportedTypes을 사용해야 합니다 |
지원되는 모든 형식에서 자동으로 처리됩니다. |
| 기호 개수 | 60세 이상 | 50세 이상 |
| PDF 지원 | 기본 지원되지 않으며, Aspose.PDF 라이선스가 별도로 필요합니다. | 네이티브 - BarcodeReader.Read("doc.pdf") 패키지에 내장됨 |
| 가격 모델 | 구독 전용 — 연간 $999~$4,995 | 영구 보증은 749달러(일회성)부터 시작합니다. |
| 영구 라이선스 | 사용 불가 | 네, 모든 등급이요. |
| API 스타일 | 인스턴스 기반의 상세 구성 | 정적 팩토리 메서드, 플루언트 API |
| 일회용품 요구 사항 | 예 - BarCodeReader 및 BarcodeGenerator |
아니요 — 상태를 저장하지 않는 정적 메서드 |
| 스레드 안전성 | 스레드당 별도의 인스턴스가 필요합니다. | 상태 비저장 방식 — 동시 사용에 본질적으로 안전함 |
상세 기능 비교
| 기능 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 세대 | ||
| API 스타일 | @@--코드-50602--@@ | @@--코드-50603--@@ |
| 맞춤형 모델 | generator.Parameters.Barcode.* 속성 계층 구조 |
유창한 메서드 체인(.ResizeTo(), .ChangeBarCodeColor()) |
| 로고가 포함된 QR 코드 | 생성 후 수동 GDI+ 오버레이 | .AddBrandLogo("logo.png") 빌트인 |
| 바이트 단위로 출력 | @@--코드-50608--@@ | @@--코드-50609--@@ |
| 컬러 바코드 | @@--코드-50610--@@ | @@--코드-50611--@@ |
| 독서 | ||
| 형식 사양 | 필수(DecodeType) |
필요 없음 — 자동 |
| 알 수 없는 형식 대체 | DecodeType.AllSupportedTypes (느린) |
동일한 호출이므로 대체 모드가 필요하지 않습니다. |
| 성능 튜닝 | 12+ QualitySettings 매개변수 |
ReadingSpeed 열거형 - 세 가지 수준 |
| 일회용 리더기 | 예 - using var reader = new BarCodeReader(...) |
아니요 — 정적 호출이므로 해제할 객체가 없습니다. |
| 결과 접근 | reader.FoundBarCodes을 호출한 후 ReadBarCodes()을 호출합니다 |
반환 값 BarcodeReader.Read() |
| 바코드 값 속성 | @@--코드-50620--@@ | @@--코드-50621--@@ |
| 형식 이름 속성 | @@--코드-50622--@@ | @@--코드-50623--@@ |
| PDF 지원 | ||
| 네이티브 PDF 읽기 | 아니요 | 예 |
| PDF에 필요합니다 | Aspose.PDF (연간 $999~$4,995 추가 비용) | 추가 패키지 없음 |
| 검색 결과의 페이지 번호 | 해당 없음 | @@--코드-50624--@@ |
| 라이선스 | ||
| 라이선스 모델 | 구독 전용이며, 매년 갱신됩니다. | 영구적, 일회성 구매 |
| 단일 개발자 | 연간 999달러 | $749 (한 번) |
| 개발자 10명 | 연간 4,995달러(사이트 라이선스) | 2,999달러 일회성 (Professional) |
| 무제한 개발자 | 연간 14,985달러(OEM 기준) | 5,999달러 일회성 요금 (무제한) |
| PDF 지원 포함 | 아니요, Aspose.PDF 구독은 별도입니다. | 예 |
| 플랫폼 및 배포 | ||
| 라이선스 활성화 | .lic 파일 경로 |
문자열 키 — 환경 변수 |
| Docker 배포 | 코드 50626--@@ 파일을 이미지에 복사하거나 마운트해야 합니다 | 환경 변수 — 파일 필요 없음 |
| .NET Framework | 예 | 예 (4.6.2+) |
| .NET Core / .NET 5 이상 | 예 | 예 (.NET Core 3.1 이상, .NET 5/6/7/8/9) |
| Windows | 예 | 예 (x64/x86) |
| Linux | 예 | 예 (x64) |
| macOS | 예 | 예 (x64/ARM) |
| Docker | 예 | 예 |
| Azure / AWS Lambda | 예 | 예 |
생성 API
두 라이브러리 간의 코드 상세도 차이가 일상적인 코드 작성에서 가장 두드러지게 나타나는 부분은 바로 생성 API입니다.
Aspose.BarCode 접근 방식
Aspose.BarCode는 BarcodeGenerator 클래스와 Parameters 계층 구조를 구성에 사용합니다. 최소한의 생성 호출은 인스턴스화, 저장 호출 및 형식 지정의 세 단계로 구성됩니다. 실제 사용법은 일반적으로 generator.Parameters.Barcode.*로 이동해야 합니다:
using Aspose.BarCode.Generation;
using System.Drawing;
var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");
// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;
generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;
var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");
// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;
generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing
Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")
' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300
generator.Save("barcode.png", BarCodeImageFormat.Png)
모든 사용자 지정은 다단계 객체 계층 구조인 generator.Parameters.Barcode.*로 이동합니다. 일단 외우고 나면 복잡하지 않지만, 암기가 필요하다.
IronBarcode접근법
IronBarcode 매개변수 계층 구조를 유연한 메서드 체인으로 대체합니다. 기본 설정은 대부분의 사용 사례에서 올바른 결과를 제공하며, 사용자 지정은 코드 내에 직접 표현할 수 있습니다.
using IronBarCode;
// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ToPngBinaryData()
QR 코드의 경우, IronBarcode의 QR 코드 생성 API는 수동 이미지 합성 없이 브랜드 로고를 지원합니다.
using IronBarCode;
using IronSoftware.Drawing;
// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (recommended when using a logo)
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;
// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (recommended when using a logo)
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
' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
' With high error correction (recommended when using a logo)
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")
Aspose.BarCode는 바코드 이미지를 생성한 다음 System.Drawing.Graphics를 사용하여 로고를 중앙에 합성하는 수동 GDI+ 드로잉을 통해 QR코드에 로고를 오버레이해야 합니다. IronBarcode의 AddBrandLogo는 한 번의 호출로 이를 처리하고 오류 수정을 자동으로 적절하게 설정합니다.
PDF 바코드 읽기
많은 팀에게 있어 이것이 가장 중요한 비교입니다. PDF 문서에서 바코드를 읽는 것은 일반적인 워크플로입니다. 예를 들어, 수신 송장, PDF로 저장된 배송 라벨, 스캔한 문서 보관함 등이 있습니다.
Aspose.BarCode 접근 방식
Aspose.BarCode는 PDF를 기본적으로 지원하지 않습니다. Aspose를 사용하여 PDF에서 바코드를 읽으려면 PDF를 로드하고 페이지를 이미지로 렌더링하는 Aspose.PDF와 렌더링된 이미지를 스캔하는 Aspose.BarCode가 필요합니다. 둘 다 구독 상품입니다. 두 제품 모두 라이선스 활성화가 필요합니다. 종합적으로 보면, 대부분의 개발자들이 단일 기능으로 생각하는 것을 위해 연간 1,998달러에서 9,990달러 정도의 비용이 발생할 수 있습니다.
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var barcodeValues = new List<string>();
// Step 1: Load and render the PDF using Aspose.PDF
var pdfDocument = new Aspose.Pdf.Document(pdfPath);
var resolution = new Resolution(300);
var device = new PngDevice(resolution);
for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
{
using var pageStream = new MemoryStream();
device.Process(pdfDocument.Pages[pageNum], pageStream);
pageStream.Seek(0, SeekOrigin.Begin);
// Step 2: Scan the rendered image for barcodes using Aspose.BarCode
using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
barcodeValues.Add(result.CodeText);
}
}
return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var barcodeValues = new List<string>();
// Step 1: Load and render the PDF using Aspose.PDF
var pdfDocument = new Aspose.Pdf.Document(pdfPath);
var resolution = new Resolution(300);
var device = new PngDevice(resolution);
for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
{
using var pageStream = new MemoryStream();
device.Process(pdfDocument.Pages[pageNum], pageStream);
pageStream.Seek(0, SeekOrigin.Begin);
// Step 2: Scan the rendered image for barcodes using Aspose.BarCode
using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
barcodeValues.Add(result.CodeText);
}
}
return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim barcodeValues As New List(Of String)()
' Step 1: Load and render the PDF using Aspose.PDF
Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
Dim resolution As New Resolution(300)
Dim device As New PngDevice(resolution)
For pageNum As Integer = 1 To pdfDocument.Pages.Count
Using pageStream As New MemoryStream()
device.Process(pdfDocument.Pages(pageNum), pageStream)
pageStream.Seek(0, SeekOrigin.Begin)
' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
For Each result In reader.ReadBarCodes()
barcodeValues.Add(result.CodeText)
Next
End Using
End Using
Next
Return barcodeValues
End Function
두 개의 네임스페이스, 렌더링 파이프라인, 메모리 스트림 관리, 중첩 루프의 문을 사용하는 두 가지 라이선스 설정이 그 예입니다. 또한 이미지 추출 시점에서는 일반적으로 바코드가 어떤 형식을 사용하는지 알 수 없으므로 DecodeType.AllSupportedTypes를 사용합니다.
IronBarcode접근법
IronBarcode PDF 구문 분석, 페이지 렌더링 및 바코드 감지를 자체적으로 처리합니다. Read를 .pdf로 끝나는 경로와 함께 호출하면 result.PageNumber가 포함된 바코드 결과를 반환하므로 각 페이지의 출처를 알 수 있습니다. 추가 패키지, 추가 라이선스, 렌더링 코드는 필요하지 않습니다.
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r => r.Value).ToList();
}
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r => r.Value).ToList();
}
Imports IronBarCode
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results = BarcodeReader.Read(pdfPath)
Return results.Select(Function(r) r.Value).ToList()
End Function
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System
' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
IronBarcode PDF 읽기 문서에는 여러 페이지를 일괄 처리하고 페이지 범위 필터링 옵션을 사용하는 방법이 설명되어 있습니다.
알 수 없는 바코드 형식 읽기
이미지에 어떤 바코드 형식이 포함되어 있는지 모르는 경우, 두 라이브러리는 상황을 매우 다르게 처리합니다.
Aspose.BarCode 접근 방식
DecodeType.AllSupportedTypes는 형식을 알 수 없는 시나리오를 위한 Aspose의 솔루션입니다. Aspose 자체 문서에서도 디코더가 알려진 모든 심볼을 순차적으로 실행하기 때문에 대상 목록을 지정하는 것보다 속도가 느리다는 점을 인정하고 있습니다. 대량 처리 환경, 즉 분당 수천 개의 라벨을 스캔하는 창고의 경우 이러한 성능 차이는 결코 사소하지 않습니다.
using Aspose.BarCode.BarCodeRecognition;
// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;
// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition
' AllSupportedTypes scans for every known format — significantly slower
Using reader As New BarCodeReader("unknown-format.png")
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
For Each result In reader.ReadBarCodes()
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
End Using
IronBarcode접근법
포맷 지식에 기반한 "느린 모드"와 "빠른 모드"는 없습니다. IronBarcode의 감지 알고리즘은 이미지에 Code 128이 포함되어 있든 DataMatrix가 포함되어 있든 동일한 알고리즘을 실행합니다. 성능과 정확성의 절충점을 조정하려는 경우 ReadingSpeed 옵션을 사용하면 형식에 대한 지식 없이도 이를 수행할 수 있습니다:
using IronBarCode;
// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;
// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode
' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("document.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("document.png", options)
ReadingSpeed.Faster는 처리량을 우선시합니다. ReadingSpeed.Detailed는 손상되거나 대비가 낮은 이미지에 대한 정확성을 우선시합니다. 두 방법 모두 형식을 미리 알 필요가 없습니다. 전체 튜닝 매개변수 세트는 IronBarcode 읽기 옵션을 참조하십시오.
API 매핑 참조
| Aspose.BarCode | IronBarcode |
|---|---|
| @@--코드-50641--@@ | @@--코드-50642--@@ |
| @@--코드-50643--@@ | @@--코드-50644--@@ |
| @@--코드-50645--@@ | @@--코드-50646--@@ |
DecodeType.AllSupportedTypes (느리고 철저한 스캔) |
자동 — 항상 빠르고 모든 형식에 대해 동일한 호출을 사용합니다. |
| @@--코드-50648--@@ | (part of BarcodeReader.Read — returns results directly) |
| @@--코드-50650--@@ | 반환 값 BarcodeReader.Read |
| @@--코드-50620--@@ | @@--코드-50621--@@ |
| @@--코드-50622--@@ | @@--코드-50623--@@ |
| @@--코드-50656--@@ | @@--코드-50656--@@ |
| @@--코드-50658--@@ | BarcodeReader.Read("doc.pdf") - 하나의 패키지 |
| @@--코드-50660--@@ | @@--코드-50661--@@ |
| @@--코드-50662--@@ + @@--코드-50663--@@ | (not needed — single key covers all environments) |
| @@--코드-50608--@@ | @@--코드-50609--@@또는 .SaveAsPng() |
QREncodeMode.Auto + QRErrorLevel.LevelH + 수동 로고 오버레이 |
@@--코드-50669--@@ |
팀이 Aspose.BarCode에서IronBarcode로 마이그레이션을 고려할 때
일반적으로 개발팀이 Aspose.BarCode의 대안으로IronBarcode고려하게 되는 시나리오는 여러 가지가 있습니다.
구독 갱신 알림이 도착했습니다
연간 구독 갱신 시점은 팀에서 라이브러리 관련 결정을 재검토하는 경우가 가장 많은 시점입니다. Aspose.BarCode가 전체 시스템 구성에서 유일한 Aspose 제품이라면, 바코드 기능에 대한 연간 비용 $999~$4,995는 비교를 고려하게 만드는 요인입니다. 대화는 대개 이렇게 흘러갑니다. "우리는 이걸 매년 영원히 내야 해."IronBarcode일회성 비용은 얼마인가요? Professional 등급(개발자 10명 기준 2,999달러)의 경우, 사이트 라이선스 비용을 고려하면IronBarcode첫 해 안에 투자 비용을 회수할 수 있습니다.
Aspose.Total을 사용하는 팀의 경우, Aspose.BarCode가 20개 이상의 다른 제품과 함께 번들로 제공되므로 계산 방식이 다릅니다. 해당 번들 내에서 Aspose.BarCode의 한계 비용은 거의 0에 가깝습니다. 그 팀들은 굳이 팀을 바꿀 이유가 적다.
PDF 지원이 필수 사항이 되었습니다
많은 프로젝트는 이미지에서 바코드를 읽는 것으로 시작하여, 이해관계자가 수신 문서가 이미지 파일이 아닌 PDF 파일임을 알게 되면 나중에 PDF 지원 기능을 추가합니다. 이 시점에서 Aspose.BarCode 팀은 Aspose.PDF(별도의 구독)를 추가하거나, 타사 PDF 렌더러를 찾거나, 바코드 라이브러리를 재평가하는 세 가지 결정에 직면하게 됩니다.
Aspose.PDF를 추가하면 당장의 요구 사항은 해결되지만 구독 비용이 두 배로 늘어납니다. 타사 렌더러를 찾으면 종속성이 생기고 통합 작업이 필요합니다. 바코드 라이브러리를 재평가하고IronBarcode일회성 비용으로 PDF를 기본적으로 읽을 수 있다는 사실을 발견하는 것이 종종 그 결과입니다.
포맷 미확인 프로덕션 시나리오
문서 업로드를 허용하는 고객 대면 애플리케이션은 업로드된 문서에서 사용하는 바코드 형식을 제어할 수 없습니다. 애플리케이션이 Code 128 입력을 가정하여 구축되었고 고객이 DataMatrix 레이블을 업로드하는 경우 하드코딩된 DecodeType.Code128는 자동으로 결과를 반환하지 않습니다. DecodeType.AllSupportedTypes로 변경하면 정확성은 유지되지만 성능 비용이 발생합니다.
프로덕션 환경에서 새로운 형식이 등장함에 따라 리더 구성에 DecodeType 값을 점점 더 많이 추가하는 문제를 겪은 팀은 새로운 형식 소스가 추가될 때마다 업데이트해야 하는 목록을 유지하게 되는 경우가 많습니다. IronBarcode의 자동 감지 기능 덕분에 해당 목록은 필요하지 않습니다.
클라우드 및 컨테이너 기반 배포
Aspose.BarCode의 파일 기반 라이선스는 배포 단계를 추가합니다. 라이선스 파일은 애플리케이션이 읽을 수 있는 경로에서 런타임 시 액세스할 수 있어야 합니다. GitOps 워크플로에서 라이선스 파일은 소스 제어 시스템에 포함되거나(보안 위험) 마운트된 비밀 볼륨을 통해 삽입되어야 합니다. IronBarcode의 키 기반 접근 방식은 컨테이너 이미지에서 관리해야 할 파일이 없으므로 Kubernetes 시크릿 및 CI/CD 시크릿 변수에 깔끔하게 통합됩니다.
일반적인 마이그레이션 고려사항
Aspose.BarCode에서IronBarcode로 전환하는 팀은 몇 가지 예측 가능한 기술적 조정 작업을 거치게 됩니다.
속성 이름 매핑
패키지 교체 후 가장 흔히 발생하는 컴파일 오류는 result.CodeText에서 result.Value로 이름이 바뀌는 경우입니다. 코드베이스 전체 검색을 통해 이 문제를 신속하게 해결할 수 있습니다.
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
result.CodeText는 result.Value가 됩니다. result.CodeTypeName은 result.Format.ToString()이 됩니다. result.Format 속성은 BarcodeEncoding 열거형 값으로, 필요한 경우 입력된 비교도 가능합니다.
디코드타입 제거
코드베이스의 모든 DecodeType.* 참조는 제거할 수 있습니다:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
알려진 형식의 성능을 개선하기 위해 특정 DecodeType가 나열된 경우, ReadingSpeed.Faster의 BarcodeReaderOptions는 형식 지식 없이도 유사한 이점을 제공합니다.
라이선스 초기화 변경
Aspose.BarCode는 .lic를 통해 로드된 license.SetLicense() 파일을 사용합니다.IronBarcode문자열 키를 사용합니다.
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"))
리포지토리에서 .lic 파일을 제거하고 아티팩트를 빌드하세요. Docker에서는 COPY Aspose.BarCode.lic 줄을 제거하고 ENV IRONBARCODE_LICENSE 항목으로 대체합니다.
EncodeTypes와 BarcodeEncoding 매핑
EncodeTypes.QR은 BarcodeEncoding.QRCode에 매핑됩니다. 이 이름 차이는 팀이 세대 코드를 마이그레이션한 후 가장 자주 컴파일 오류가 발생하는 곳입니다. 나머지 모든 매핑은 일관된 명명법을 사용하는 직접적인 동등물입니다.
IronBarcode추가 기능
핵심 비교 항목 외에도IronBarcode적용 맥락에 따라 유용할 수 있는 다음과 같은 기능을 제공합니다.
- 이미지당 다중 바코드 감지:
ExpectMultipleBarcodes = true는 단일 이미지에서 발견된 모든 바코드를 각각의 위치 좌표와 함께 반환합니다. - PDF에 바코드 삽입 : 별도의 PDF 라이브러리 없이 기존 PDF 페이지에 직접 바코드를 삽입할 수 있습니다.
- TIFF 다중 프레임 읽기 : 여러 페이지로 구성된 TIFF 파일의 모든 프레임에서 바코드를 한 번의 호출로 읽습니다.
- 스타일이 적용된 QR 코드 : 색상, 로고, 오류 수정 수준 모두 외부 이미지 처리 없이 Fluent 체인을 통해 설정됩니다.
- Azure Functions 및 AWS Lambda 지원 : 표준 라이선스를 사용하면 두 플랫폼 모두에서 서버리스 배포가 지원됩니다.
- 바이너리 데이터 인코딩 : 바이너리 페이로드 사용 사례를 위해 바이트 배열을 Data Matrix 또는 PDF417 바코드로 직접 인코딩합니다.
.NET 호환성 및 미래 준비
IronBarCode.NET Framework4.6.2 이상, .NET Core 3.1 이상, 그리고 .NET 5, 6, 7, 8, 9를 지원합니다. 이 라이브러리는 Microsoft의 .NET 릴리스 주기에 맞춰 정기적으로 업데이트되므로 2026년 말 출시 예정인 .NET 10과의 호환성을 보장합니다. Aspose.BarCode 또한 동일한 .NET 버전 범위를 지원하므로 현재 버전에서는 어느 라이브러리도 호환성 측면에서 우위를 점하지 않습니다. 미래 대비 측면에서 중요한 차이점은 라이선스입니다. 오늘 구매한 영구IronBarcode라이선스는 추가 비용 없이 향후 .NET 버전을 지원하는 반면, Aspose.BarCode 구독은 업데이트된 빌드에 액세스하려면 지속적인 갱신이 필요합니다.
결론
Aspose.BarCode와IronBarcode바코드 라이브러리 설계에 있어 서로 다른 두 가지 철학을 나타냅니다. Aspose.BarCode는 호출자가 형식을 지정하고, 객체 수명을 관리하며, 속성 계층 구조를 통해 각 작업을 구성하는 명시적인 인스턴스 기반 API를 기반으로 구축되었습니다.IronBarcode는 정적이고 형식에 구애받지 않는 API를 기반으로 구축되었으며, 라이브러리가 자체적으로 감지, 객체 수명 주기 및 PDF 렌더링을 처리합니다. 어느 접근 방식도 본질적으로 옳지 않으며, 올바른 선택은 애플리케이션의 요구 사항에 따라 달라집니다.
Aspose.BarCode는 이미 Aspose 생태계 내에서 운영 중인 팀에게 더 나은 선택입니다. Aspose.Total 라이선스가 이미 있는 경우 Aspose.BarCode는 추가 비용이 발생하지 않으며, 60개 이상의 심볼 목록은 시중에서 구할 수 있는 모든 .NET 바코드 라이브러리 중 가장 광범위합니다. MaxiCode, DotCode 또는 IronBarcode의 50개 이상 목록에 없는 특정 우편 기호와 같이 특이한 형식이 필요한 애플리케이션의 경우 Aspose.BarCode가 유일한 실행 가능한 옵션일 수 있습니다. 완성도와 다양한 형식을 아우르는 점은 진정한 강점입니다.
Aspose.BarCode를 단독 구매 제품으로 평가하는 팀의 경우, 가치 계산을 하기가 더 어렵습니다. 형식 지정 요구 사항은 모든 읽기 작업에 불편함을 더합니다. PDF를 기본적으로 지원하지 않는다는 점 때문에IronBarcode의 기본 패키지에 포함된 기능을 사용하기 위해 구독료가 두 배로 늘어납니다. 또한 구독 모델은 비용이 매년 복리로 증가한다는 것을 의미합니다. 10명의 개발자로 구성된 팀의 경우 연간 4,995달러를 지불하게 되므로 5년 동안 총 24,975달러가 소요됩니다. 반면IronBarcodeProfessional 일회성으로 구매할 경우 2,999달러입니다. IronBarcode의 자동 감지, 기본 PDF 읽기 기능 및 영구 라이선스는 이러한 세 가지 문제를 하나의 패키지로 해결합니다.
최종 결정은 생태계 적합성과 상징적 요구 사항에 달려 있습니다. Aspose 제품과 긴밀하게 통합된 팀이나 IronBarcode에서 지원하는 형식 외의 형식이 필요한 팀은 Aspose.BarCode를 사용하는 것이 좋습니다. 독립형 영구 라이선스, 기본 PDF 읽기 기능, 그리고 읽을 때마다 형식 정보를 알 필요가 없는 API를 원하는 팀에게는IronBarcode더 실용적인 선택이 될 것입니다.
자주 묻는 질문
.NET용 Aspose.BarCode란 무엇인가요?
.NET용 Aspose.BarCode는 C# 애플리케이션에서 바코드를 생성하고 판독하기 위한 .NET 바코드 라이브러리입니다. 개발자가 .NET 프로젝트용 바코드 솔루션을 선택할 때 평가하는 여러 대안 중 하나입니다.
.NET용 Aspose.BarCode와 IronBarcode의 주요 차이점은 무엇인가요?
일반적으로 인스턴스 관리가 필요 없는 정적 상태 비저장 API를 사용하는 반면, .NET용 Aspose.BarCode는 사용 전에 인스턴스 생성 및 구성이 필요합니다. 또한 IronBarcode는 모든 환경에서 기본 PDF 지원, 자동 형식 감지, 단일 키 라이선싱을 제공합니다.
IronBarcode가 Aspose.BarCode for .NET보다 라이선스 취득이 더 쉬운가요?
IronBarcode는 개발 및 프로덕션 배포를 모두 포괄하는 단일 라이선스 키를 사용합니다. 따라서 SDK 키와 런타임 키를 분리하는 라이선싱 시스템에 비해 CI/CD 파이프라인 및 Docker 구성이 간소화됩니다.
IronBarcode는 .NET용 Aspose.BarCode가 지원하는 모든 바코드 형식을 지원하나요?
IronBarcode는 QR코드, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 등 30개 이상의 바코드 심볼로지를 지원합니다. 형식 자동 감지 기능은 명시적인 형식 열거가 필요하지 않음을 의미합니다.
IronBarcode는 네이티브 PDF 바코드 판독을 지원하나요?
예. IronBarcode는 별도의 PDF 렌더링 라이브러리가 필요 없이 BarcodeReader.Read("document.pdf")를 사용하여 PDF 파일에서 직접 바코드를 판독합니다. 페이지별 결과에는 페이지 번호, 바코드 형식, 값 및 신뢰도 점수가 포함됩니다.
.NET용 Aspose.BarCode와 비교하여 IronBarcode는 일괄 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 자연스럽게 스레드에 안전하므로 스레드별 인스턴스 관리 없이 Parallel.ForEach를 직접 사용할 수 있습니다. 어떤 가격대에서도 처리량 상한선이 없습니다.
IronBarcode 어떤 .NET 버전을 지원하나요?
IronBarcode는 단일 NuGet 패키지로 .NET Framework 4.6.2+, .NET Core 3.1 및 .NET 5, 6, 7, 8, 9를 지원합니다. 플랫폼 대상에는 Windows x64/x86, Linux x64, macOS x64/ARM이 포함됩니다.
.NET 프로젝트에 IronBarcode를 설치하려면 어떻게 해야 하나요?
NuGet을 통해 IronBarcode 설치: 패키지 관리자 콘솔에서 'Install-Package IronBarCode'를 실행하거나 CLI에서 '닷넷 추가 패키지 IronBarCode'를 실행합니다. 추가 SDK 인스톨러나 런타임 파일은 필요하지 않습니다.
Aspose.BarCode와 달리 구매하기 전에 IronBarcode를 평가할 수 있나요?
예. IronBarcode의 평가판 모드는 완전한 디코딩된 바코드 값을 반환하며 생성된 출력 이미지에만 워터마크가 표시됩니다. 구매를 결정하기 전에 자신의 문서에서 판독 정확도를 벤치마킹할 수 있습니다.
Aspose.BarCode for .NET과 IronBarcode의 가격 차이는 무엇인가요?
개발 및 프로덕션을 포함하는 단일 개발자 영구 라이선스의 IronBarcode 가격은 $749부터 시작합니다. 가격 세부 정보 및 볼륨 옵션은 IronBarcode 라이선스 페이지에서 확인할 수 있습니다. 별도의 런타임 라이선스 요구 사항은 없습니다.
.NET용 Aspose.BarCode에서 IronBarcode로 마이그레이션하는 것은 간단하나요?
.NET용 Aspose.BarCode에서 IronBarcode로의 마이그레이션에는 주로 인스턴스 기반 API 호출을 IronBarcode의 정적 메서드로 대체하고, 라이선스 상용구를 제거하고, 결과 속성 이름을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션에는 코드를 추가하기보다는 줄이는 작업이 포함됩니다.
IronBarcode는 로고가 있는 QR 코드를 생성하나요?
예. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 구성 가능한 오류 수정을 통해 기본적으로 브랜드 이미지를 QR코드에 임베드합니다. ChangeBarCodeColor()를 통해 컬러 QR 코드도 지원됩니다.

