65.9K
CodeProject 正在变化。 阅读更多。
Home

识别 PDF 和 TIFF 文档中的条形码

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2009 年 10 月 6 日

CPOL

3分钟阅读

viewsIcon

54308

多页商业文档和报告有时会使用条形码来帮助路由和索引。使用 DotImage .NET PDF 阅读器、.NET TIFF 编解码器和条形码识别 for .NET 插件,可以轻松读取条形码并使用它们来自动化工作流程或在存储库中查找这些文档。

多页商业文档和报告有时会使用条形码来帮助自动化路由和索引。使用 DotImage .NET PDF 阅读器.NET TIFF 编解码器条形码识别 for .NET 插件,可以轻松读取这些条形码中编码的数据,并使用它们来自动化工作流程或在存储库中查找这些文档。

从 PDF 读取页面

通常,PDF 中的页面要么是图像页面(可能来自扫描仪),要么由各种元素(文本、绘图、图像等)组成。如果是图像页面,我们希望以存储的分辨率从 PDF 中提取该页面。如果是组合页面,我们需要将页面栅格化为单个图像,并确保以高分辨率执行此操作,以保持条形码的质量。

这是一个 C# 函数,可以以最佳分辨率从 PDF 中检索页面以进行条形码读取

        private AtalaImage GetPdfPage(Stream stream, int pageNum)
        {
            AtalaImage img = null;            

            // check to see if this page is an image
            using (Document pdfDoc = new Document(stream))
            {
                Page pdfPage = pdfDoc.Pages[pageNum];
                if (pdfPage.SingleImageOnly)
                {
                    // if it's an image, extract it from the PDF at its
                    // stored resolution
                    img = pdfPage.ExtractImages()[0].Image;
                }
            }

            // if the page is not an image, rasterize it at high enough
            // resolution to read the barcodes
            if (img == null)
            {   
                PdfDecoder pdfReader = new PdfDecoder();
                pdfReader.Resolution = 300;
                stream.Position = 0;
                img = pdfReader.Read(stream, pageNum, null);
            }
            return img;
        }

这是 VB.NET 中的函数

    Private Function GetPdfPage(ByVal stream As Stream, 
                ByVal pageNum As Integer) As AtalaImage
        Dim img As AtalaImage = Nothing

        ' check to see if this page is an image
        Using pdfDoc As New Document(stream)
            Dim pdfPage As Page = pdfDoc.Pages(pageNum)
            If pdfPage.SingleImageOnly Then
                ' if it's an image, extract it from the PDF at its
                ' stored resolution
                img = pdfPage.ExtractImages()(0).Image
            End If
        End Using

        ' if the page is not an image, rasterize it at high enough
        ' resolution to read the barcodes
        If img Is Nothing Then
            Dim pdfReader As New PdfDecoder()
            pdfReader.Resolution = 300
            stream.Position = 0
            img = pdfReader.Read(stream, pageNum, Nothing)
        End If
        Return img
    End Function

从 TIFF 读取页面

从 TIFF 读取页面更容易,因为它已经以特定分辨率栅格化。在 DotImage 中,我们只需要构造一个 AtalaImage 对象,传递带有编码图像的流和页码。顺便说一句,这适用于任何栅格图像类型,而不仅仅是 TIFF。此 C# 函数检测文件是否为 PDF,如果是,则调用之前的函数。如果不是 PDF,它只需读取页面并返回它。

        private AtalaImage GetDocumentPage(string file, int pageNum)
        {
            AtalaImage img = null;
            PdfDecoder pdfReader = new PdfDecoder();            
            using (Stream stream = File.OpenRead(file))
            {
                if (pdfReader.IsValidFormat(stream))
                {
                    stream.Position = 0;
                    img = GetPdfPage(stream, pageNum);
                }
                else
                {
                    stream.Position = 0;
                    img = new AtalaImage(stream, pageNum, null);
                }
            }
            return img;
        }

这是 VB.NET 中的函数

    Private Function GetDocumentPage(ByVal fileName As String, 
                ByVal pageNum As Integer) As AtalaImage

        Dim img As AtalaImage = Nothing
        Dim pdfReader As New PdfDecoder()
        Using stream As Stream = File.OpenRead(fileName)
            If pdfReader.IsValidFormat(stream) Then
                stream.Position = 0
                img = GetPdfPage(stream, pageNum)
            Else
                stream.Position = 0
                img = New AtalaImage(stream, pageNum, Nothing)
            End If
        End Using
        Return img
    End Function

从图像中读取条形码

一旦你有了 AtalaImage,DotImage 就可以轻松地从中读取任何条形码。这是 C# 代码

        private BarCode[] ReadBarcodesFromPage(AtalaImage img)
        {
            BarCodeReader reader = new BarCodeReader(img);
            ReadOpts opts = new ReadOpts();
            opts.Symbology = Symbologies.All;
            return reader.ReadBars(opts);
        }

这是 VB.NET 中的代码

    Private Function ReadBarcodesFromPage(ByVal img As AtalaImage)
                 As BarCode()
        Dim reader As New BarCodeReader(img)
        Dim opts As New ReadOpts()
        opts.Symbology = Symbologies.All
        Return reader.ReadBars(opts)
    End Function

ReadOpts 类允许你以多种方式控制条形码读取。你可以指定要查找的条形码的类型(符号体系)、它应该在页面上显示的方向、你期望存在的条形码数量。任何这些选项都可以通过让阅读器减少工作来加速识别。此代码只是尝试在任何方向上查找任何条形码。

处理条形码

一旦你有了 BarCode 对象数组,你只需要循环遍历它们并从中获取识别的文本。这是 C# 中的代码

            // Get the page and read the barcodes
            AtalaImage img = GetDocumentPage(fileName, pageNum);            
            BarCode[] bars = ReadBarcodesFromPage(img);            

            // show the barcodes in the list
            foreach (BarCode bar in bars)
            {
                Console.WriteLine(bar.DataString);
            }

这是 VB.NET 中的代码

        ' Get the page and read the barcodes
        Dim img As AtalaImage = GetDocumentPage(fileName, pageNum)
        Dim bars As BarCode() = ReadBarcodesFromPage(img)

        ' show the barcodes in the list
        For Each bar As BarCode In bars
            Console.WriteLine(bar.DataString)
        Next

DotImage

DotImage .NET 图像 SDK 包含读取文档图像格式以及识别其中的条形码所需的一切。下载 30 天评估版

Archives(归档)

© . All rights reserved.