跳過到頁腳內容
與其他組件的比較

LEADTOOLS 條碼庫與 IronBarcode 比較:C# 條碼庫比較

若要在 Docker 中使用 LEADTOOLS 條碼,您需要將授權檔案掛載到容器中的特定路徑。 每次部署都必須攜帶該文件。 環境變數還不夠。 每次部署 LEADTOOLS 都是一個文件管理問題。

這並非對 LEADTOOLS 工程技術的批評——它反映的是一種 30 年前設計的授權架構,該架構是在容器技術出現之前設計的。 但到了 2026 年,當你的 CI/CD 管線需要建置並推送容器鏡像時,你要麼將 .LIC 檔案嵌入到鏡像中,要麼在運行時將其掛載為磁碟區。無論哪種方式,你的條碼庫都需要在初始化之前存取檔案系統。這就是本文要探討的根本權衡。

了解 LEADTOOLS 條碼

LEADTOOLS 條碼是 LEAD Technologies 綜合文件影像 SDK 的一部分,該 SDK 自 1990 年以來一直持續開發。條碼模組支援 40 多種條碼符號,並與更廣泛的 LEADTOOLS 生態系統緊密整合,用於 OCR、表單處理、PDF 操作和影像檢視。 當一個應用程式需要從單一供應商獲得所有這些功能時,這種生態系統整合就顯得尤為重要。 當需要在獨立的微服務或專用應用程式中進行條碼掃描時,相同的整合也會帶來額外的開銷,必須在每次部署中加以考慮。

圖書館的建築風格反映了它的年代。 LEADTOOLS 的設計時代是明確的資源管理、手動配置和基於檔案系統的授權模式。 這些設計決策在各自的背景下都是合理的。 在現代 .NET 開發中——容器化工作負載、CI/CD 管道、金鑰管理系統——這些決策會造成團隊必須積極克服的摩擦。

部署 LEADTOOLS 條碼至少需要五個 NuGet 套件。 PDF 條碼擷取功能則需要第六個套件。 在 Windows 系統上,主機上必須安裝 MSVC++ 2017 執行階段環境。 LEADTOOLS 條碼應用程式的最終輸出檔案大小約為 148 MB。

LEADTOOLS 條碼的關鍵架構特徵:

-基於檔案的授權架構:需要一個 .LIC 檔案物理存在於磁碟上的已知路徑中,以及一個開發者金鑰字串。 庫初始化時,這兩者必須均可存取。 -兩級授權模式:開發授權和部署授權分別定價和取得。 生產部署報價需聯絡 LEADTOOLS 銷售部門。 -多套件安裝:最小條碼安裝需要 Leadtools.BarcodeLeadtoolsLeadtools.CodecsLeadtools.Codecs.PngLeadtools.Codecs.Jpeg。 每增加一種圖像格式,就需要單獨的編解碼器套件。 -本機執行時期相依性: Windows 部署除了 .NET 執行階段之外,還需要 MSVC++ 2017 執行階段。 -明確符號宣告:條碼讀取需要傳遞一個 BarcodeSymbology 枚舉值數組,指定要掃描的格式。 省略的格式將無法被偵測到。 -分層初始化序列:載入許可證檔案後,應用程式必須驗證許可證是否已過期,並且每個必需的功能(1D 讀取、2D 讀取、寫入)是否已單獨解鎖,然後才能建立 BarcodeEngine。 -支援 40 多種符號體系:作為綜合成像平台的一部分,對 1D 和 2D 條碼類型具有強大的格式覆蓋範圍。

基於文件的許可架構

LEADTOOLS 初始化大約需要 20 行程式碼,然後才能執行第一個條碼操作。 此序列涵蓋檔案路徑解析、過期驗證和每個功能的鎖定檢查:

// LEADTOOLS: 20行以上 before the first barcode operation
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: 20行以上 before the first barcode operation
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: 20行以上 before the first barcode operation
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()
$vbLabelText   $csharpLabel

此初始化區塊必須成功執行,任何條碼讀取或寫入操作才能生效。 如果 .LIC 檔案不存在、路徑不正確或檔案權限錯誤,LEADTOOLS 將不會初始化-不會靜默地停止,而是會錯誤導致操作停止。

