Como ler códigos de barras de fluxos em C#
Migrando debarKoder SDKpara IronBarcode
Barkoder envia pacotes oficiais .NET — Plugin.Maui.Barkoder e Barkoder.Xamarin — mas ambos são componentes estritamente para escaneamento de câmera em dispositivos móveis. Se você avaliou o barKoder por seu algoritmo MatrixSight, modo DeBlur, detecção de múltiplos códigos de barras ou suporte a DPM e depois descobriu que precisa de entrada de arquivos, processamento de PDF, implantação no lado do servidor ou geração de código de barras, nada disso está disponível do barKoder no .NET. Este guia mostra como o IronBarcode cobre cada um desses requisitos, com código funcional para todos os cenários.
Por que Migrar do barKoder SDK
Equipes que mudam de uma avaliação do barKoder para o IronBarcode relatam consistentemente os mesmos gatilhos:
Apenas Superfície de Câmera Móvel: A pegada .NET do Barkoder é Plugin.Maui.Barkoder (v1.6.8, março de 2026) e Barkoder.Xamarin (v1.3.0). Ambos envolvem os SDKs nativos do iOS / Android e expõem um controle de câmera BarkoderView. Não há biblioteca Barkoder.NET de uso geral, nenhum alvo ASP.NET Core, nenhum alvo para console / trabalhador / desktop e nenhum alvo para servidor Linux.
Arquitetura somente leitura: Barkoder é um SDK que realiza apenas a digitalização de arquivos. Se sua aplicação precisa gerar códigos de barras — imprimir etiquetas de envio, criar códigos QR para embalagens, incorporar códigos em documentos — o Barkoder não oferece nada disso. Equipes que descobrem uma necessidade de geração no meio do projeto precisam de uma biblioteca que abranja ambos os lados do fluxo de trabalho.
Sem processamento de PDF: Em aplicações Enterprise .NET , os códigos de barras aparecem frequentemente em documentos PDF — faturas, manifestos de envio, registros médicos, documentos de conformidade. O Barkoder não tem noção desse fluxo de trabalho. Ele foi projetado para entrada de vídeo ao vivo em dispositivos móveis e não consegue processar arquivos PDF.
Sem implantação no servidor: o modelo de processamento do Barkoder é a leitura em dispositivos móveis. Não pode ser executado em ASP.NET Core, Azure Functions, contêineres Docker ou AWS Lambda. Equipes que desenvolvem APIs de código de barras do lado do servidor, pipelines de processamento de documentos ou funções em nuvem não têm acesso à implantação do Barkoder.
Sem Entrada de Arquivo / Fluxo: Mesmo dentro de um aplicativo MAUI, BarkoderView apenas consome quadros ao vivo da câmera. Não há sobrecarga de caminho de arquivo, matriz de bytes ou Stream, portanto, processar uma imagem carregada ou uma foto da galeria requer uma biblioteca diferente.
O Limite Fundamental
A superfície MAUI do Barkoder está presa à câmera. Um desenvolvedor .NET usando Plugin.Maui.Barkoder escreve código que se parece com este:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.SetFlashEnabled(False)
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
End Class
IronBarcode fornece uma API de arquivo / stream / PDF para os mesmos dados:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
IronBarcode vs barKoder SDK: Comparação de Recursos
| Recurso | barKoder SDK | IronBarcode |
|---|---|---|
| API .NET / C# | Apenas UI de câmera MAUI / Xamarin | Superfície .NET completa |
| Pacote NuGet | Plugin.Maui.Barkoder, Barkoder.Xamarin |
BarCode |
| Recuperação de código de barras danificado | MatrixSight / DeBlur | ReadingSpeed.ExtremeDetail + ML |
| Detecção de múltiplos códigos de barras | Sim | ExpectMultipleBarcodes = true |
| DataMatrix / DPM | Sim (somente leitura) | Sim — leia e gere |
| Código QR | Sim (somente leitura) | Sim — leia e gere |
| PDF417 | Sim | Sim |
| asteca | Sim | Sim |
| Código 128, Código 39, EAN | Sim | Sim — mais de 50 formatos |
| Geração de código de barras | None | Completo — todos os formatos |
| Processamento de PDF | None | Nativo |
| Entrada de Arquivo / Stream / byte[] | Nenhum — apenas quadros de câmera | Sim |
| ASP.NET Core | None | Completo |
| Docker / Linux | None | Completo |
| Azure Functions | None | Completo |
| AWS Lambda | None | Completo |
| Offline / Isolado da internet | No dispositivo | Totalmente local |
| Assíncrono / Aguardar | Baseado em retorno de chamada | Completo |
| Injeção de Dependência | None | DI .NET completo |
| iOS via MAUI | Plugin.Maui.Barkoder (interface de usuário da câmera) |
Programático (arquivo / stream) |
| Android via MAUI | Plugin.Maui.Barkoder (interface de usuário da câmera) |
Programático (arquivo / stream) |
| Preços | Assinatura anual | A partir de $749 perpétuo |
Começo Rápido: Migração dobarKoder SDKpara IronBarcode
Passo 1: Substitua o pacote NuGet
Instale o IronBarcode:
dotnet add package BarCode
Se seu projeto usa Plugin.Maui.Barkoder ou Barkoder.Xamarin apenas para fluxos de trabalho sem câmera (ou você está se movendo completamente para processamento de arquivos / PDFs), remova-o:
dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
Se o aplicativo ainda precisar de uma interface de usuário de câmera ao vivo, mantenha Plugin.Maui.Barkoder e adicione IronBarcode junto para o trabalho de arquivo / PDF / geração.
Etapa 2: Atualizar Namespaces
Remova o namespace barKoder onde não é mais necessário, e adicione o namespace IronBarcode:
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
Imports IronBarCode
Etapa 3: Inicializar a licença
Adicione a inicialização da licença no início da aplicação — em Program.cs para ASP.NET Core, ou antes de qualquer operação de código de barras em aplicativos de console ou desktop:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Exemplos de migração de código
Lendo Códigos de Barras de Imagens
O cenário de leitura principal mapeia dos quadros de câmera ao vivo do barKoder para a API de arquivo / stream / byte[] do IronBarcode.
Abordagem do barKoder MAUI:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"Barcode: {r.TextualData}")
Console.WriteLine($"Type: {r.BarcodeTypeName}")
Next
End Sub
End Class
Abordagem do IronBarcode:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Next
O BarcodeReader.Read() da IronBarcode detecta automaticamente o formato do código de barras sem exigir que um formato seja especificado antecipadamente. A mesma chamada funciona para imagens capturadas por um dispositivo móvel e enviadas para um servidor, imagens carregadas de um sistema de arquivos ou imagens recebidas como matrizes de bytes de um fluxo. Para obter documentação de leitura completa, consulte o guia de leitura do IronBarcode .
Recuperação de código de barras danificado (equivalente ao modo DeBlur)
O modo DeBlur do Barkoder é uma de suas funcionalidades mais citadas.IronBarcode fornece o equivalente para entrada de arquivo através de ReadingSpeed.ExtremeDetail.
Abordagem do barKoder MAUI:
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui
' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Recovered: {r.TextualData}")
Next
End Sub
Abordagem do IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("worn-shipping-label.png", options)
If results.Any() Then
Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
Console.WriteLine("Could not decode — image quality too low")
End If
ReadingSpeed.ExtremeDetail executa um pipeline de análise de imagem baseado em ML de múltiplas passagens, aplicando aprimoramento de contraste, nitidez, correção de rotação e recuperação de danos antes de tentar decodificar. Para fluxos de trabalho em lote, use ReadingSpeed.Balanced como padrão e recaia para ExtremeDetail apenas para imagens que Balanced falha em decodificar.
Detecção de múltiplos códigos de barras
A varredura de quadros de múltiplos códigos de barras do Barkoder mapeia para a opção ExpectMultipleBarcodes do IronBarcode, que funciona em imagens e PDFs igualmente.
Abordagem do barKoder MAUI:
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
Abordagem do IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
Esta é uma chamada de método única. Sem extração de páginas, sem múltiplas solicitações, sem sobrecarga de processamento por código de barras. O PDF é lido nativamente.
Geração e leitura de DataMatrix
O Barcoder lê o DataMatrix, mas não consegue gerá-lo. O IronBarcode abrange ambos os lados do fluxo de trabalho, o que é um requisito comum em sistemas de rastreamento industrial.
Abordagem do barKoder MAUI:
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui
' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Part ID: {r.TextualData}")
Next
End Sub
Abordagem do IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
.SaveAsPng("part-label.png")
' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
Console.WriteLine($"Part Serial: {result.Value}")
Console.WriteLine($"Barcode Type: {result.Format}")
Next
Para obter uma lista completa dos formatos de codificação e opções de geração suportados, consulte a documentação de geração de código de barras do IronBarcode .
Geração de código QR com personalização da marca
O Barkoder não gera códigos de barras. O IronBarcode gera códigos QR com logotipos incorporados, um requisito comum para fluxos de trabalho de marketing, embalagem e identificação de produtos.
Abordagem do barKoder MAUI:
Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
Abordagem do IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("branded-qr.png")
Endpoint da API de código de barras do ASP.NET Core
O Barkoder não possui um modelo de implantação do lado do servidor. O equivalente a um ponto de extremidade de upload para leitura de código de barras em dispositivos móveis — que recebe uma imagem de qualquer cliente e retorna os dados do código de barras — requer uma biblioteca .NET .
Abordagem do barKoder:
Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
Abordagem do IronBarcode:
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
Using stream = file.OpenReadStream()
Dim imageBytes(CInt(stream.Length) - 1) As Byte
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(imageBytes, options)
Return Results.Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString()
}))
End Using
End Function)
Referência de Mapeamento de API dobarKoder SDKpara IronBarcode
Esta tabela mapeia a superfície MAUI / Xamarin do barKoder para a chamada IronBarcode equivalente:
| API barKoder | Equivalente ao IronBarcode |
|---|---|
| Licença definida via portal / config do barKoder | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
Configuração DeBlur em BarkoderView |
Speed = ReadingSpeed.ExtremeDetail |
Configuração de múltiplas varreduras em BarkoderView |
ExpectMultipleBarcodes = true |
SetEnabledBarcodeTypes(...) |
BarcodeEncoding.<Format> (detectado automaticamente na leitura) |
BarkoderView.StartScanning(IBarkoderDelegate) |
BarcodeReader.Read("image.png") — síncrono |
BarcodeResult.TextualData |
result.Value |
BarcodeResult.BarcodeTypeName |
result.Format |
| Recuperação de danos MatrixSight | ReadingSpeed.ExtremeDetail com pré-processamento ML |
| Entrada de quadro de câmera ao vivo | Entrada de caminho de arquivo / Stream / byte[] |
| Processamento no dispositivo | Totalmente local — sem chamadas de rede. |
| Sem suporte de geração | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| Sem suporte para PDF | BarcodeReader.Read("document.pdf") — nativo |
| Sem implantação de servidor | Funciona em ASP.NET Core, Docker, Azure Functions e Lambda. |
| Sem índice de página (N/A) | result.PageNumber — disponível em leituras de PDF |
Problemas e soluções comuns em migrações
Problema 1: Nomes de Pacotes NuGet
SDK do barKoder: Os pacotes oficiais .NET são Plugin.Maui.Barkoder e Barkoder.Xamarin. Nenhum deles cobre cenários não-móveis.
Solution: Instale o IronBarcode:
dotnet add package BarCode
Se Plugin.Maui.Barkoder não for mais necessário (você está se movendo completamente para processamento de arquivo / PDF / servidor), remova-o:
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
Problema 2: Entrada de Quadro de Câmera vs Entrada de Arquivo
barKoder SDK: Tudo chega como um quadro de câmera ao vivo — um feed de vídeo contínuo processado no dispositivo. Não há modo de entrada de caminho de arquivo.
Solução: O IronBarcode aceita arquivos, fluxos de dados, matrizes de bytes e objetos System.Drawing.Image. Para imagens enviadas de um cliente móvel, leia o fluxo de requisição diretamente:
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO
Using stream = file.OpenReadStream()
Dim imageBytes = New Byte(stream.Length - 1) {}
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim results = BarcodeReader.Read(imageBytes, options)
End Using
Questão 3: API baseada em callbacks versus resultado síncrono
SDK do barKoder: BarkoderView.StartScanning(IBarkoderDelegate) usa um padrão de delegado / retorno de chamada — DidFinishScanning(BarcodeResult[]) dispara assíncronamente à medida que códigos de barras são detectados no feed da câmera.
Solução: O BarcodeReader.Read() da IronBarcode é síncrono e retorna um IEnumerable<BarcodeResult> diretamente. Em contextos ASP.NET Core onde async é necessário, envolva em Task.Run():
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
Problema 4: Configuração do Modo DeBlur
SDK do barKoder: DeBlur é habilitado na configuração BarkoderView antes do início da varredura e se aplica a todas as varreduras subsequentes.
Solução: No IronBarcode, o equivalente é ReadingSpeed.ExtremeDetail definido por leitura através de BarcodeReaderOptions. Crie o objeto de opções uma única vez e reutilize-o:
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System
Dim deepOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
Problema 5: Falta de capacidade de geração
barKoder SDK: Barkoder é somente leitura. Não existe uma API para gerar códigos de barras ou códigos QR.
Solução: O IronBarcode abrange tanto a leitura quanto a geração de código de barras. Use BarcodeWriter para formatos padrão e QRCodeWriter para códigos QR:
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports System
' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
.SaveAsPng("product-qr.png")
' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
.ToPngBinaryData()
Lista de Verificação de Migração do barKoder SDK
Tarefas pré-migração
Audite sua base de código para referências ao barKoder:
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
Documente os cenários de código de barras atualmente implementados ou planejados:
- Quais formatos de código de barras precisam ser lidos (Code128, DataMatrix, QR, PDF417, etc.)?
- Se a recuperação de código de barras danificado é necessária (
ReadingSpeed.ExtremeDetail) - Se a detecção de múltiplos códigos de barras é necessária (
ExpectMultipleBarcodes = true) - Se a geração de código de barras é necessária (
BarcodeWriter,QRCodeWriter) - Se o processamento de PDF é necessário (
BarcodeReader.Read("doc.pdf")) - Destinos de implantação (ASP.NET Core, Azure Functions, Docker, Lambda, desktop, MAUI)
Tarefas de atualização de código
- Remova
Plugin.Maui.BarkoderouBarkoder.Xamarinde.csprojonde não é mais necessário - Instale o pacote
BarCodeNuGet - Remova
using Barkoder.Maui;(ou o equivalente Xamarin) onde não é mais necessário - Adicione
using IronBarCode;a todos os arquivos de processamento de código de barras - Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";no início da aplicação - Substitua os retornos de chamada
BarkoderView.StartScanning/DidFinishScanningporBarcodeReader.Read(filePath, options) - Mapeie
BarcodeResult.TextualDatapararesult.Value - Mapeie
BarcodeResult.BarcodeTypeNamepararesult.Format - Mapeie a configuração DeBlur para
Speed = ReadingSpeed.ExtremeDetailemBarcodeReaderOptions - Mapeie a configuração de múltiplas varreduras para
ExpectMultipleBarcodes = trueemBarcodeReaderOptions - Adicione chamadas de
BarcodeWriter.CreateBarcode()para quaisquer requisitos de geração - Adicione chamadas de
QRCodeWriter.CreateQrCode()para requisitos de geração de código QR - Substitua qualquer código de pré-processamento de PDF por
BarcodeReader.Read("document.pdf") - Envolva chamadas síncronas de
BarcodeReader.Read()emTask.Run()para endpoints assíncronos do ASP.NET Core
Testes pós-migração
Após concluir as atualizações de código, verifique o seguinte:
- Confirme se
BarcodeReader.Read()retorna resultados para todos os formatos de imagem usados (PNG, JPEG, TIFF, BMP) - Verifique se
ReadingSpeed.ExtremeDetailrecupera códigos de barras das amostras de menor qualidade no seu conjunto de testes - Confirme se
ExpectMultipleBarcodes = trueretorna a contagem correta de códigos de barras de documentos com múltiplos códigos de barras - Testar a leitura de PDFs em todas as versões de PDF usadas nos fluxos de trabalho de documentos de produção.
- Verifique se a saída de
BarcodeWriter.CreateBarcode()é escaneável pelos seus scanners alvo - Verifique se a saída de
QRCodeWriter.CreateQrCode()é escaneável por leitores QR móveis - Teste o endpoint ASP.NET Core (se aplicável) com uploads de arquivos de clientes móveis.
- Confirme o funcionamento correto nos destinos de implantação do Docker, Azure ou Lambda.
- Executar testes de ponta a ponta que abranjam todo o ciclo de leitura-processamento-geração, quando aplicável.
Principais benefícios da migração para o IronBarcode
Uma Plataforma que Abrange .NET sem Câmera:IronBarcode instala-se do NuGet e funciona em qualquer projeto .NET — ASP.NET Core, Azure Functions, Lambda, Docker, console, trabalhador, WPF, WinForms, Avalonia, Blazor e MAUI igualmente. O Plugin.Maui.Barkoder do Barkoder cobre apenas a interface de usuário da câmera dentro de um cabeçalho de aplicativo móvel MAUI;IronBarcode cobre todo o resto.
Leitura Tolerante a Danos Sem Uma Câmera: As capacidades que tornaram o Barkoder atraente — DeBlur, MatrixSight, recuperação de danos — estão presentes no IronBarcode através de ReadingSpeed.ExtremeDetail e pré-processamento de imagem baseado em ML. O IronBarcode obtém as mesmas melhorias de precisão que o Barkoder alcança com entradas de câmera ao vivo, tanto em arquivos quanto em documentos digitalizados e imagens carregadas.
Fluxo de trabalho completo de leitura e geração: o Barkoder é somente leitura. O IronBarcode oferece leitura e geração de códigos de barras em mais de 50 formatos, tudo em um único pacote. As equipes que precisam gerar etiquetas de envio, criar códigos QR para embalagens ou incorporar códigos de barras em documentos não precisam de uma segunda biblioteca.
Suporte nativo a PDF: Ler códigos de barras em documentos PDF — faturas, manifestos, registros médicos, documentos de conformidade — é um recurso de primeira classe do IronBarcode. Sem extração intermediária de imagens, sem chamadas de API por página e sem dependências adicionais. Um PDF de várias páginas é processado em uma única chamada de BarcodeReader.Read().
Implantação completa no servidor: o IronBarcode funciona em ASP.NET Core, Azure Functions, AWS Lambda, contêineres Docker e qualquer outro ambiente de hospedagem .NET . Ele processa códigos de barras localmente, sem chamadas de rede, sem chaves de API para gerenciar e sem a latência adicionada por um serviço remoto. Processar um código de barras ou um milhão custa o mesmo — não há cobranças por solicitação.
Preços previsíveis para licenças perpétuas: O IronBarcode está disponível em uma licença perpétua única a partir de US$ 749 para um único desenvolvedor, sem cobranças por solicitação, sem limites de volume e sem renovações de assinatura. Para equipes que desenvolvem aplicativos de produção que processam códigos de barras em grande escala, o modelo de custos é simples e previsível.
Perguntas frequentes
Por que devo migrar do SDK Barkoder para o IronBarcode?
Entre os motivos comuns estão a simplificação do licenciamento (removendo a complexidade do SDK e da chave de tempo de execução), a eliminação dos limites de taxa de transferência, a obtenção de suporte nativo para PDF, a melhoria da implantação em Docker/CI/CD e a redução do código repetitivo da API em produção.
Como faço para substituir as chamadas da API do Barkoder pelo IronBarcode?
Substitua o código padrão de criação de instâncias e licenciamento por `IronBarCode.License.LicenseKey = "key"`. Substitua as chamadas de leitura por `BarcodeReader.Read(path)` e as chamadas de gravação por `BarcodeWriter.CreateBarcode(data, encoding)`. Os métodos estáticos não exigem gerenciamento de instâncias.
Quanta alteração de código ocorre ao migrar do SDK da Barkoder para o IronBarcode?
A maioria das migrações resulta em menos linhas de código. O código repetitivo de licenciamento, os construtores de instância e a configuração explícita de formato são removidos. As operações principais de leitura/gravação são mapeadas para equivalentes mais curtos em IronBarcode, com objetos de resultado mais limpos.
Preciso manter o SDK do Barkoder e o IronBarcode instalados durante a migração?
Não. A maioria das migrações são substituições diretas, e não operações paralelas. Migre uma classe de serviço por vez, substitua a referência do NuGet e atualize os padrões de instanciação e chamada de API antes de passar para a próxima classe.
Qual é o nome do pacote NuGet para IronBarcode?
O pacote é 'IronBarCode' (com B e C maiúsculos). Instale-o com 'Install-Package IronBarCode' ou 'dotnet add package IronBarCode'. A diretiva using no código é 'using IronBarCode;'.
Como o IronBarcode simplifica a implantação do Docker em comparação com o SDK da Barkoder?
IronBarcode é um pacote NuGet sem arquivos SDK externos ou configuração de licença montada. No Docker, defina a variável de ambiente IRONBARCODE_LICENSE_KEY e o pacote cuidará da validação da licença na inicialização.
O IronBarcode detecta automaticamente todos os formatos de código de barras após a migração do Barkoder?
Sim. O IronBarcode detecta automaticamente a simbologia em todos os formatos suportados. A enumeração explícita de BarcodeTypes não é necessária. Se o formato já for conhecido e o desempenho for importante, o BarcodeReaderOptions permite restringir o espaço de busca como uma otimização.
O IronBarcode consegue ler códigos de barras de PDFs sem uma biblioteca separada?
Sim. O método `BarcodeReader.Read("document.pdf")` processa arquivos PDF nativamente. Os resultados incluem o número da página, o formato, o valor e a confiança de cada código de barras encontrado. Não é necessária nenhuma etapa externa de renderização de PDF.
Como o IronBarcode lida com o processamento paralelo de códigos de barras?
Os métodos estáticos do IronBarcode são sem estado e thread-safe. Use Parallel.ForEach diretamente em listas de arquivos sem gerenciamento de instâncias por thread. BarcodeReaderOptions.MaxParallelThreads controla o orçamento interno de threads.
Quais propriedades de resultado são alteradas ao migrar do SDK Barkoder para o IronBarcode?
Renomeações comuns: BarcodeValue torna-se Value, BarcodeType torna-se Format. Os resultados do IronBarcode também incluem Confidence e PageNumber. Uma função de busca e substituição em toda a solução lida com as renomeações no código de processamento de resultados existente.
Como configuro o licenciamento do IronBarcode em um pipeline de CI/CD?
Armazene IRONBARCODE_LICENSE_KEY como um segredo de pipeline e atribua IronBarCode.License.LicenseKey no código de inicialização do aplicativo. Um único segredo abrange todos os ambientes, incluindo desenvolvimento, teste, homologação e produção.
O IronBarcode suporta a geração de códigos QR com estilos personalizados?
Sim. O método QRCodeWriter.CreateQrCode() suporta cores personalizadas através do método ChangeBarCodeColor(), incorporação de logotipo através do método AddBrandLogo(), níveis configuráveis de correção de erros e múltiplos formatos de saída, incluindo PNG, JPG, PDF e fluxo de dados.

