Recomendações


First of all, let me compliment you on your Barcode.NET Library. We evaluated a number of products to use in our application, and yours was our favorite.

Dan Konigsberg
CampMinder, LLC





VintaSoftBarcode.NET SDK - FAQ

Questões gerais:

 

Redistribuição:

 

Vendas:

 

Programação:

 

Imagens:

 

 

Para que propósitos posso usar o VintaSoftBarcode.NET Library?

A biblioteca permite ler e escrever 1D, postais e 2D barcodes de imagens digitais e recursos de imagens de arquivos PDF.

 

 

De que partes consiste a biblioteca?

A biblioteca contém:

  • O arquivo Vintasoft.Barcode.dll/Vintasoft.Wpf.Barcode.dll – uma .NET class library 100% gerenciado
  • Documentação no formato CHM (arquivo Documentation\Vintasoft.Barcode.chm)
  • Aplicações Demo (arquivo Bin\vX.X\BarcodeDemo.exe)
  • Exemplos para MS Visual Basic .NET, MS Visual C#, ASP.NET (arquivos no diretório Examples)
  • Exemplo de aplicações de imagens com código de barras (arquivos no diretório Images)

 

 

Em que linguagem de programação posso usar o VintaSoftBarcode.NET Library?

Com uma licença desenvolvedor ou licença para várias estações de trabalho você pode usar o componente em:

  • Microsoft Visual Studio .NET : Visual Basic, Visual C#, Visual C++, Visual J#
  • Borland Delphi 8.0, Borland C# Builder, Borland C++ BuilderX
  • qualquer outra linguagem que seja compatível com o Framework .NET.

Com a licença servidor você pode usar o componente em:

  • Aplicações intranet / internet no lado servidor (ASP.NET ou PHP)

 

 

Que restrições tem os usuários não registrados?

A versão não registrada tem as seguintes restrições:

  • A tela de propaganda (nag screen) é mostrada antes de cada processo de leitura do código de barras nas Bin/X.X/Vintasoft.Barcode.dll ou Vintasoft.Wpf.Barcode.dll.
  • O valor do código de barras é substituído por uma string “*DEMO*” para os códigos de barras QR, GS1/RSS e IntelligentMail.
  • Alguns símbolos lidos de um código de barras são substituídos por ‘*’ nas Bin/X.X/NoNagScreen/Vintasoft.Barcode.dll ou Vintasoft.Wpf.Barcode.dll.
  • Os códigos de barras podem ser lidos apenas na primeira página de um documento PDF.
  • A marca d’água é adicionada um código de barras gerado.

 

 

Estou com problemas. O que devo fazer?

As respostas para a maior parte as questões pode se encontrada na documentação ou neste FAQ.
Escreva para o nosso suporte para obter mais ajuda.

 

 

Que arquivos eu preciso incluir na instalação do meu programa?

Você precisa incluir apenas um arquivo: Vintasoft.Barcode.dll/Vintasoft.Wpf.Barcode.dll. Este arquivo precisa estar localizado no mesmo diretório que o executável que referencia este. Verifique se a versão que você vai distribuir seja a mesma que você usou para compilar o programa.

 

 

Posso redistribuir o Vintasoft.Barcode.dll ou Vintasoft.Wpf.Barcode.dll com minha aplicação sem precisar pagar royalties?

Sim, este componente é livre de royalties. Você paga apenas pelo registro uma única vez. Apenas o Vintasoft.Barcode.dll/Vintasoft.Wpf.Barcode.dll pode ser distribuído junto com sua aplicação. A licença Individual de Desenvolvedor (Single Developer) tem limitação de distribuição. Por favor, leia o contrato de licença para mais informações.

 

 

O que fazer quando minha licença individual de programador para a redistribuição da aplicação estiver prestes a exceder 100 cópias em um ano?

Se você possuir a licença individual para programador você precisa entrar em contato com o pessoal de vendas e explicar que você está prestes a exceder a quantidade de 100 cópias durante o ano. Será oferecido a oportunidade de atualizar sua licença individual de programador para uma licença sítio com desconto de 30% ou para comprar uma licença individual para programador adicional.

 

 

