首页 > 解决方案 > 使用 Aspose 读取条形码

问题描述

我有一个包含条形码页面的 PDF 文件。条形码最初是使用 DecodeType.Code128 创建的,
我使用 ASPOSE.PDF 和 Aspose.Barcode 来查找条形码和页码。

        var barcodePageNumbers = new List<int>();
        var currentPageNumber = 0;

        using (PdfConverter converter = new PdfConverter())
        {
            converter.BindPdf(sourcefilePath);
            converter.RenderingOptions.BarcodeOptimization = true;
            converter.DoConvert();
            while (converter.HasNextImage())
            {
                currentPageNumber++;
                using (var ms = new MemoryStream())
                {
                    converter.GetNextImage(ms);
                    ms.Seek(0L, SeekOrigin.Begin);
                    BarCodeReader reader = new BarCodeReader(ms, DecodeType.Code128);
                    while (reader.Read())
                    {
                        var text = reader.GetCodeText();
                        if (text == _barcodeTextToMatch)
                        {
                            barcodePageNumbers.Add(currentPageNumber);
                        }
                    }
                }
            }
        }

我们时不时会收到质量差的条形码 pdf,就像随附的那样。(注意附件的 PDF 有 3 页。我使用工具创建了第 1 页和第 3 页。带有条形码的第 2 页来自原始 PDF。)

只要条码质量好,上面的代码就可以工作。但如果质量不好,则无法识别其条形码。

示例文件

这里可以使用哪些其他优化技术?

标签: asposeaspose.pdfaspose.barcode

解决方案


首先,您使用的是什么版本的 Aspose.PDF 和 Aspose.Barcode?因为我在最后一个 Aspose.Barcode(develop version) 上尝试了 pdf 文件,所以它被很好地识别。

string lFileName = @"d:\save\rec\merged.pdf";
var currentPageNumber = 0;
var barcodePageNumbers = new List<int>();

using (Aspose.Pdf.Facades.PdfConverter converter = new Aspose.Pdf.Facades.PdfConverter())
{
    converter.BindPdf(lFileName);
    converter.RenderingOptions.BarcodeOptimization = true;
    converter.DoConvert();
    while (converter.HasNextImage())
    {
        currentPageNumber++;
        using (var ms = new MemoryStream())
        {
            converter.GetNextImage(ms);
            ms.Seek(0L, SeekOrigin.Begin);
            BarCodeReader reader = new BarCodeReader(ms, DecodeType.Code128);
            while (reader.Read())
            {
                var text = reader.GetCodeText();
                barcodePageNumbers.Add(currentPageNumber);
            }
        }
    }
}

MessageBox.Show(string.Join(";", barcodePageNumbers.ToArray()));

以下是从 pdf 文件中提取的图像: page_2.tiff - 完整图像 page2_cut.png - 剪切图像。两者都得到了很好的认可。


您可以在图像上看到的图像失真是盐和纸张的问题。我们在大多数情况下在识别模块中解决了这个问题,但是目前的条码位置检测模块可以将盐分和纸张失真如此之强的条码标记为非条码区域。目前我们没有对此进行优化,但我们正在开发 SVM(支持向量机)检测器,它可以更好地检测条形码区域,并且还可以选择优化这些问题的识别。SVM 条码区域检测器将在 2020 年第一季度添加到 Aspose.Barcode。


当前的解决方法:如果您知道可能的条形码区域,您可以使用 SetBarCodeImage(Bitmap value, Rectangle area) 设置条形码识别区域,这有助于当前的梯度检测器检测到如此嘈杂的区域。


推荐阅读