了解 IronBarcode

IronBarcode是一個專注於 .NET 條碼的函式庫,專門用於在 .NET 應用程式中讀取和產生條碼。IronBarcode不是大型成像 SDK 中的一個模組,而是以條碼功能為主要目的。 該庫以單一 NuGet 套件的形式分發,其中包含所有圖像格式支援、原生 PDF 條碼提取和基於 ML 的錯誤修正,而無需額外的編解碼器套件或原生運行時依賴項。

IronBarcode採用靜態API設計。 對 BarcodeReaderBarcodeWriter 進行讀寫操作是作為靜態方法呼叫提供的,無需建立實例或初始化物件。 許可證啟動只需賦值一個字串即可。 該程式庫可自動偵測所有 50 多種支援的條碼格式,無需在每次讀取操作之前列舉預期格式。

本函式庫適用於.NET Standard 2.0及更高版本,相容於 .NET Framework 4.6.2+、.NET 5、.NET 6、.NET 7、.NET 8 和 .NET 9。在任何支援的作業系統上,都不需要特定於平台的本機運行時。

IronBarcode的主要特點:

-字串金鑰許可:許可證啟動需要單一字串賦值。 密鑰可以來自環境變數、設定檔、密鑰管理器或任何提供字串值的來源。 -單一 NuGet 套件:所有影像格式支援、PDF 擷取和條碼功能都包含在 IronBarcode 中。 無需額外安裝解碼器套件。 -靜態 Fluent API: BarcodeReader.Read()BarcodeWriter.CreateBarcode() 是靜態入口點。 無需建立引擎實例或編解碼器物件。 -自動格式偵測:可讀取所有 50 多種支援的符號體系,而無需呼叫者指定預期格式。 -內建 PDF 支援:基本軟體包中包含 PDF 條碼擷取功能,無需額外安裝。 -支援 50 多種條碼符號:涵蓋所有主要的 1D 和 2D 條碼格式,包括 Code 128、Code 39、QR Code、Data Matrix、PDF417、EAN-13 和 UPC-A。

  • ML 糾正錯誤:基於機器學習的影像糾錯可提高損壞或低品質條碼影像的讀取準確率。

功能比較

下表列出了 LEADTOOLS 條碼和IronBarcode之間的根本差異:

特點 LEADTOOLS 條碼 IronBarcode
許可模式 文件 + 密鑰(雙層) 僅限密鑰(單層)
SDK佔用空間 5 個以上軟體包 + 原生運行時 1 包
初始化程式碼 20行以上 1 行
Docker部署 文件掛載要求 環境變數
PDF條碼擷取 單獨包裝 內建
自動檢測格式 限額
總符號學 40歲以上 50歲以上
機器學習誤差校正

詳細功能比較

