считывание штрих-кода с помощью Aspose - PullRequest
0 голосов
/ 28 октября 2019

У меня есть файл 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.)

Приведенный выше код работает до тех пор, пока качество штрих-кода составляетхороший. но если качество плохое, он не может распознать свой штрих-код.

Образец файла

Какой другой метод оптимизации можно использовать здесь?

1 Ответ

0 голосов
/ 29 октября 2019

Во-первых, какую версию Aspose.PDF и Aspose.Barcode вы используете? Поскольку я попробовал файл pdf на последнем штрих-коде Aspose.B (версия для разработки), он распознается хорошо.

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 будет добавлен в Aspose.Barcode в 2020Q1.


Текущий обходной путь для этого: если вы знаете возможную область штрих-кода, вы можете установить область распознавания штрих-кода с помощью SetBarCodeImage (значение Bitmap, область Rectangle) иэто помогает текущему градиентному детектору обнаруживать такие шумные области.

...