Qual a diferença entre licença individual para programador e licença sítio?

  • Licença individual para programador precisa ser usado no desenvolvimento de software por apenas um programador, onde o nome deste programador será indicado nos dados da licença.
  • A licença sítio precisa ser usado no desenvolvimento de software por qualquer programador que trabalhe em uma empresa que tenha seus dados indicados na licença.
  • A licença individual de programador pode ser usada para o desenvolvimento de software em um PC localizado em qualquer endereço físico.
  • A licença sítio pode ser usada no desenvolvimento de software em qualquer PC localizado em um único endereço físico (apenas em um escritório).
  • Licença individual para programador permite distribuiçăo de livre de royalties de uma aplicaçăo e o SDK redistribuível até o limite de 100 cópias em um ano.
  • A licença sítio permite ilimitada distribuição livre de royalties de uma aplicação e o SDK redistribuível.

 

 

Posso atualizar minha licença Standard para a licença Standard + WPF equivalente?

Sim, por favor contate o departamento de vendas VintaSoft e você poderá ter a opção de comprar a licença Standard + WPF equivalente com 70% de desconto.

 

 

Existe uma diferença em fazer o deploy de minha aplicação em um desktop PC ou em um Server?

Sim, existe. Por favor leia a sessão "Deploying" na documentação do produto para entender a diferença.

Termos: Desktop PC – Windows XP, Vista, 7 SO instalado. Server – Windows Server 2000, 2003, 2008 SO instalado.

 

 

Como posso maximizar a velocidade de leitura do código de barras?

Aqui algumas dicas que permitem maximizar a velocidade de leitura do código de barras:

  • Reconheça apenas os tipos de códigos de barras necessários (veja a propriedade Settings.ScanBarcodeTypes). Isto pode aumentar 2 vezes a velocidade de leitura do código de barras.
  • Reconheça os códigos de barras apenas no sentido necessário (veja a propriedade Settings.ScanDirection). Isto pode aumentar a velocidade de leitura em 20%.
  • Ache um "bom" limite para as cores das imagens e use-o (veja a propriedade Settings.Threshold), se possível não use o modo authomatic do threshold (veja a propriedade Settings.ThresholdMode). Isto pode aumentar a velocidade de leitura do código de barras em 10%.
  • Configure a propriedade ExpectedBarcodes se o número de códigos de barras é conhecido.
  • Use imagens preto-branco nos códigos de barras. Isto pode aumenter a velocidade de leitura em 20%.
  • Desabilite Settings.RemovePeas se a imagem do código de barras tiver boa qualidade. Isto pode aumentar a velocidade de leitura em 5%.
  • Não use o ScanDirection.Angle45and135 direction se você não tiver código de barras baixo e largo rotacionado em 30-60 graus. Isto pode aumentar a velocidade de leitura em 30%.
  • Desabilite em Settings, a propriedade SearchDistortedDataMatrixBarcodes se o seu código de barras DataMatrix não tiver distorção dimensional. Isto pode aumentar a velocidade de leitura do código de barras em 50%.

 

 

Como posso obter o mais estável sistema de reconhecimento de código de barras?

Aqui está uma lista de passos que ajudam você a criar um sistema de leitura de código de barras estável:

  • Faça uma coleção de imagens para teste do código de barras (no mínimo 10 imagens).
    Se você adquirir imagens do scanner - faça uma coleção de imagens de teste com diferentes brilhos e contrastes.
  • Leia código de barras de imagens de teste com diferentes Threshold e calcule o valor mínimo e a média da propriedade ReadingQuality.
  • Escolha os parâmetros que dêem o valor de média máxima para a propriedade ReadingQuality.
  • O valor médio recomendado para ReadingQuality é 0,75 - isto permite você obter um sistema de reconhecimento de código de barras mais estável.
Nós não recomendamos processar as imagens com o código de barras (deskew, despeckle, etc) antes de fazer a leitura do código de barras pois pode causar uma grande perda na qualidade do reconhecimento.

 

 

Existe alguma recomendação para a criação de códigos de barras 1D?

O Code 39 e Code 128 são os códigos de barras lineares mais estáveis para evitar danos e distorções.
O código de barras mais compacto é o Code 128 (ambos, dados númericos e símbolo).