特點 LEADTOOLS 條碼 IronBarcode
授權
許可模式 文件 + 開發者金鑰 僅字串鍵
許可證等級 開發 + 部署(分開進行) 單一永久許可證
部署定價 聯絡銷售人員 出版價格
環境變數中的許可證 部分(僅密鑰,仍需文件)
許可證 秘密管理器 文件仍需保留 是的(僅限字串)
安裝
需要 NuGet 套件 5歲以上 1
原生運行時依賴項 MSVC++ 2017(Windows)
PDF 支援包 分開(Leadtools.Codecs.Pdf 包括
發布輸出大小 約 148 MB 約 39 MB
閱讀
一維符號體系 25歲以上 30+
二維符號系統 15歲以上 15歲以上
自動檢測格式 限額
需要明確聲明符號體系
PDF條碼擷取 是的(單獨包裝) 是的(內建)
機器學習誤差校正
多條碼檢測
世代
代碼 128 生成
二維碼生成
QR 圖碼標誌品牌推廣
流暢產生 API
輸出格式 PNG、JPEG、BMP PNG、JPEG、BMP、SVG、HTML、PDF
API 設計
API 風格 遺留物件圖 靜態流暢
初始化行 20歲以上 1
圖片載入層 柵格編解碼器(單獨) 自動化
平台
跨平台 部分(原生依賴項) 完整版(.NET 標準)
Docker/容器支持 文件掛載要求 環境變數
.NET Standard 2.0
.NET 8 / .NET 9

授權架構

對於部署到現代基礎架構的團隊來說,這兩個函式庫之間最重要的差異在於授權架構。

LEADTOOLS 方法

LEADTOOLS 許可證要求文件系統中已知路徑上存在一個 .LIC 文件,以及一個傳遞給 RasterSupport.SetLicense 的開發者金鑰字串。 呼叫 SetLicense 後,應用程式必須驗證許可證是否已過期,並且每個條碼功能是否已單獨解鎖。 只有所有檢查都通過後,才能建立 BarcodeEngine

// LEADTOOLS: 20行以上 before the first barcode operation
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: 20行以上 before the first barcode operation
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: 20行以上 before the first barcode operation
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()
$vbLabelText   $csharpLabel

這種基於文件的模型早於現代密鑰管理系統。 必須在應用程式運行的每個環境中配置 .LIC 檔案:開發人員機器、CI 建置代理程式、暫存伺服器和生產主機。

IronBarcode方法

IronBarcode 的許可證初始化程式碼只有一行:

// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
$vbLabelText   $csharpLabel

該密鑰可以來自環境變數、設定檔或金鑰管理器——任何可以產生字串的地方。 無需查找文件,無需寫入過期檢查,也無需驗證功能鎖定。 對於許可證設定和部署選項,文件涵蓋所有模式:環境變數、appsettings.json、Azure Key Vault 等。

Docker 和容器部署

編寫 Dockerfile 時,許可證架構的差異就變得具體。

LEADTOOLS 方法

LEADTOOLS Docker 部署需要將 .LIC 檔案複製到容器映像中,或在執行時間將其掛載為磁碟區:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

# The license file must be physically present in the container
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"]

這種方法會帶來後續的併發症。 輪換或撤銷許可證金鑰需要重建映像或重新掛載磁碟區。 CI/CD 管線必須檢入 .LIC 文件,或在建置時從 base64 編碼的金鑰中解碼該文件。原本設計用於儲存鍵值對的 Kubernetes 金鑰現在需要儲存檔案內容。 運行臨時容器的團隊必須解決每個新節點上的檔案配置問題。

IronBarcode方法

IronBarcode 不需要容器內的任何檔案:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

ENV IRONBARCODE_LICENSE=your-license-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

環境變數模型原生支援 Docker secrets、Kubernetes secrets、AWS Secrets Manager、Azure Key Vault 和 HashiCorp Vault——任何可以將字串注入容器環境的系統。 我們提供了完整的Docker 和 Linux 部署指南,涵蓋 Alpine 和 Debian 基礎映像。

條碼讀取

LEADTOOLS 方法

LEADTOOLS 讀取需要建立一個 RasterCodecs 實例來載入影像,建立一個 BarcodeEngine 實例來掃描影像,以及 BarcodeSymbology 值的明確陣列來指定要尋找的格式。 如果數組中省略了某種條碼符號,則 LEADTOOLS 將無法偵測到該類型的條碼:

// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

return barcodes.Select(b => b.Value).ToArray();
// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

return barcodes.Select(b => b.Value).ToArray();
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim barcodes As IEnumerable(Of BarcodeData)
Using codecs As New RasterCodecs()
    Using image As RasterImage = codecs.Load(imagePath)
        Dim engine As New BarcodeEngine()

        Dim symbologies As BarcodeSymbology() = {
            BarcodeSymbology.Code128,
            BarcodeSymbology.QR,
            BarcodeSymbology.DataMatrix,
            BarcodeSymbology.EAN13,
            BarcodeSymbology.UPCA
        }

        barcodes = engine.Reader.ReadBarcodes(
            image,
            LogicalRectangle.Empty,
            0,
            symbologies)
    End Using
End Using

Return barcodes.Select(Function(b) b.Value).ToArray()
$vbLabelText   $csharpLabel

IronBarcode方法

IronBarcode 可自動偵測所有 50 多種支援的條碼格式。 文件路徑直接傳遞; 無需圖像載入圖層或符號系統數組:

// IronBarcode: auto-detect, no object setup
using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
// IronBarcode: auto-detect, no object setup
using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
Imports IronBarCode

Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
$vbLabelText   $csharpLabel

有關讀取選項、調整速度與準確性以及處理複雜圖像的更多詳細信息,請參閱《從圖像讀取條碼指南》,其中涵蓋了完整的 API 介面。

條碼生成

LEADTOOLS 方法

LEADTOOLS 條碼產生需要建立一個 BarcodeData 對象,包含符號系統、值和邊界 — 然後建立一個空白的 RasterImage 對象,包含明確的像素尺寸、位元深度、位元組順序和視圖透視 @最後使用 RasterCodecs 物件儲存。 這是針對多種物件類型的五種不同操作:

// LEADTOOLS: 5 operations, 25歲以上 lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
    Value = data,
    Bounds = new LeadRect(0, 0, 400, 100)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 100, 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, outputPath, RasterImageFormat.Png, 0);
