在 C# 中从 PDF 读取条形码

我们可以生成条形码并将其添加到 PDF 文档中,如我的 previous post 中所述。在某些情况下,我们可能需要以编程方式检测和读取嵌入到 PDF 文档中的条形码。它有助于解码 PDF 文档(如发票、收据或报告)中的条形码和二维码形式的嵌入信息。在本文中,我们将学习如何使用 C# 从 PDF 文档中读取条形码。

文章应涵盖以下主题:

  1. 从 PDF 读取条形码的 C# API
  2. 从 PDF 读取条形码
  3. 将 PDF 转换为图像并读取条形码
  4. 使用 PngDevice 从 PDF 读取条形码
  5. 从 PDF 中提取和读取条形码
  6. 从 PDF 中查找和读取条形码图像

C# API 从 PDF 读取条形码

我们将按照两步程序从 PDF 文档中读取条形码。首先,我们将使用 Aspose.PDF for .NET API 加载 PDF 文档,然后将其页面渲染为光栅图像。之后,我们将使用 Aspose.BarCode for .NET API 从渲染图像中读取条形码。

下载 API 的 DLL 或使用 NuGet 安装它。

PM> Install-Package Aspose.BarCode
PM> Install-Package Aspose.PDF

使用 C# 从 PDF 读取条形码

Aspose.PDF API 的 Document 类表示一个 PDF 文档。 API 的 ConvertToPNGMemoryStream() 函数将 PDF 页面渲染为 PNG 内存流。 Aspose.BarCode API 的 BarCodeReader 类使我们能够执行 ReadBarCodes 操作来检测条形码。 BarCodeResult 类存储检测到的条码信息,如条码类型、代码文本、区域等参数。

我们可以按照以下步骤读取嵌入在 PDF 文档任何页面上的条形码图像:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,遍历所有页面并将它们呈现到内存流中。
  3. 然后,使用流对象创建 BarCodeReader 类的实例。
  4. 之后,调用 ReadBarCodes() 方法获取 BarCodeResult 对象。
  5. 最后,显示条码信息。

以下代码示例展示了如何使用 C# 从 PDF 文档中读取条形码。

// 此代码示例演示如何使用 C# 从 PDF 文档中读取条形码。
// 文档的路径
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 从第 1 页开始处理所有 PDF 页面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 将 PDF 页面渲染到流
    MemoryStream ms = pdfDoc.Pages[i].ConvertToPNGMemoryStream();
    ms.Position = 0;

    // 从页面的渲染图像中识别条形码
    BarCodeReader reader = new BarCodeReader(ms);
    
    // 显示结果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}
Codetext found: Aspose.Barcode Pdf417 Example
Symbology: Pdf417
-------------------------------
Codetext found: Aspose.Barcode QR Example
Symbology: QR
-------------------------------
Codetext found: Aspose.Barcode DataMatrix Example
Symbology: DataMatrix
-------------------------------

下载带有条形码的输入 PDF 文档 在这篇博文中使用。

使用 C# 将 PDF 转换为图像并读取条形码

我们可以通过使用 PdfConverter 类将 PDF 页面转换为图像来从 PDF 文档中读取条形码。它允许将PDF文件的每一页转换为图像,然后我们将从转换后的图像中读取条形码信息。

我们可以按照以下步骤从转换后的 PDF 页面中读取条形码:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 PdfConverter 类的实例。
  3. (可选)设置呈现选项,例如 BarcodeOptimization。
  4. 然后,设置图像分辨率。
  5. 接下来,指定 StartPage 和 EndPage 以将一系列页面呈现为图像。
  6. 然后,调用 DoConvert() 方法将所选页面呈现为图像。
  7. 接下来,保存图像以循环播放。
  8. 然后,使用流对象创建 BarCodeReader 类的实例。
  9. 之后,调用 ReadBarCodes() 方法获取 BarCodeResult 对象。
  10. 最后,显示条码信息。

