我有一个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页。第二页的条形码来自原始PDF。)
上面的代码只要条形码质量良好就行。但如果质量不好,则无法识别其条形码。
这里可以使用什么其他优化技术?
首先,您使用什么版本的Aspose.PDF和Aspose.Barcode?因为我在最后一个Aspose.Barcode(开发版本)上尝试了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条形码区域检测器将在2020Q1中添加到Aspose.Barcode。
当前的解决方法:如果您知道可能的条形码区域,则可以使用SetBarCodeImage(位图值,矩形区域)设置条形码识别区域,这有助于当前的梯度检测器检测到如此嘈杂的区域。