// LEADTOOLS: 5 operations, 25歲以上 lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
    Value = data,
    Bounds = new LeadRect(0, 0, 400, 100)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 100, 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, outputPath, RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim barcodeData As New BarcodeData(BarcodeSymbology.Code128) With {
    .Value = data,
    .Bounds = New LeadRect(0, 0, 400, 100)
}

Using image As New RasterImage(RasterMemoryFlags.Conventional, 400, 100, 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, outputPath, RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

IronBarcode方法

IronBarcode 在內部處理影像建立、背景填充和編碼:

// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng(outputPath);
// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng(outputPath);
Imports IronBarcode

BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

IronBarcode API 在建立條碼影像時,透過流暢的鍊式呼叫而非一系列命令式設定物件來公開樣式、邊距、旋轉和格式轉換。

API 對應參考。

LEADTOOLS 條碼 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() 靜態 — 無實例 BarcodeReaderBarcodeWriter 是靜態的
new RasterCodecs() (removed) 直接傳遞文件路徑
codecs.Load(imagePath) (removed) 直接傳遞文件路徑
engine.Reader.ReadBarcodes(image, rect, 0, symbologies) BarcodeReader.Read(imagePath) 自動偵測符號體系
BarcodeData.Value result.Value 相同的屬性名稱
BarcodeData.Symbology result.Format 物業已更名
new BarcodeData(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 同名
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) .SaveAsPng(path) 一種方法鏈
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) (removed) IronBarcode內部

當團隊考慮從 LEADTOOLS 條碼遷移到IronBarcode時

容器和雲端部署

將工作負載移轉到 Docker、Kubernetes 或無伺服器環境的團隊會遇到基於檔案的授權模式這一具體的營運問題。 每個新的容器實例、每個新的雲端區域和每個新的環境都必須在應用程式啟動之前配置並可存取 .LIC 檔案。 為字串值金鑰設計的金鑰管理系統無法很好地處理基於檔案的金鑰。 已經將環境變數注入作為配置標準的團隊發現,LEADTOOLS 需要一個單獨的配置步驟,該步驟存在於他們正常的金鑰工作流程之外。 當部署規模成長時——自動擴展、藍綠部署、多區域複製——檔案配置的營運成本也會隨之成長。

SDK 佔用空間和相依性管理

當條碼讀取或產生是服務的主要或唯一要求時,五包 LEADTOOLS 安裝和 MSVC++ 2017 運行時依賴項會帶來開銷,影響容器鏡像大小、無伺服器函數中的冷啟動延遲以及 CI/CD 管道中的建置時間。 建立輕量級微服務或 Lambda 式函數的團隊發現,引入完整的圖像 SDK 來解決條碼的特定需求會造成依賴關係,這在程式碼審查和架構審查中很難得到證明。 當未來的平台升級需要測試原生運行時依賴項變更時,這項工作將由維護服務的團隊負責。

定價透明度

開發團隊需要在開始開發之前製定專案預算,但無法從 LEADTOOLS 公佈的價格中獲得完整的成本資訊。 開發許可證的價格為每位開發人員每年 1,295 美元至 1,469 美元,但伺服器應用程式的生產部署許可證需透過銷售部門單獨報價。 由五名開發人員組成的團隊,需要向三個生產伺服器交付產品,他們必須先獲得客製化報價,才能確認 LEADTOOLS 是否符合他們的預算。 喜歡根據公佈的價格做出採購決策的團隊(比較各種方案、獲得內部批准或製定多年預算)發現,這種模式需要在評估完成之前進行銷售對話。

