Lector de códigos de barras Dynamsoft vs IronBarcode: Comparación de bibliotecas de códigos de barras C#
El lector de códigos de barras Dynamsoft es realmente excelente para aquello para lo que fue diseñado: leer códigos de barras desde una transmisión de cámara en directo a 30 fotogramas por segundo. Los algoritmos son rápidos, la compatibilidad con simbología es amplia y el SDK móvil que lo integra en iOS y Android es una de las mejores opciones en ese ámbito. Si su producto es una aplicación de escaneo de almacén en la que un trabajador apunta su teléfono a la etiqueta de un palé y espera un reconocimiento en menos de 100 ms, Dynamsoft es una opción fiable.
Si sus códigos de barras están en archivos PDF en un servidor que no puede llegar a Internet, la biblioteca no se ajusta al caso de uso - y la validación de la licencia se lo recordará en cada inicio. BarcodeReader.InitLicense hace una llamada de red al servidor de licencias de Dynamsoft. En un centro de datos aislado físicamente, una VPC aislada o cualquier entorno donde el acceso saliente a Internet esté restringido, esa llamada falla antes de que se haya decodificado un solo código de barras. La alternativa sin conexión —obtener un archivo de licencia específico para el dispositivo vinculado a un UUID del soporte técnico de Dynamsoft— funciona, pero añade una sobrecarga operativa que la mayoría de los flujos de trabajo de procesamiento de documentos no habían previsto.
Esta comparación se centra en la adecuación al caso de uso, no en la calidad de la biblioteca. Dynamsoft creó una biblioteca centrada en la cámara y lo hizo muy bien. La cuestión es si las premisas que priorizan la cámara se traducen en un flujo de trabajo de procesamiento de documentos del lado del servidor.
Comprensión del lector de códigos de barras Dynamsoft
La arquitectura de Dynamsoft refleja su origen en el mundo de las cámaras. La secuencia de inicio requiere una validación de licencia en línea, el modelo de configuración incluye valores de tiempo de espera optimizados para el procesamiento de fotogramas en tiempo real y la API expone conceptos como DeblurLevel que existen específicamente para las condiciones de enfoque variable y desenfoque de movimiento de una cámara portátil:
// Dynamsoft: license server call required at startup
using Dynamsoft.DBR;
// This call contacts Dynamsoft's license server — fails in air-gapped environments
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
throw new InvalidOperationException($"License validation failed: {errorMsg}");
var reader = new BarcodeReader();
// Settings tuned for camera frame processing
var settings = reader.GetRuntimeSettings();
settings.DeblurLevel = 5; // compensates for camera motion blur
settings.ExpectedBarcodesCount = 1; // camera focus: one barcode at a time
settings.Timeout = 100; // 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings);
// Dynamsoft: license server call required at startup
using Dynamsoft.DBR;
// This call contacts Dynamsoft's license server — fails in air-gapped environments
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
throw new InvalidOperationException($"License validation failed: {errorMsg}");
var reader = new BarcodeReader();
// Settings tuned for camera frame processing
var settings = reader.GetRuntimeSettings();
settings.DeblurLevel = 5; // compensates for camera motion blur
settings.ExpectedBarcodesCount = 1; // camera focus: one barcode at a time
settings.Timeout = 100; // 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings);
Imports Dynamsoft.DBR
' Dynamsoft: license server call required at startup
' This call contacts Dynamsoft's license server — fails in air-gapped environments
Dim errorCode As Integer = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.DBR_OK, Integer) Then
Throw New InvalidOperationException($"License validation failed: {errorMsg}")
End If
Dim reader As New BarcodeReader()
' Settings tuned for camera frame processing
Dim settings = reader.GetRuntimeSettings()
settings.DeblurLevel = 5 ' compensates for camera motion blur
settings.ExpectedBarcodesCount = 1 ' camera focus: one barcode at a time
settings.Timeout = 100 ' 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings)
Esta es una API bien diseñada para su propósito. La configuración Timeout = 100 tiene sentido cuando se procesan 30 fotogramas por segundo de una cámara y no se puede permitir gastar 500 ms en un solo fotograma. Para un servidor que procesa un PDF subido, un tiempo de espera de 100 ms es una limitación que no tiene ninguna utilidad y puede provocar fallos en la lectura de códigos de barras más densos.
El diseño basado en instancias - new BarcodeReader(), reader.Dispose()- sigue la semántica de sesión de cámara: se abre una sesión, se procesan tramas, se cierra la sesión. Para el procesamiento de archivos, este ciclo de vida añade código repetitivo sin ningún beneficio.
El problema del PDF
Dynamsoft Barcode Reader no tiene soporte nativo para PDF. Cuando la entrada es un archivo PDF, su código debe primero convertir cada página en una imagen y luego pasar esa imagen a Dynamsoft. Esto requiere una biblioteca de renderizado de PDF independiente (PdfiumViewer es de uso común), que agrega una dependencia de NuGet , una dependencia binaria nativa (pdfium.dll en Windows o libpdfium en Linux) y un bucle de renderizado alrededor de cada operación de PDF:
// Dynamsoft PDF processing — requires PdfiumViewer (external dependency)
// dotnet add package PdfiumViewer
// dotnet add package PdfiumViewer.Native.x86_64.v8-xfa (platform-specific)
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to Dynamsoft
TextResult[] barcodes = reader.DecodeFileInMemory(imageBytes, "");
foreach (var b in barcodes)
results.Add(b.BarcodeText);
}
}
return results;
}
// Dynamsoft PDF processing — requires PdfiumViewer (external dependency)
// dotnet add package PdfiumViewer
// dotnet add package PdfiumViewer.Native.x86_64.v8-xfa (platform-specific)
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to Dynamsoft
TextResult[] barcodes = reader.DecodeFileInMemory(imageBytes, "");
foreach (var b in barcodes)
results.Add(b.BarcodeText);
}
}
return results;
}
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports Dynamsoft.DBR
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results As New List(Of String)()
Using pdfDoc = PdfDocument.Load(pdfPath)
For page As Integer = 0 To pdfDoc.PageCount - 1
' Render each page at 300 DPI
Using image = pdfDoc.Render(page, 300, 300, True)
Using ms As New MemoryStream()
image.Save(ms, ImageFormat.Png)
Dim imageBytes As Byte() = ms.ToArray()
' Now pass rendered image bytes to Dynamsoft
Dim barcodes As TextResult() = reader.DecodeFileInMemory(imageBytes, "")
For Each b In barcodes
results.Add(b.BarcodeText)
Next
End Using
End Using
Next
End Using
Return results
End Function
Esto implica tres dependencias (Dynamsoft, PdfiumViewer y un binario nativo específico de la plataforma), un bucle de renderizado por página y un consumo de memoria considerable para documentos con muchas páginas.
IronBarcode lee directamente desde un archivo PDF:
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package IronBarcode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package IronBarcode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
' IronBarcode: PDF is native — no extra library, no render loop
' NuGet: dotnet add package IronBarcode
Dim results = BarcodeReader.Read("invoice.pdf")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
Una llamada. No hay renderizador de PDF. Sin bucle por página. Sin binario nativo específico de la plataforma para la compatibilidad con PDF.
Complejidad de la licencia
La validación de licencias en línea es sencilla cuando el servidor tiene acceso a internet. Cuando esto no ocurre, o cuando las políticas de red requieren la inclusión explícita en la lista de permitidos de los hosts salientes, la superficie de fallo de validación aumenta:
// Dynamsoft: error code pattern required
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
{
// Handle: network timeout, license server unreachable, invalid key,
// expired key, device count exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
// Dynamsoft: error code pattern required
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
{
// Handle: network timeout, license server unreachable, invalid key,
// expired key, device count exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
Imports System
' Dynamsoft: error code pattern required
Dim errorCode As Integer = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.DBR_OK, Integer) Then
' Handle: network timeout, license server unreachable, invalid key,
' expired key, device count exceeded, etc.
Throw New InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}")
End If
La concesión de licencias sin conexión con Dynamsoft requiere un flujo de trabajo independiente. Usted llama al BarcodeReader.OutputLicenseToString() para recuperar el UUID del dispositivo, envía ese UUID al soporte de Dynamsoft para recibir un archivo de licencia específico del dispositivo, luego activa usando InitLicenseFromLicenseContent:
// Dynamsoft offline license — device UUID required
string uuid = BarcodeReader.OutputLicenseToString();
// Send uuid to Dynamsoft support → receive licenseContent string
int errorCode = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, out string errorMsg);
// Dynamsoft offline license — device UUID required
string uuid = BarcodeReader.OutputLicenseToString();
// Send uuid to Dynamsoft support → receive licenseContent string
int errorCode = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, out string errorMsg);
' Dynamsoft offline license — device UUID required
Dim uuid As String = BarcodeReader.OutputLicenseToString()
' Send uuid to Dynamsoft support → receive licenseContent string
Dim errorCode As Integer = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, errorMsg)
En un entorno Docker, donde los contenedores son efímeros y los UUID cambian en cada despliegue, esto genera un trabajo operativo constante. Cada contenedor que se inicie puede necesitar un nuevo UUID registrado con el soporte de Dynamsoft.
La activación de la licencia de IronBarcode es una asignación única que se evalúa localmente:
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY";
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY";
' IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY"
No hay código de error que comprobar. Sin dependencia de red. No se requiere registro por dispositivo. La misma línea funciona en una máquina de desarrollo, una canalización de CI/CD, un contenedor Docker y un servidor aislado de la red.
Casos de uso de la cámara frente a los archivos
En resumen, Dynamsoft e IronBarcode están optimizados para diferentes escenarios principales. La tabla que aparece a continuación describe esto claramente, en lugar de declarar que una biblioteca es universalmente mejor:
| Escenario | Lector de códigos de barras Dynamsoft | IronBarcode |
|---|---|---|
| Transmisión de cámara en directo (30 fps) | Excelente: optimizado para tiempo real. | No es el caso de uso principal |
| SDK móvil (iOS/Android) | SDK completo disponible | Solo .NET |
| Procesamiento de archivos del lado del servidor | Funciona, pero requiere soluciones alternativas. | Caso de uso principal |
| Lectura de códigos de barras PDF | Requiere un renderizador de PDF externo. | Soporte nativo |
| Implementación aislada de la red | Requiere UUID del dispositivo + compatibilidad con Dynamsoft | Funcionamiento inmediato |
| Docker / contenedores efímeros | Gestión de UUID por contenedor | Variable de entorno única |
| Licencia sin conexión | Archivo específico del dispositivo del soporte de Dynamsoft | Clave de licencia estándar |
| API de ASP.NET Core | Obras (texto estándar de licencia adicional) | Funciona de forma limpia |
| Funciones Azure | Se requiere una política de red para license.dynamsoft.com | No requiere conexión a internet. |
| Generación de BarCodes | No, solo lectura | Sí, generación y lectura |
| Generación de código QR | No | Sí — QRCodeWriter |
Entendiendo IronBarcode
IronBarcode es una biblioteca .NET para generar y leer códigos de barras. La API es estática: no hay instancias, ni llamadas de eliminación, ni ciclo de vida de sesión. La activación de la licencia es local. La compatibilidad con archivos PDF está integrada:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
Número máximo de subprocesos paralelos = 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
Número máximo de subprocesos paralelos = 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
Imports IronBarCode
' License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY"
' Read from an image file
Dim results = BarcodeReader.Read("label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
' Read from a PDF — native, no extra library
Dim pdfResults = BarcodeReader.Read("manifest.pdf")
' Read with options for high-accuracy or high-throughput scenarios
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options)
La generación es igualmente sencilla:
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
Imports System
' Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("shipping-label.png")
' Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("tracking-qr.png")
' Get bytes for HTTP response
Dim bytes As Byte() = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Comparación de características
| Característica | Lector de códigos de barras Dynamsoft | IronBarcode |
|---|---|---|
| Lectura de BarCodes | Sí, optimizado para cámara. | Sí, optimizado para archivos y documentos. |
| Generación de BarCodes | No | Sí |
| Generación de código QR | No | Sí — QRCodeWriter |
| Compatibilidad nativa con PDF | No, requiere un renderizador externo. | Sí — BarcodeReader.Read(pdf) |
| Validación de licencia | En línea (servidor de licencias) | Local |
| Aislado de la red / sin conexión | Se requiere el UUID del dispositivo y soporte de Dynamsoft. | Clave estándar, funciona sin conexión. |
| Docker / contenedor | Gestión de UUID por instancia de contenedor | Variable de entorno única |
| Funciones Azure | Se requiere una política de red de salida | No requiere conexión a internet. |
| AWS Lambda | Se requiere una política de red de salida | No requiere conexión a internet. |
| SDK móvil | Disponible para iOS y Android. | Solo .NET |
| Cámara en tiempo real (30 fps) | Objetivo de diseño principal | No está diseñado para esto |
| Código 128 | Sí | Sí |
| Código QR | Sí (leyendo) | Sí (lectura y generación) |
| Matriz de datos | Sí | Sí |
| PDF417 | Sí | Sí |
| azteca | Sí | Sí |
| EAN / UPC | Sí | Sí |
| Gestión de instancias | nuevo lector de códigos de barras() + Dispose() | Estático: ninguna instancia |
| Lectura de múltiples códigos de barras | Cantidad esperada de códigos de barras | ExpectMultipleBarcodes = true |
| Control de velocidad de lectura | Tiempo de espera + Nivel de desenfoque | Enumeración de velocidad de lectura |
| Lectura paralela | Enhebrado manual | Número máximo de subprocesos paralelos |
| Modelo de precios | Suscripción | Perpetuo desde $749 |
| Compatibilidad con .NET | .NET Standard, .NET 5+ | .NET 4.6.2 a .NET 9 |
| Plataformas | Windows, Linux, macOS | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
Referencia de mapeo de API
Para equipos que tienen código Dynamsoft y necesitan comprender cómo se traducen los conceptos:
| Lector de códigos de barras Dynamsoft | IronBarcode |
|---|---|
BarcodeReader.InitLicense(key, out errorMsg) |
IronBarCode.License.LicenseKey = "key" |
errorCode != (int)EnumErrorCode.DBR_OK comprobar |
No es necesario |
BarcodeReader.OutputLicenseToString() (UUID) |
No es necesario |
BarcodeReader.InitLicenseFromLicenseContent(content, uuid) |
No es necesario |
new BarcodeReader() |
Estático: ninguna instancia |
reader.Dispose() |
No es necesario |
reader.DecodeFile(imagePath, "") |
BarcodeReader.Read(imagePath) |
reader.DecodeFileInMemory(bytes, "") |
BarcodeReader.Read(imageBytes) |
TextResult[].BarcodeText |
result.Value |
TextResult[].BarcodeFormat |
result.Format |
PublicRuntimeSettings vía GetRuntimeSettings() |
new BarcodeReaderOptions { ... } |
settings.Timeout = 100 |
Speed = ReadingSpeed.Balanced |
settings.ExpectedBarcodesCount = 1 |
ExpectMultipleBarcodes = false (por defecto) |
reader.UpdateRuntimeSettings(settings) |
Pasado como parámetro a Read() |
| Biblioteca PDF externa + bucle de renderizado de página | BarcodeReader.Read("doc.pdf") |
Cuando los equipos cambian
Procesamiento de documentos en el servidor, no escaneo con cámara. El escenario de migración más común es el de un equipo que eligió Dynamsoft por su reputación, lo integró y luego descubrió que la API centrada en la cámara y la falta de compatibilidad con PDF dificultaban los flujos de trabajo de procesamiento de documentos. La lectura de códigos de barras desde archivos PDF cargados en una aplicación web es un caso de uso fundamental que requiere soluciones alternativas en Dynamsoft, pero que en IronBarcode se realiza con una sola llamada.
Entornos de red aislados o restringidos. Las instituciones financieras, los sistemas de salud y las implementaciones gubernamentales suelen prohibir las conexiones salientes a Internet desde los servidores de aplicaciones. La validación de licencias en línea de Dynamsoft falla en estos entornos. El flujo de trabajo UUID del dispositivo sin conexión es funcional, pero añade una sobrecarga en cuanto a la dependencia del soporte. Los equipos que trabajan en estos entornos suelen migrar a IronBarcode precisamente porque la validación de licencias no tiene ningún componente de red.
Contenedores efímeros de Docker y Kubernetes. Las implementaciones en contenedores, donde las instancias aumentan y disminuyen de tamaño con frecuencia, hacen que la gestión de licencias sin conexión basadas en dispositivos sea insostenible. Cada nuevo contenedor podría tener un UUID diferente dependiendo de la infraestructura. La clave de licencia de IronBarcode funciona como una variable de entorno estándar sin necesidad de registro por instancia.
Necesidad de generar datos además de leerlos. Dynamsoft es de solo lectura. Las aplicaciones que necesitan generar etiquetas de códigos de barras, imprimir códigos QR para productos o crear manifiestos de envío con códigos de barras integrados necesitan una segunda biblioteca. En esta situación, los equipos suelen consolidar sus sistemas en IronBarcode para evitar tener que gestionar dos dependencias de códigos de barras separadas.
Huella operativa simplificada. Al eliminar el servidor de licencias de Dynamsoft de la lista de dependencias externas accesibles, eliminar la biblioteca de renderizado de PDF y reemplazar la administración de instancias con llamadas estáticas, se reduce la cantidad de problemas que pueden surgir en producción.
Conclusión
Dynamsoft Barcode Reader es una biblioteca de alta calidad que se ajusta perfectamente a su caso de uso previsto: el escaneo de códigos de barras en tiempo real mediante cámara, especialmente en aplicaciones móviles. Los algoritmos están bien ajustados a las condiciones del escaneo manual: iluminación variable, desenfoque por movimiento y oclusión parcial. Si ese es su caso de uso, Dynamsoft es una buena opción.
Para el procesamiento de documentos del lado del servidor (lectura de códigos de barras de archivos PDF, generación de etiquetas de códigos de barras, ejecución en entornos aislados o implementación en contenedores Docker efímeros), la arquitectura de la biblioteca genera dificultades en cada paso. La validación de licencias en línea, la falta de compatibilidad con PDF, la configuración de tiempo de espera optimizada para cámaras y el flujo de trabajo sin conexión con UUID del dispositivo son consecuencias de su diseño para el uso con cámaras móviles. No son insectos; Son decisiones de diseño deliberadas para un contexto diferente.
IronBarcode está diseñado para el contexto del documento y del servidor. La validación de licencias locales, la lectura nativa de PDF, la API estática y la compatibilidad con la generación de archivos son características de primera clase, no soluciones alternativas. La decisión de migrar depende del entorno en el que se encuentren realmente sus códigos de barras.
Preguntas Frecuentes
¿Qué es Dynamsoft BarCode Reader?
Dynamsoft Barcode Reader es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.
¿Cuáles son las principales diferencias entre Dynamsoft Barcode Reader e IronBarcode?
IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que Dynamsoft Barcode Reader suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formatos y licencia de clave única en todos los entornos.
¿Es IronBarcode más fácil de licenciar que Dynamsoft Barcode Reader?
IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.
¿Es IronBarcode compatible con todos los formatos de código de barras que Dynamsoft Barcode Reader soporta?
IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.
¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?
Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.
¿Cómo maneja IronBarcode el procesamiento por lotes en comparación con Dynamsoft Barcode Reader?
Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.
¿Qué versiones de .NET admite IronBarcode ?
IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.
¿Cómo instalo IronBarcode en un proyecto .NET?
Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.
¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de Dynamsoft?
Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.
¿Cuál es la diferencia de precio entre Dynamsoft Barcode Reader e IronBarcode?
IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.
¿Es fácil migrar de Dynamsoft Barcode Reader a IronBarcode?
La migración de Dynamsoft Barcode Reader a IronBarcode implica principalmente la sustitución de las llamadas a la API basadas en instancias por los métodos estáticos de IronBarcode, la eliminación de la repetición de licencias y la actualización de los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.
¿IronBarcode genera códigos QR con logotipos?
Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