Recomendações para criação do código de barras e a sua leitura:

  • Criar código de barras 1D com tamanho da célula (barra-única) com no mínimo 2 pixels.
  • Quanto maior a altura (height) do código de barras, maior a qualidade de leitura.
  • Use o padding em códigos de barras com tamanho maior que 4 células.
  • Use o checksum opcional para código de barras que não tenha como padrão o checksum. (Code 39, Interleaved 2of5, Standard 2of5). Isto vai ajudar você a evitar erros de reconhecimento de código de barras de imagens com baixa qualidade.

 

 

Existe alguma recomendação para a criação de códigos de barras 2D?

O Data Matrix é o código de barras 2D mais estável para evitar danos e distorções. Aztec é o mais compacto. Depois vem o DataMatrix, QR e PDF417.
Todos os códigos de barras 2D podem conter texto e dados binários e podem ser restaurados dados danificados em até 30% usando o algoritmo de correção de erros Reed-Solomon.

Recomendações para criação do código de barras e a sua leitura:

  • Criar o código de barras Aztec, Data Matrix e QR com tamanho de células de no mínimo 3 pixels.
  • Criar o código de barras PDF417 com tamanho de célula de no mínimo de 2 pixels.
  • Use o padding em códigos de barras PDF417 e Data Matrix com tamanho maior que 2 células.
  • Use o padding em códigos de barras QR Code com tamanho maior que 4 células.

 

 

A biblioteca suporta multithreading?

Sim, o multi-threading é suportado desde a versão 5.0. O algoritmo principal pode ser escalado em N threads.

 


 

Como reconhecer um código de barras em uma imagem colorida com baixa qualidade?

Existem dois jeitos:

  • Você deve usar o Reconhecimento Automático (veja ReaderSettings.AutomaticRecognition).
  • Você deveria usar o processo de iteração de detecção threshold. Aqui está um exemplo simples que mostra como detectar o código de barras em uma imagem colorida com threshold difícil-de-localizar:

[VB.NET]
Private Shared Sub ScanWithIterations(ByVal fileName As String, _
                                      ByVal barcodes As BarcodeType, _
                                      ByVal expectedBarcodes As Integer, _
                                      ByVal iterationCount As Integer, _
                                      ByVal minThreshold As Integer, _
                                      ByVal maxThreshold As Integer)
    Dim barcodeImage As Image = Image.FromFile(fileName)
    Dim reader As New BarcodeReader()
    reader.Settings.ScanBarcodeTypes = barcodes
    reader.Settings.ExpectedBarcodes = expectedBarcodes
    reader.Settings.ThresholdMode = ThresholdMode.Iterations
    reader.Settings.ThresholdIterations = iterationCount
    reader.Settings.ThresholdMin = minThreshold
    reader.Settings.ThresholdMax = maxThreshold
    ' read barcodes
    Dim barcodesInfo As IBarcodeInfo() = reader.readBarcodes(barcodeImage)
    If barcodesInfo.Length = 0 Then
        Console.WriteLine("No barcodes found.")
    Else
        For i As Integer = 0 To barcodesInfo.Length - 1
            Dim inf As IBarcodeInfo = barcodesInfo(i)
            Console.WriteLine(String.Format("[{0}] {1} (Threshold: {2})", inf.BarcodeType, _
                                                                inf.Value, inf.Threshold))
        Next
    End If
    barcodeImage.Dispose()
End Sub

Private Shared Sub TestScanWithIterationsCode128orDataMatrix(ByVal fileName As String)
    ' find one Code 128 or DataMatrix barcode from 400 to 600 _
                                                           threshold (10 iterations)
    ScanWithIterations(fileName, BarcodeType.Code128 Or BarcodeType.DataMatrix, _
                                                               1, 10, 400, 600)
End Sub