僅條碼要求

需要讀取或產生條碼但不需要 OCR、DICOM 成像、文件註釋或 LEADTOOLS 套件中的其他功能的應用程序,實際上是在為超出其需求範圍的平台付費。 LEADTOOLS 的整合價值——即在其 OCR、條碼和文件處理模組之間傳遞資料的能力——是真實存在的,但只有當該套件中的多個功能處於活躍使用狀態時,它才能發揮作用。 當需求僅限於在 Web API 中掃描條碼或在文件處理流程中產生條碼時,一個專注於條碼的函式庫可以直接滿足需求,而無需承擔綜合影像平台的負擔。

常見的遷移考量

許可證初始化替換

整個 LEADTOOLS 初始化區塊(包括檔案路徑、過期檢查和每個功能的鎖定驗證)都被替換為一行程式碼。IronBarcode許可證金鑰可以儲存在任何儲存字串的金鑰管理系統中:

// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
' Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

Docker 環境變數模式

任何 Dockerfile 中的 COPY LEADTOOLS.LIC 行都會完全刪除。 許可證在運行時透過環境變數提供,可與所有標準密鑰注入機製搭配使用:

# Remove: COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC
# Remove: ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
# Add:
ENV IRONBARCODE_LICENSE=your-license-key

包裹移除

五個 LEADTOOLS 軟體包(以及可選的 PDF 編解碼器)被移除,並替換為一個單獨的軟體包:

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
# If added:
dotnet remove package Leadtools.Codecs.Pdf

dotnet add package IronBarcode
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
# If added:
dotnet remove package Leadtools.Codecs.Pdf

dotnet add package IronBarcode
SHELL

IronBarcode的其他功能

除了以上各節介紹的功能外,IronBarcode 還提供以下與常見的 .NET 條碼應用程式場景相關的功能:

  • PDF 條碼擷取從多頁 PDF 文件中讀取條碼,自動進行頁面迭代,並對每個結果進行報告-無需頁面循環。 -基於機器學習的錯誤修正機器學習影像預處理無需額外配置即可提高對損壞、低對比度或旋轉的條碼影像的讀取準確率。 -非同步批次處理 BarcodeReader.ReadAsync() 支援非同步讀取,從而實現高吞吐量批次處理,而不會阻塞執行緒。
  • QR 碼 Logo 品牌 QRCodeWriter 支援透過一次方法呼叫將徽標圖像嵌入 QR 碼中心,並使用內建糾錯功能來保持可掃描性。
  • SVG 和 HTML 輸出 BarcodeWriter 除了光柵圖片格式外,還可以將產生的條碼輸出為可縮放的 SVG 檔案或內嵌 HTML 元素。 -條碼讀取器選項調整讀取速度、預期符號提示、多條碼偵測和影像預處理均可針對每次讀取進行配置,而不會影響全域狀態。

.NET相容性與未來準備

IronBarcode 針對 .NET Standard 2.0,相容於 .NET Framework 4.6.2 及更高版本、.NET 5、.NET 6、.NET 7、.NET 8 和 .NET 9。該程式庫沒有特定於平台的本機執行時間要求,無需額外的設定步驟即可部署在 Windows、Linux 和 macOS 上。 隨著 .NET 10 的普及,IronBarcode 的定期發布節奏確保了與當前和即將推出的 .NET 版本的兼容性。 靜態 API 設計和單包分發模型在各個版本中保持穩定,因此版本升級不需要更改應用程式初始化程式碼或部署配置。

結論

LEADTOOLS 條碼和IronBarcode代表了 .NET 條碼庫設計空間中的不同點。 LEADTOOLS 是一個擁有 30 年歷史的綜合圖像處理 SDK 中的一個模組,它採用基於文件的許可架構、多軟體包安裝和反映其構建時代的傳統 API 設計。IronBarcode是一個專為現代 .NET 建構的條碼庫,採用單包安裝、字串金鑰許可和靜態 API,無需初始化物件。