以下代码示例展示了如何使用 C# 将 PDF 页面转换为图像并读取条形码。

// 以下代码示例展示了如何使用 PDF Converter 将 PDF 页面转换为图像并使用 C# 读取条形码。
// 文档的路径
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 初始化 PdfConvertor
Aspose.Pdf.Facades.PdfConverter pdfConverter = new Aspose.Pdf.Facades.PdfConverter(pdfDoc);

// 设置条码优化
pdfConverter.RenderingOptions.BarcodeOptimization = true;

// 设置页面分辨率
// 300 dpi 是标准分辨率
pdfConverter.Resolution = new Aspose.Pdf.Devices.Resolution(300);

// 设置所有页面渲染成图片
pdfConverter.StartPage = 1; //starts from page 1
pdfConverter.EndPage = pdfConverter.Document.Pages.Count;

// 将选定的页面渲染到图像中
pdfConverter.DoConvert();
while (pdfConverter.HasNextImage())
{
    // 将当前页面渲染到内存流图像
    MemoryStream ms = new MemoryStream();
    pdfConverter.GetNextImage(ms, ImageFormat.Png);
    ms.Position = 0;

    // 从页面的渲染图像中识别条形码
    BarCodeReader reader = new BarCodeReader(ms);
    
    // 显示结果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}

在 C# 中使用 PngDevice 从 PDF 读取条形码

这是另一种类似于前一种的方法。唯一不同的是,在这个方法中,我们将使用 API 的 PngDevice 类将 PDF 文档的页面转换为图像。它允许将 PDF 文档的页面转换为 PNG 图像。

我们可以按照以下步骤将转换后的 PDF 页面中的条形码读取为 PNG 图像:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 PngDevice 类的实例。
  3. 然后,遍历所有页面并调用 Process() 方法以渲染到流中。
  4. 接下来,使用流对象创建 BarCodeReader 类的实例。
  5. 之后,调用 ReadBarCodes() 方法获取 BarCodeResult 对象。
  6. 最后,显示条码信息。

以下代码示例展示了如何使用 C# 将 PDF 页面转换为 PNG 图像并读取条形码。

// 以下代码示例展示了如何使用 PngDevice 将 PDF 页面转换为图像并使用 C# 读取条形码。
// 文档的路径
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 创建具有 300 dpi 标准分辨率的 PNG 设备
Aspose.Pdf.Devices.PngDevice pngDevice = new Aspose.Pdf.Devices.PngDevice(new Aspose.Pdf.Devices.Resolution(300));

// 从第 1 页开始处理所有 PDF 页面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 将 PDF 页面渲染到流
    MemoryStream ms = new MemoryStream();
    pngDevice.Process(pdfDoc.Pages[i], ms);
    ms.Position = 0;

    // 从页面的渲染图像中识别条形码
    BarCodeReader reader = new BarCodeReader(ms);

    // 显示结果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}

使用 C# 从 PDF 中提取和读取条形码

我们还可以使用 PdfExtractor 类识别嵌入在 PDF 页面上的条形码图像。它允许从 PDF 中提取图像,然后我们将从提取的图像中读取条形码信息。

我们可以按照以下步骤从提取的图像中读取条形码:

  1. 首先,创建 PdfExtractor 类的实例。
  2. 接下来,使用 BindPdf() 方法绑定输入的 PDF 文档。
  3. 然后,设置图像提取的页面范围。
  4. 接下来,调用 ExtractImage() 方法来提取图像。
  5. 然后,保存图像以循环播放。
  6. 接下来,使用流对象创建 BarCodeReader 类的实例。
  7. 之后,调用 ReadBarCodes() 方法获取 BarCodeResult 对象。
  8. 最后,显示条码信息。

以下代码示例展示了如何使用 C# 从 PDF 文档中提取和读取条形码图像。

// 以下代码示例展示了如何使用 PdfExtractor 将 PDF 页面转换为图像并使用 C# 读取条形码。
// 文档的路径
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 绑定 PDF 文档
Aspose.Pdf.Facades.PdfExtractor pdfExtractor = new Aspose.Pdf.Facades.PdfExtractor();
pdfExtractor.BindPdf(file);

// 设置图像提取的页面范围
pdfExtractor.StartPage = 1;
pdfExtractor.EndPage = 3;

// 提取图像
pdfExtractor.ExtractImage();

// 保存图像以循环播放
while (pdfExtractor.HasNextImage())
{
  // 将图像保存到流
  MemoryStream imageStream = new MemoryStream();
  pdfExtractor.GetNextImage(imageStream);
  imageStream.Position = 0;

  // 从上面的图像流中识别条形码
  BarCodeReader reader = new BarCodeReader(imageStream);
  foreach (BarCodeResult result in reader.ReadBarCodes())
  {
      Console.WriteLine("Codetext found: " + result.CodeText);
      Console.WriteLine("Symbology: " + result.CodeType);
      Console.WriteLine("-------------------------------");
  }
}

使用 C# 从 PDF 中查找和读取条形码图像

我们还可以使用 ImagePlacementAbsorber 类从 PDF 文档中查找和提取条形码图像。它表示图像放置对象的吸收体对象。它执行图像使用搜索,并通过 ImagePlacements 集合提供对搜索结果的访问。此方法有助于识别具有原始分辨率的条码。它可能无法正确识别矢量格式。

我们可以按照以下步骤从 PDF 文档中查找和读取条形码:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 ImagePlacementAbsorber 类的实例。
  3. 然后,在循环中为每个页面调用 Visit() 方法。
  4. 接下来,遍历 ImagePlacements 集合中找到的所有图像。
  5. 然后,将图像保存到内存流中。
  6. 接下来,使用流对象创建 BarCodeReader 类的实例。
  7. 之后,调用 ReadBarCodes() 方法获取 BarCodeResult 对象。
  8. 最后,显示条码信息。

以下代码示例展示了如何使用 C# 从 PDF 中查找和读取条形码图像。

// 此代码示例演示如何使用 ImagePlacementAbsorber 从 PDF 文档中读取条形码。
// 文档的路径
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 初始化 ImagePlacementAbsorber
Aspose.Pdf.ImagePlacementAbsorber imagePlacementAbsorber = new Aspose.Pdf.ImagePlacementAbsorber();

// 从第 1 页开始处理文档中的所有 PDF 页面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 访问页面创建图像提取器
    imagePlacementAbsorber.Visit(pdfDoc.Pages[i]);

    // 从 PDF 页面中提取所有图像
    foreach (Aspose.Pdf.ImagePlacement imagePlacement in imagePlacementAbsorber.ImagePlacements)
    {
        // 将 PDF 页面中的图像转换为流
        MemoryStream ms = new MemoryStream();
        imagePlacement.Save(ms, ImageFormat.Png);
        ms.Position = 0;

        // 从提取的页面图像中识别条形码
        BarCodeReader reader = new BarCodeReader(ms);

        // 显示结果
        foreach (BarCodeResult result in reader.ReadBarCodes())
        {
            Console.WriteLine("Codetext found: " + result.CodeText);
            Console.WriteLine("Symbology: " + result.CodeType);
            Console.WriteLine("-------------------------------");
        }
    }
}

获得免费许可证

您可以获得免费的临时许可证 试用这些库而不受评估限制。

结论

在本文中,我们学习了如何使用 C# 从 PDF 文档中读取条形码。我们还看到了从 PDF 文档中提取图像并以编程方式解码嵌入条形码的各种方法和方法。此外,您可以使用 Aspose.BarCode 文档Aspose.PDF 文档 了解有关 API 的更多信息。如有任何歧义,请随时在我们的 论坛 上与我们联系。

也可以看看