VintaSoft Barcode .NET SDK 16.0: Documentation for .NET developer
In This Topic
Read barcodes from PDF document
In This Topic
PDF document can store barcode in raster form in image-resource of PDF document. Also PDF document can store barcode in vector form in vector content of PDF document.

Recognize barcodes in image-resource of PDF document

For recognizing barcode in PDF image-resource is necessary to extact image-resource from PDF document and recognize barcodes in extracted image-resource.

VintaSoft Barcode .NET SDK has PdfImageViewer class, which allows to extract image-resources from PDF document. Class can extract image-resource from PDF document only if image-resource is compressed with ZIP, JPEG (RGB and Gray only), CCITT3, CCITT4, LZW, Run Length compression and has the DeviceGray, DeviceRGB, DeviceCMYK or Indexed color space.

VintaSoft Imaging .NET SDK with Plug-ins allows to extract PDF image-resource with any compression and any color space.


Here is C#/VB.NET code that demonstrates how to read barcodes from image resources of PDF document using PdfImageViewer class of VintaSoft Barcode .NET SDK:
/// <summary>
/// Reads barcodes from image-resources of PDF document.
/// </summary>
/// <param name="fileName">A path to a PDF document.</param>
/// <param name="barcodeTypes">The types of barcodes, which must be recognized.</param>
static void ReadBarcodesFromPdfDocument(string fileName, Vintasoft.Barcode.BarcodeType barcodeTypes)
{
    // create the PdfImageViewer object and open PDF document
    using (Vintasoft.Barcode.PdfImageViewer pdfImageViewer = new Vintasoft.Barcode.PdfImageViewer(fileName))
    {
        // create the barcode reader
        using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
        {
            // set barcode reader settings
            reader.Settings.ScanBarcodeTypes = barcodeTypes;

            // for each page of PDF document
            for (int i = 0; i < pdfImageViewer.PageCount; i++)
            {
                // get names of all image resources of page i
                string[] imageNames = pdfImageViewer.GetImageNames(i);
                // for each image resource of page i
                for (int k = 0; k < imageNames.Length; k++)
                {
                    System.Console.WriteLine(string.Format("Page {0}, image {1}: ", i, imageNames[k]));
                    Vintasoft.Imaging.VintasoftBitmap bitmap;
                    // get image of image resource
                    try
                    {
                        bitmap = pdfImageViewer.GetImage(i, imageNames[k]);
                    }
                    catch (System.Exception ex)
                    {
                        // not supported image format
                        System.Console.WriteLine(ex.Message);
                        continue;
                    }

                    // read barcodes from image
                    Vintasoft.Barcode.IBarcodeInfo[] barcodesInfo = reader.ReadBarcodes(bitmap);

                    // free image resource
                    bitmap.Dispose();

                    // output information about barcodes
                    if (barcodesInfo.Length == 0)
                    {
                        System.Console.WriteLine("No barcodes found.");
                    }
                    else
                    {
                        for (int j = 0; j < barcodesInfo.Length; j++)
                            System.Console.WriteLine(string.Format("[{0}] {1}", barcodesInfo[j].BarcodeType,
                                                                         barcodesInfo[j].Value));
                    }
                }
            }
        }
    }
}
''' <summary>
''' Reads barcodes from image-resources of PDF document.
''' </summary>
''' <param name="fileName">A path to a PDF document.</param>
''' <param name="barcodeTypes">The types of barcodes, which must be recognized.</param>
Private Shared Sub ReadBarcodesFromPdfDocument(fileName As String, barcodeTypes As Vintasoft.Barcode.BarcodeType)
    ' create the PdfImageViewer object and open PDF document
    Using pdfImageViewer As New Vintasoft.Barcode.PdfImageViewer(fileName)
        ' create the barcode reader
        Using reader As New Vintasoft.Barcode.BarcodeReader()
            ' set barcode reader settings
            reader.Settings.ScanBarcodeTypes = barcodeTypes

            ' for each page of PDF document
            For i As Integer = 0 To pdfImageViewer.PageCount - 1
                ' get names of all image resources of page i
                Dim imageNames As String() = pdfImageViewer.GetImageNames(i)
                ' for each image resource of page i
                For k As Integer = 0 To imageNames.Length - 1
                    System.Console.WriteLine(String.Format("Page {0}, image {1}: ", i, imageNames(k)))
                    Dim bitmap As Vintasoft.Imaging.VintasoftBitmap
                    ' get image of image resource
                    Try
                        bitmap = pdfImageViewer.GetImage(i, imageNames(k))
                    Catch ex As System.Exception
                        ' not supported image format
                        System.Console.WriteLine(ex.Message)
                        Continue For
                    End Try

                    ' read barcodes from image
                    Dim barcodesInfo As Vintasoft.Barcode.IBarcodeInfo() = reader.ReadBarcodes(bitmap)

                    ' free image resource
                    bitmap.Dispose()

                    ' output information about barcodes
                    If barcodesInfo.Length = 0 Then
                        System.Console.WriteLine("No barcodes found.")
                    Else
                        For j As Integer = 0 To barcodesInfo.Length - 1
                            System.Console.WriteLine(String.Format("[{0}] {1}", barcodesInfo(j).BarcodeType, barcodesInfo(j).Value))
                        Next
                    End If
                Next
            Next
        End Using
    End Using
End Sub



Here is C#/VB.NET code that demonstrates how to read barcodes from image resources of PDF document using VintaSoft Imaging .NET SDK:
/// <summary>
/// Reads barcodes from image-resources of PDF document.
/// </summary>
/// <param name="pdfFilename">A path to a PDF document.</param>
public static void ReadBarcodesFromPdfDocumentResources(string pdfFilename)
{
    // open PDF document
    using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
    {
        // for each PDF page
        for (int i = 0; i < document.Pages.Count; i++)
        {
            // get image resources of PDF page
            Vintasoft.Imaging.Pdf.Tree.PdfImageResource[] imageResources = document.Pages[i].GetImages();

            // foreach image resources
            for (int j = 0; j < imageResources.Length; j++)
            {
                // get image resource
                using (Vintasoft.Imaging.VintasoftImage imageResource = imageResources[j].GetImage())
                {
                    // get image of image resource
                    using (Vintasoft.Imaging.VintasoftBitmap bitmap = imageResource.GetAsVintasoftBitmap())
                    {
                        System.Console.WriteLine(string.Format("[Page {0}, resource {1}]", i + 1, j + 1));
                        // read barcodes from image
                        ReadBarcodesFromImage(bitmap);
                    }
                }
            }
        }
    }
}

/// <summary>
/// Reads barcodes from an image.
/// </summary>
/// <param name="barcodeImage">An image with barcodes.</param>
public static void ReadBarcodesFromImage(Vintasoft.Imaging.VintasoftBitmap barcodeImage)
{
    // create barcode reader
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // specify that reader must search for Code39, Code39Extended,
        // Code128, SSCC18 and DataMatrix barcodes
        reader.Settings.ScanBarcodeTypes =
            Vintasoft.Barcode.BarcodeType.Code39 |
            Vintasoft.Barcode.BarcodeType.Code128 |
            Vintasoft.Barcode.BarcodeType.DataMatrix;
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.Code39Extended);
        reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.SSCC18);

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

        // if barcodes are not detected
        if (infos.Length == 0)
        {
            System.Console.WriteLine("No barcodes found.");
        }
        // if barcodes are detected
        else
        {
            // get information about extracted barcodes

            System.Console.WriteLine(string.Format("{0} barcodes found:", infos.Length));
            System.Console.WriteLine();
            for (int i = 0; i < infos.Length; i++)
            {
                Vintasoft.Barcode.IBarcodeInfo info = infos[i];
                System.Console.WriteLine(string.Format("[{0}:{1}]", i + 1, info.BarcodeType));
                System.Console.WriteLine(string.Format("Value:      {0}", info.Value));
                System.Console.WriteLine(string.Format("Region:     {0}", info.Region));
                System.Console.WriteLine();
            }
        }
    }
}
''' <summary>
''' Reads barcodes from image-resources of PDF document.
''' </summary>
''' <param name="pdfFilename">A path to a PDF document.</param>
Public Shared Sub ReadBarcodesFromPdfDocumentResources(pdfFilename As String)
    ' open PDF document
    Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
        ' for each PDF page
        For i As Integer = 0 To document.Pages.Count - 1
            ' get image resources of PDF page
            Dim imageResources As Vintasoft.Imaging.Pdf.Tree.PdfImageResource() = document.Pages(i).GetImages()

            ' foreach image resources
            For j As Integer = 0 To imageResources.Length - 1
                ' get image resource
                Using imageResource As Vintasoft.Imaging.VintasoftImage = imageResources(j).GetImage()
                    ' get image of image resource
                    Using bitmap As Vintasoft.Imaging.VintasoftBitmap = imageResource.GetAsVintasoftBitmap()
                        System.Console.WriteLine(String.Format("[Page {0}, resource {1}]", i + 1, j + 1))
                        ' read barcodes from image
                        ReadBarcodesFromImage(bitmap)
                    End Using
                End Using
            Next
        Next
    End Using
End Sub

''' <summary>
''' Reads barcodes from an image.
''' </summary>
''' <param name="barcodeImage">An image with barcodes.</param>
Public Shared Sub ReadBarcodesFromImage(barcodeImage As Vintasoft.Imaging.VintasoftBitmap)
    ' create barcode reader
    Using reader As New Vintasoft.Barcode.BarcodeReader()
        ' specify that reader must search for Code39, Code39Extended,
        ' Code128, SSCC18 and DataMatrix barcodes
        reader.Settings.ScanBarcodeTypes = _
            Vintasoft.Barcode.BarcodeType.Code39 Or _
            Vintasoft.Barcode.BarcodeType.Code128 Or _
            Vintasoft.Barcode.BarcodeType.DataMatrix
        reader.Settings.ScanBarcodeSubsets.Add( _
            Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.Code39Extended)
        reader.Settings.ScanBarcodeSubsets.Add( _
            Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.SSCC18)

        ' read barcodes from image
        Dim infos As Vintasoft.Barcode.IBarcodeInfo() = reader.ReadBarcodes(barcodeImage)

        ' if barcodes are not detected
        If infos.Length = 0 Then
            System.Console.WriteLine("No barcodes found.")
        Else
            ' if barcodes are detected
            ' get information about extracted barcodes

            System.Console.WriteLine(String.Format("{0} barcodes found:", infos.Length))
            System.Console.WriteLine()
            For i As Integer = 0 To infos.Length - 1
                Dim info As Vintasoft.Barcode.IBarcodeInfo = infos(i)
                System.Console.WriteLine(String.Format("[{0}:{1}]", i + 1, info.BarcodeType))
                System.Console.WriteLine(String.Format("Value:      {0}", info.Value))
                System.Console.WriteLine(String.Format("Region:     {0}", info.Region))
                System.Console.WriteLine()
            Next
        End If
    End Using
End Sub



Recognize barcodes in rendered image of PDF page

For recognizing barcode in vector content is necessary to render PDF page and recognize barcodes in rendered image.

PDF page can be rendered using VintaSoft Imaging .NET SDK with Plug-ins or any other third party software.


Here is C#/VB.NET code that demonstrates how to read barcodes from rasterized page of PDF document using VintaSoft Imaging .NET SDK:
/// <summary>
/// Reads barcodes from a vector PDF document.
/// </summary>
/// <param name="pdfFilename">A path to a PDF document.</param>
public static void ReadBarcodesFromVectorPDFDocument(string pdfFilename)
{
    // create the image collection
    using (Vintasoft.Imaging.ImageCollection pdfPages = new Vintasoft.Imaging.ImageCollection())
    {
        // add PDF document to the image collection
        pdfPages.Add(pdfFilename);

        // set the rendering settings to 200DPI, if necessary
        pdfPages.SetRenderingSettings(
            new Vintasoft.Imaging.Codecs.Decoders.RenderingSettings(
                new Vintasoft.Imaging.Resolution(200, 200)));

        // for each PDF page
        foreach (Vintasoft.Imaging.VintasoftImage image in pdfPages)
        {
            // get page image
            using (Vintasoft.Imaging.VintasoftBitmap pageImage = image.GetAsVintasoftBitmap())
            {
                // read barcodes from image
                ReadBarcodesFromImage(pageImage);
            }
        }

        // clear image collection
        pdfPages.ClearAndDisposeItems();
    }
}

/// <summary>
/// Reads barcodes from an image.
/// </summary>
/// <param name="barcodeImage">An image with barcodes.</param>
public static void ReadBarcodesFromImage(Vintasoft.Imaging.VintasoftBitmap barcodeImage)
{
    // create barcode reader
    Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader();

    // specify that reader must search for Code39, Code39Extended,
    // Code128, SSCC18 and DataMatrix barcodes
    reader.Settings.ScanBarcodeTypes =
        Vintasoft.Barcode.BarcodeType.Code39 |
        Vintasoft.Barcode.BarcodeType.Code128 |
        Vintasoft.Barcode.BarcodeType.DataMatrix;
    reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.Code39Extended);
    reader.Settings.ScanBarcodeSubsets.Add(Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.SSCC18);

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

    // if barcodes are not detected
    if (infos.Length == 0)
    {
        System.Console.WriteLine("No barcodes found.");
    }
    // if barcodes are detected
    else
    {
        // get information about extracted barcodes

        System.Console.WriteLine(string.Format("{0} barcodes found:", infos.Length));
        System.Console.WriteLine();
        for (int i = 0; i < infos.Length; i++)
        {
            Vintasoft.Barcode.IBarcodeInfo info = infos[i];
            System.Console.WriteLine(string.Format("[{0}:{1}]", i + 1, info.BarcodeType));
            System.Console.WriteLine(string.Format("Value:      {0}", info.Value));
            System.Console.WriteLine(string.Format("Region:     {0}", info.Region));
            System.Console.WriteLine();
        }
    }
}
''' <summary>
''' Reads barcodes from a vector PDF document.
''' </summary>
''' <param name="pdfFilename">A path to a PDF document.</param>
Public Shared Sub ReadBarcodesFromVectorPDFDocument(pdfFilename As String)
    ' create the image collection
    Using pdfPages As New Vintasoft.Imaging.ImageCollection()
        ' add PDF document to the image collection
        pdfPages.Add(pdfFilename)

        ' set the rendering settings to 200DPI, if necessary
        pdfPages.SetRenderingSettings( _
            New Vintasoft.Imaging.Codecs.Decoders.RenderingSettings( _
                New Vintasoft.Imaging.Resolution(200, 200)))

        ' for each PDF page
        For Each image As Vintasoft.Imaging.VintasoftImage In pdfPages
            ' get page image
            Using pageImage As Vintasoft.Imaging.VintasoftBitmap = image.GetAsVintasoftBitmap()
                ' read barcodes from image
                ReadBarcodesFromImage(pageImage)
            End Using
        Next

        ' clear image collection
        pdfPages.ClearAndDisposeItems()
    End Using
End Sub

''' <summary>
''' Reads barcodes from an image.
''' </summary>
''' <param name="barcodeImage">An image with barcodes.</param>
Public Shared Sub ReadBarcodesFromImage(barcodeImage As Vintasoft.Imaging.VintasoftBitmap)
    ' create barcode reader
    Dim reader As New Vintasoft.Barcode.BarcodeReader()

    ' specify that reader must search for Code39, Code39Extended,
    ' Code128, SSCC18 and DataMatrix barcodes
    reader.Settings.ScanBarcodeTypes = _
        Vintasoft.Barcode.BarcodeType.Code39 Or _
        Vintasoft.Barcode.BarcodeType.Code128 Or _
        Vintasoft.Barcode.BarcodeType.DataMatrix
    reader.Settings.ScanBarcodeSubsets.Add( _
        Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.Code39Extended)
    reader.Settings.ScanBarcodeSubsets.Add( _
        Vintasoft.Barcode.SymbologySubsets.BarcodeSymbologySubsets.SSCC18)

    ' read barcodes from image
    Dim infos As Vintasoft.Barcode.IBarcodeInfo() = reader.ReadBarcodes(barcodeImage)

    ' if barcodes are not detected
    If infos.Length = 0 Then
        System.Console.WriteLine("No barcodes found.")
    Else
        ' if barcodes are detected
        ' get information about extracted barcodes

        System.Console.WriteLine(String.Format("{0} barcodes found:", infos.Length))
        System.Console.WriteLine()
        For i As Integer = 0 To infos.Length - 1
            Dim info As Vintasoft.Barcode.IBarcodeInfo = infos(i)
            System.Console.WriteLine(String.Format("[{0}:{1}]", i + 1, info.BarcodeType))
            System.Console.WriteLine(String.Format("Value:      {0}", info.Value))
            System.Console.WriteLine(String.Format("Region:     {0}", info.Region))
            System.Console.WriteLine()
        Next
    End If
End Sub