當應用程式已經使用 LEADTOOLS 來實現其他功能(例如 OCR、DICOM 成像、文件註釋或表單識別)時,LEADTOOLS 條碼是合適的選擇。 在這些情況下,透過相同 SDK 添加條碼功能,無需引入新的供應商或新的許可關係,即可擴展現有投資。已與 LEADTOOLS 簽訂企業協議的組織可能會發現,條碼功能的邊際成本很低。對於真正需要 LEADTOOLS 成像平台全功能的應用而言,跨模組的整合價值是實實在在的。

當條碼讀取或產生是服務的主要或唯一要求時,當應用程式部署到容器或雲端原生基礎設施時,或者當團隊需要在開始開發之前獲得可預測的價格時,IronBarcode 是合適的選擇。 單包安裝和環境變數授權模型與現代 .NET 服務的配置、部署和擴充方式相符。 流暢的靜態 API 減少了條碼功能所需的初始化和操作程式碼。

這兩個函式庫之間的實際差異在部署場景中體現得最為明顯。 當團隊新增環境、擴展到新的雲端區域或輪換許可證憑證時,IronBarcode 需要更新金鑰管理員中的字串。 LEADTOOLS 需要設定一個檔案。這種差異並非對 LEADTOOLS 工程設計的批評,而是對每種架構所需功能的描述。 團隊在進行客觀評估時,應將該描述直接應用於自身的部署模型,並決定哪種模型較為合適。

常見問題解答

什麼是 LEADTOOLS 條碼?

LEADTOOLS Barcode 是一個 .NET 條碼庫,用於在 C# 應用程式中產生和讀取條碼。它是開發人員在為 .NET 專案選擇條碼解決方案時評估的幾個替代方案之一。

LEADTOOLS Barcode 和 IronBarcode 的主要差異是什麼?

IronBarcode 使用靜態、無狀態的 API,無需實例管理,而 LEADTOOLS Barcode 通常需要在使用前建立和設定實例。 IronBarcode 還提供原生 PDF 支援、自動格式偵測以及跨所有環境的單金鑰許可。

IronBarcode 的授權是否比 LEADTOOLS Barcode 更容易?

IronBarcode 使用單一授權金鑰,同時涵蓋開發和生產部署。與將 SDK 金鑰與執行時間金鑰分開的授權系統相比,這簡化了 CI/CD 管線和 Docker 配置。

IronBarcode 是否支援 LEADTOOLS Barcode 支援的所有條碼格式?

IronBarcode 支援超過 30 種條碼符號體系,包括 QR 碼、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自動偵測功能意味著無需明確枚舉格式。

IronBarcode是否支援原生PDF條碼讀取?

是的。 IronBarcode 可以直接從 PDF 檔案讀取條碼,使用 `BarcodeReader.Read("document.pdf")` 方法,無需單獨的 PDF 渲染庫。每頁的讀取結果包括頁碼、條碼格式、數值和置信度評分。

與 LEADTOOLS 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”,或在命令列介面中執行“dotnet add package IronBarCode”。無需其他 SDK 安裝程式或運行時檔案。

與 LEADTOOLS 不同,我可以在購買前評估 IronBarcode 嗎?

是的。 IronBarcode 的試用模式會傳回完整的解碼條碼值-只有產生的輸出影像才會有浮水印。您可以在購買前,用自己的文件測試讀取準確率。

LEADTOOLS Barcode 和 IronBarcode 的價格有什麼不同?

IronBarcode 的永久單開發者許可證起價為 749 美元,涵蓋開發和生產環境。定價詳情和大量許可選項請造訪 IronBarcode 授權頁面。無需單獨的運行時許可證。

從 LEADTOOLS Barcode 遷移到 IronBarcode 是否簡單?

從 LEADTOOLS Barcode 遷移到 IronBarcode 主要涉及將基於實例的 API 呼叫替換為 IronBarcode 的靜態方法、移除許可相關的樣板代碼以及更新結果屬性名稱。大多數遷移都是減少程式碼,而不是增加程式碼。

IronBarcode 能產生帶有 logo 的二維碼嗎?

是的。 `QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以將品牌圖片原生嵌入二維碼中,並支援設定糾錯功能。此外,它還支援透過 `ChangeBarCodeColor()` 函數建立彩色二維碼。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我