[C#]
static void ScanWithIterations(string fileName, BarcodeType barcodes, int expectedBarcodes, 
    int iterationCount, int minThreshold, int maxThreshold)
{
    Image barcodeImage = Image.FromFile(fileName);
    BarcodeReader reader = new BarcodeReader();
    reader.Settings.ScanBarcodeTypes = barcodes;
    reader.Settings.ExpectedBarcodes = expectedBarcodes;
    reader.Settings.ThresholdMode = ThresholdMode.Iterations;
    reader.Settings.ThresholdIterations = iterationCount;
    reader.Settings.ThresholdMin = minThreshold;
    reader.Settings.ThresholdMax = maxThreshold;
    // read barcodes
    IBarcodeInfo[] barcodesInfo = reader.ReadBarcodes(barcodeImage);
    if (barcodesInfo.Length == 0)
    {
        Console.WriteLine("No barcodes found.");
    }
    else
    {
        for (int i = 0; i < barcodesInfo.Length; i++)
        {
            IBarcodeInfo inf = barcodesInfo[i];
            Console.WriteLine(string.Format("[{0}] {1} (Threshold: {2})", 
                                                        inf.BarcodeType, 
                                                        inf.Value, inf.Threshold));
        }
    }
    barcodeImage.Dispose();
}

static void TestScanWithIterationsCode128orDataMatrix(string fileName)
{
    // find one Code 128 or DataMatrix barcode from 400 to 600 
                                                          threshold (10 iterations)
    ScanWithIterations(fileName, BarcodeType.Code128 | BarcodeType.DataMatrix, 
                                                             1, 10, 400, 600);
}
    

 

 

Como posso ler código de barras em um arquivo multi-páginas TIFF?

Aqui um exemplo simples:

[VB.NET]
Private Shared Sub ReadBarcodesFromMiltipageTiffFile(ByVal fileName As String, _
                                                     ByVal barcodes As BarcodeType)
    ' open tiff image
    Dim tiffImage As Image = Image.FromFile(fileName)
    Dim index As Guid = tiffImage.FrameDimensionsList(0)
    Dim dimension As New FrameDimension(index)
    Dim pageCount As Integer = tiffImage.GetFrameCount(dimension)
    ' create reader
    Dim reader As New BarcodeReader()
    reader.Settings.ScanBarcodeTypes = barcodes
    ' read barcodes from all pages
    For i As Integer = 0 To pageCount - 1
        ' selects a page
        tiffImage.SelectActiveFrame(dimension, i)
        ' read barcodes from page i
        Dim barcodesInfo As IBarcodeInfo() = reader.readBarcodes(tiffImage)
        ' write information
        Console.WriteLine(String.Format("Page {0}: ", i))
        If barcodesInfo.Length = 0 Then
            Console.WriteLine("No barcodes found.")
        Else
            For j As Integer = 0 To barcodesInfo.Length - 1
                Console.WriteLine(String.Format("[{0}] {1}", _
                                  barcodesInfo(j).BarcodeType, barcodesInfo(j).Value))
            Next
        End If
    Next
    ' free resources
    tiffImage.Dispose()
End Sub

[C#]
static void ReadBarcodesFromMiltipageTiffFile(string fileName, BarcodeType barcodes)
{
    // open tiff image
    Image tiffImage = Image.FromFile(fileName);
    Guid index = tiffImage.FrameDimensionsList[0];
    FrameDimension dimension = new FrameDimension(index);
    int pageCount = tiffImage.GetFrameCount(dimension);
    // create reader
    BarcodeReader reader = new BarcodeReader();
    reader.Settings.ScanBarcodeTypes = barcodes;
    // read barcodes from all pages
    for (int i = 0; i < pageCount; i++)
    {
        // selects a page
        tiffImage.SelectActiveFrame(dimension, i);
        // read barcodes from page i
        IBarcodeInfo[] barcodesInfo = reader.ReadBarcodes(tiffImage);
        // write information
        Console.WriteLine(string.Format("Page {0}: ", i));
        if (barcodesInfo.Length == 0)
        {
            Console.WriteLine("No barcodes found.");
        }
        else
        {
            for (int j = 0; j < barcodesInfo.Length; j++)
                Console.WriteLine(string.Format("[{0}] {1}", 
                                  barcodesInfo[j].BarcodeType, 
                                  barcodesInfo[j].Value));
        }
    }
    // free resources
    tiffImage.Dispose();
}

 

 

Como posso ler código de barras em um documento PDF?

Aqui um exemplo simples:

[VB.NET]
Private Shared Sub ReadBarcodesFromPdfDocument(ByVal fileName As String, _
                                               ByVal barcodes As BarcodeType)
    ' open PDF document
    Dim pdfImageViewer As New PdfImageViewer(fileName)
    ' create reader
    Dim reader As New BarcodeReader()
    reader.Settings.ScanBarcodeTypes = barcodes
    ' read barcodes from all pages
    For i As Integer = 0 To pdfImageViewer.PageCount - 1
        ' get all images names from page i
        Dim imageNames As String() = pdfImageViewer.GetImageNames(i)
        ' foreach images in page i
        For k As Integer = 0 To imageNames.Length - 1
            Console.WriteLine(String.Format("Page {0}, image {1}: ", i, _
                                                        imageNames(k)))
            Dim barcodeImage As Image
            ' get image with name imageNames[k]
            Try
                barcodeImage = pdfImageViewer.GetImage(i, imageNames(k))
            Catch e As Exception
                ' not supported image format
                Console.WriteLine(e.Message)
                Continue For
            End Try
            ' read barcodes 
            Dim barcodesInfo As IBarcodeInfo() = reader.readBarcodes(barcodeImage)
            ' write information
            If barcodesInfo.Length = 0 Then
                Console.WriteLine("No barcodes found.")
            Else
                For j As Integer = 0 To barcodesInfo.Length - 1
                    Console.WriteLine(String.Format("[{0}] {1}", _
                                      barcodesInfo(j).BarcodeType, _
                                      barcodesInfo(j).Value))
                Next
            End If
        Next
    Next
    ' free resources
    pdfImageViewer.Dispose()
End Sub

[C#]
static void ReadBarcodesFromPdfDocument(string fileName, BarcodeType barcodes)
{
    // open PDF document
    PdfImageViewer pdfImageViewer = new PdfImageViewer(fileName);
    // create reader
    BarcodeReader reader = new BarcodeReader();
    reader.Settings.ScanBarcodeTypes = barcodes;
    // read barcodes from all pages
    for (int i = 0; i < pdfImageViewer.PageCount; i++)
    {
        // get all images names from page i
        string[] imageNames = pdfImageViewer.GetImageNames(i);
        // foreach images in page i
        for (int k = 0; k < imageNames.Length; k++)
        {
            Console.WriteLine(string.Format("Page {0}, image {1}: ", i, 
                                                       imageNames[k]));
            Image barcodeImage;
            // get image with name imageNames[k]
            try
            {
                barcodeImage = pdfImageViewer.GetImage(i, imageNames[k]);
            }
            catch(Exception e)
            {
                // not supported image format
                Console.WriteLine(e.Message);
                continue;
            }
            // read barcodes 
            IBarcodeInfo[] barcodesInfo = reader.ReadBarcodes(barcodeImage);
            // write information
            if (barcodesInfo.Length == 0)
            {
                Console.WriteLine("No barcodes found.");
            }
            else
            {
                for (int j = 0; j < barcodesInfo.Length; j++)
                    Console.WriteLine(string.Format("[{0}] {1}", 
                                      barcodesInfo[j].BarcodeType, 
                                      barcodesInfo[j].Value));
            }
        }
    }
    // free resources
    pdfImageViewer.Dispose();
}

 

 

Como posso ler código de barras no vector form em um documento PDF?

Aqui um exemplo simples:

[C#]
// Important: You need Vintasoft.Barcode.dll, 
//                     Vintasoft.Imaging.dll, 
//                     Vintasoft.Pdf.dll assemblies 
//                     to run this code.
static void ReadBarcodesFromVectorPDFDocument(string pdfFilename)
{
    ImageCollection pdfPages = new ImageCollection();
    pdfPages.Add(pdfFilename);
    // set RenderingSettings if needed
    pdfPages.SetRenderingSettings(new RenderingSettings(new Resolution(200, 200)));
    // foreach pages
    foreach (VintasoftImage image in pdfPages)
    {
        // get page Image
        Image pageImage = image.GetAsBitmap();
        // read barcodes
        ReadBarcodesFromImage(pageImage);
        // free resources
        pageImage.Dispose();
    }
    // free resources
    pdfPages.ClearAndDisposeItems();
}

static void ReadBarcodesFromImage(Image barcodeImage)
{
    // create barcode reader
    BarcodeReader reader = new BarcodeReader();

    // Code 39, Code128 and DatMatrix barcodes are extracted
    reader.Settings.ScanBarcodeTypes =
        BarcodeType.Code39 |
        BarcodeType.Code128 |
        BarcodeType.DataMatrix;

    // only horizontal barcodes are extracted
    reader.Settings.ScanDirection = ScanDirection.LeftToRight | 
                                    ScanDirection.RightToLeft;

    // read barcodes from image
    IBarcodeInfo[] infos = reader.ReadBarcodes(barcodeImage);

    Console.WriteLine(string.Format("Recognition time {0} ms.",
                      reader.RecognizeTime.TotalMilliseconds));

    if (infos.Length == 0)
    {
        Console.WriteLine("No barcodes found.");
    }
    else
    {
        Console.WriteLine(string.Format("{0} barcodes found:", infos.Length));
        Console.WriteLine();
        for (int i = 0; i < infos.Length; i++)
        {
            IBarcodeInfo info = infos[i];
            Console.WriteLine(string.Format("[{0}:{1}]", i, info.BarcodeType));
            Console.WriteLine(string.Format("Value:      {0}", info.Value));
            Console.WriteLine(string.Format("Confidence: {0}%", 
                                             Math.Round(info.Confidence)));
            Console.WriteLine(string.Format("Threshold:  {0}", info.Threshold));
            Console.WriteLine(string.Format("Region:     {0}", info.Region));
            Console.WriteLine();
        }
    }
} 

 

 

Como posso escrever código de barras em um document PDF no vector form?

Aqui está um exemplo:

[VB.NET]
' Important: You need Vintasoft.Barcode.dll, 
'                     Vintasoft.Imaging.dll, 
'                     Vintasoft.Pdf.dll assemblies 
'                     to run this code.
Private Shared Sub MarkPDF(ByVal pdfFilename As String)
    ' create barcodeWriter
    Dim barcodeWriter As New BarcodeWriter()
    ' using DataMatrix 2D barcode
    barcodeWriter.Settings.Barcode = BarcodeType.DataMatrix
    ' barcode padding
    Dim padding As Single = 5

    ' open PDF document
    Dim document As New PdfDocument(pdfFilename)
    ' foreach pages
    For i As Integer = 0 To document.Pages.Count - 1
        Dim page As PdfPage = document.Pages(i)
        ' barcode value - page number
        barcodeWriter.Settings.Value = (i + 1).ToString()
        ' write barcode graphics path
        Dim barcodePath As GraphicsPath = barcodeWriter.GetBarcodeAsGraphicsPath()
        ' translate barcode to right-bottom page corner
        Using m As New Matrix()
            Dim barcodeWidth As Single = barcodePath.GetBounds().Width
            m.Translate(page.MediaBox.Right - barcodeWidth - padding, padding)
            barcodePath.Transform(m)
        End Using
        ' fill barcode path
        Using g As PdfGraphics = page.GetGraphics()
            Dim brush As New PdfBrush(Color.Black)
            g.FillPath(brush, barcodePath)
        End Using
        barcodePath.Dispose()
    Next

    ' saving document
    Dim resultFileName As String = Path.GetFileNameWithoutExtension(pdfFilename) & _
                                                                     "_marked.pdf"
    document.Save(Path.Combine(Path.GetDirectoryName(pdfFilename), resultFileName))
    ' free resources
    document.Dispose()
End Sub

[C#]
// Important: You need Vintasoft.Barcode.dll, 
//                     Vintasoft.Imaging.dll, 
//                     Vintasoft.Pdf.dll assemblies 
//                     to run this code.
static void MarkPDF(string pdfFilename)
{
    // create barcodeWriter
    BarcodeWriter barcodeWriter = new BarcodeWriter();
    // using DataMatrix 2D barcode
    barcodeWriter.Settings.Barcode = BarcodeType.DataMatrix;
    // barcode padding
    float padding = 5;

    // open PDF document
    PdfDocument document = new PdfDocument(pdfFilename);
    // foreach pages
    for (int i = 0; i < document.Pages.Count; i++)
    {
        PdfPage page = document.Pages[i];
        // barcode value - page number
        barcodeWriter.Settings.Value = (i + 1).ToString();
        // write barcode graphics path
        GraphicsPath barcodePath = barcodeWriter.GetBarcodeAsGraphicsPath();
        // translate barcode to right-bottom page corner
        using (Matrix m = new Matrix())
        {
            float barcodeWidth = barcodePath.GetBounds().Width;
            m.Translate(page.MediaBox.Right - barcodeWidth - padding, padding);
            barcodePath.Transform(m);
        }
        // fill barcode path
        using (PdfGraphics g = page.GetGraphics())
        {
            PdfBrush brush = new PdfBrush(Color.Black);
            g.FillPath(brush, barcodePath);
        }
        barcodePath.Dispose();
    }

    // saving document
    string resultFileName = Path.GetFileNameWithoutExtension(pdfFilename) + 
                                                             "_marked.pdf";
    document.Save(Path.Combine(Path.GetDirectoryName(pdfFilename), resultFileName));
    // free resources
    document.Dispose();
}

 

 

Como posso usar meu checksum em um leitor/gerador de código de barras?

Você precisa usar as propriedades ReaderSettings.VerifyBarcodeMethod para validar (conferir o checksum) o código de barras.

[VB.NET]
' Generate checksum at base 1000.
Private Shared Function GenerateChecksum(ByVal value As String) As String
    Dim checkSum As Integer = 0
    For i As Integer = 0 To value.Length - 1
        checkSum += CByte(AscW(value(i))) * i
        checkSum = checkSum Mod 1000
    Next
    'result - [000..999]
    Return checkSum.ToString().PadLeft(3, "0"c)
End Function

' Testing Checksum in barcode value.
Private Shared Function TestChecksum(ByVal barcodeValue As String) As Boolean
    Dim value As String = barcodeValue.Substring(0, barcodeValue.Length - 3)
    Dim readChecksum As String = barcodeValue.Substring(barcodeValue.Length - 3)
    Return readChecksum = GenerateChecksum(value)
End Function

' Verify barcode method.
Private Shared Sub VerifyBarcodeMethod(ByVal reader As BarcodeReader, _
                                       ByVal barcodeInfo As IBarcodeInfo)
    If TestChecksum(barcodeInfo.Value) Then
        barcodeInfo.Confidence = 100
    Else
        barcodeInfo.Confidence = 0
    End If
End Sub

Private Shared Sub TestCode39Barcode(ByVal value As String)
    ' create writer
    Dim writer As New BarcodeWriter()
    writer.Settings.Barcode = BarcodeType.Code39

    ' create reader
    Dim reader As New BarcodeReader()
    reader.Settings.ScanBarcodeTypes = BarcodeType.Code39
    reader.Settings.MinConfidence = 100
    reader.Settings.AutomaticRecognition = True
    reader.Settings.ExpectedBarcodes = 1

    ' write barcode without checksum
    writer.Settings.Value = value
    Dim barcodeNoChecksumImage As Image = writer.GetBarcodeAsBitmap()

    ' write barcode with checksum
    writer.Settings.Value = value & GenerateChecksum(value)
    Dim barcodeWithMyChecksumImage As Image = writer.GetBarcodeAsBitmap()

    'set VerifyBarcodeMethod
    reader.Settings.VerifyBarcodeMethod = AddressOf VerifyBarcodeMethod

    Dim infos As IBarcodeInfo()

    'read barcodes from barcode image without checksum
    'no barcodes found
    infos = reader.readBarcodes(barcodeNoChecksumImage)
    Console.WriteLine("Scan (NoChecksum):")
    For i As Integer = 0 To infos.Length - 1
        Console.WriteLine(infos(i).Value)
    Next

    'read barcodes from barcode image with checksum
    'found one barcode
    infos = reader.readBarcodes(barcodeWithMyChecksumImage)
    Console.WriteLine("Scan (MyChecksum):")
    For i As Integer = 0 To infos.Length - 1
        Console.WriteLine(infos(i).Value)
    Next
End Sub

[C#]
// Generate checksum at base 1000.
static string GenerateChecksum(string value)
{
    int checkSum = 0;
    for (int i = 0; i < value.Length; i++)
    {
        checkSum += ((byte)value[i]) * i;
        checkSum %= 1000;
    }
    //result - [000..999]
    return checkSum.ToString().PadLeft(3, '0');
}

// Testing Checksum in barcode value.
static bool TestChecksum(string barcodeValue)
{
    string value = barcodeValue.Substring(0, barcodeValue.Length - 3);
    string readChecksum = barcodeValue.Substring(barcodeValue.Length - 3);
    return readChecksum == GenerateChecksum(value);
}

// Verify barcode method.
static void VerifyBarcodeMethod(BarcodeReader reader, IBarcodeInfo barcodeInfo)
{
    if (TestChecksum(barcodeInfo.Value))
        barcodeInfo.Confidence = 100;
    else
        barcodeInfo.Confidence = 0;
}

static void TestCode39Barcode(string value)
{
    // create writer
    BarcodeWriter writer = new BarcodeWriter();
    writer.Settings.Barcode = BarcodeType.Code39;

    // create reader
    BarcodeReader reader = new BarcodeReader();
    reader.Settings.ScanBarcodeTypes = BarcodeType.Code39;
    reader.Settings.MinConfidence = 100;
    reader.Settings.AutomaticRecognition = true;
    reader.Settings.ExpectedBarcodes = 1;

    // write barcode without checksum
    writer.Settings.Value = value;
    Image barcodeNoChecksumImage = writer.GetBarcodeAsBitmap();

    // write barcode with checksum
    writer.Settings.Value = value + GenerateChecksum(value);
    Image barcodeWithMyChecksumImage = writer.GetBarcodeAsBitmap();

    //set VerifyBarcodeMethod
    reader.Settings.VerifyBarcodeMethod = VerifyBarcodeMethod;

    IBarcodeInfo[] infos;

    //read barcodes from barcode image without checksum
    //no barcodes found
    infos = reader.ReadBarcodes(barcodeNoChecksumImage);
    Console.WriteLine("Scan (NoChecksum):");
    for (int i = 0; i < infos.Length; i++)
        Console.WriteLine(infos[i].Value);

    //read barcodes from barcode image with checksum
    //found one barcode
    infos = reader.ReadBarcodes(barcodeWithMyChecksumImage);
    Console.WriteLine("Scan (MyChecksum):");
    for (int i = 0; i < infos.Length; i++)
        Console.WriteLine(infos[i].Value);
}

 

 

Como posso desenhar um código de barras com tamanho e resolução específicas?

[VB.NET]
Private Shared Function DrawBarcode(ByVal barcode As BarcodeType, _
                                    ByVal value As String, _
                                    ByVal resolution As Single, _ 
ByVal width As Single, ByVal height As Single, ByVal units As UnitOfMeasure) As Image
    Dim writer As New BarcodeWriter()
    writer.Settings.Barcode = barcode
    writer.Settings.Value = value
    writer.Settings.Resolution = resolution
    writer.Settings.SetWidth(width, units)
    writer.Settings.SetHeight(height, units)
    Return writer.GetBarcodeAsBitmap()
End Function

Private Shared Sub TestDrawBarcode(ByVal fileName As String)
    ' Draw barcode 6x2 cm in 600 DPI
    Dim barcodeImage As Image = DrawBarcode(BarcodeType.Code128, "TESTBARCODE", _
                                          600, 6, 2, UnitOfMeasure.Centimeters)
    barcodeImage.Save(fileName)
    barcodeImage.Dispose()
End Sub

[C#]
static Image DrawBarcode(BarcodeType barcode, string value, float resolution, 
                                                            float width, 
                                                            float height, 
                                                            UnitOfMeasure units)
{
    BarcodeWriter writer = new BarcodeWriter();            
    writer.Settings.Barcode = barcode;
    writer.Settings.Value = value;
    writer.Settings.Resolution = resolution;
    writer.Settings.SetWidth(width, units);
    writer.Settings.SetHeight(height, units);
    return writer.GetBarcodeAsBitmap();
}

static void TestDrawBarcode(string fileName)
{
    // Draw barcode 6x2 cm in 600 DPI
    Image barcodeImage = DrawBarcode(BarcodeType.Code128, "TESTBARCODE", 
                                  600, 6, 2, UnitOfMeasure.Centimeters);
    barcodeImage.Save(fileName);
    barcodeImage.Dispose();
}

 

 

O que compressões e color spaces de recursos de imagens de documentos PDF são suportados por este .NET leitor de código de barras?

As compressões suportadas:

  • ZIP
  • JPEG (DeviceGray, DeviceRGB)
  • CCITT3
  • CCITT4
  • LZW
  • Run Length

Os color spaces suportados:

  • DeviceGray
  • DeviceRGB
  • DeviceCMYK
  • Indexed